Author: gsim
Date: Mon Mar  3 09:55:21 2008
New Revision: 633206

URL: http://svn.apache.org/viewvc?rev=633206&view=rev
Log:
Fixed consolidation of ranges and added further validation to tests.


Modified:
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceSet.cpp
    incubator/qpid/trunk/qpid/cpp/src/tests/SequenceSet.cpp

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceSet.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceSet.cpp?rev=633206&r1=633205&r2=633206&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceSet.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceSet.cpp Mon Mar  3 
09:55:21 2008
@@ -73,14 +73,18 @@
         add(end, start);
     } else {
         Range r(start, end);
-        bool merged = false;
+        Ranges::iterator merged = ranges.end();
         Ranges::iterator i = ranges.begin();
-        while (i != ranges.end() && !merged && i->start < start) {
-            if (i->merge(r)) merged = true;            
+        while (i != ranges.end() && merged == ranges.end() && i->start < 
start) {
+            if (i->merge(r)) merged = i;            
             i++;
         }
-        if (!merged) {
-            ranges.insert(i, r);
+        if (merged == ranges.end()) {
+            i = merged = ranges.insert(i, r);
+            i++;
+        }
+        while (i != ranges.end() && merged->merge(*i)) {
+            i = ranges.erase(i);
         }
     }
 }
@@ -190,7 +194,7 @@
 
 bool SequenceSet::Range::mergeable(const SequenceNumber& s) const
 { 
-    if (contains(s) || start - s == 1) {
+    if (contains(s) || start - s == 1 || s - end == 1) {
         return true;
     } else {
         return false;

Modified: incubator/qpid/trunk/qpid/cpp/src/tests/SequenceSet.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/SequenceSet.cpp?rev=633206&r1=633205&r2=633206&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/SequenceSet.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/SequenceSet.cpp Mon Mar  3 09:55:21 
2008
@@ -23,23 +23,55 @@
 
 using namespace qpid::framing;
 
+struct RangeExpectations
+{
+    typedef std::pair<SequenceNumber, SequenceNumber> Range;
+    typedef std::list<Range> Ranges;
+
+    Ranges ranges;
+
+    RangeExpectations& expect(const SequenceNumber& start, const 
SequenceNumber& end) {
+        ranges.push_back(Range(start, end));
+        return *this;
+    }
+
+    void operator()(const SequenceNumber& start, const SequenceNumber& end) {
+        BOOST_CHECK(!ranges.empty());
+        if (!ranges.empty()) {
+            BOOST_CHECK_EQUAL(start, ranges.front().first);
+            BOOST_CHECK_EQUAL(end, ranges.front().second);
+            ranges.pop_front();
+        }
+    }
+
+    void check(SequenceSet& set) {
+        set.for_each(*this);
+        BOOST_CHECK(ranges.empty());
+    }
+};
+
 BOOST_AUTO_TEST_CASE(testAdd) {
     SequenceSet s;
     s.add(2);
     s.add(8,8);
     s.add(3,5);
 
-    for (uint32_t i = 0; i <= 1; i++) //0, 1
+    for (uint32_t i = 0; i <= 1; i++)
         BOOST_CHECK(!s.contains(i));
 
-    for (uint32_t i = 2; i <= 5; i++) //2, 3, 4 & 5
+    for (uint32_t i = 2; i <= 5; i++)
         BOOST_CHECK(s.contains(i));
 
-    for (uint32_t i = 0; i <= 1; i++) //6, 7
+    for (uint32_t i = 6; i <= 7; i++)
         BOOST_CHECK(!s.contains(i));
 
-    BOOST_CHECK(s.contains(8));//8
+    BOOST_CHECK(s.contains(8));
+
+    for (uint32_t i = 9; i <= 10; i++)
+        BOOST_CHECK(!s.contains(i));
 
+    RangeExpectations().expect(2, 5).expect(8, 8).check(s);
+    
     SequenceSet t;
     t.add(6, 10);
     t.add(s);
@@ -49,6 +81,17 @@
 
     for (uint32_t i = 2; i <= 10; i++)
         BOOST_CHECK(t.contains(i));
+
+    RangeExpectations().expect(2, 10).check(t);
+}
+
+BOOST_AUTO_TEST_CASE(testAdd2) {
+    SequenceSet s;
+    s.add(7,6);
+    s.add(4,4);
+    s.add(3,10);    
+    s.add(2);
+    RangeExpectations().expect(2, 10).check(s);
 }
 
 BOOST_AUTO_TEST_CASE(testRemove) {
@@ -86,6 +129,9 @@
         BOOST_CHECK(!s.contains(i));
         BOOST_CHECK(t.contains(i));
     }
+
+    RangeExpectations().expect(0, 2).expect(6, 6).expect(8, 8).check(s);
+    RangeExpectations().expect(3, 5).expect(7, 7).expect(9, 10).check(t);
 }
 
 QPID_AUTO_TEST_SUITE_END()


Reply via email to