Author: gsim
Date: Thu Jul 19 03:59:58 2007
New Revision: 557570

URL: http://svn.apache.org/viewvc?view=rev&rev=557570
Log:
Added difference operator to the sequence number


Modified:
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumber.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumber.h
    incubator/qpid/trunk/qpid/cpp/src/tests/SequenceNumberTest.cpp

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumber.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumber.cpp?view=diff&rev=557570&r1=557569&r2=557570
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumber.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumber.cpp Thu Jul 
19 03:59:58 2007
@@ -60,3 +60,14 @@
 {
     return other < *this;
 }
+
+namespace qpid {
+namespace framing {
+
+int32_t operator-(const SequenceNumber& a, const SequenceNumber& b)
+{
+    int32_t result = a.value - b.value;    
+    return result;
+}
+
+}}

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumber.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumber.h?view=diff&rev=557570&r1=557569&r2=557570
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumber.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumber.h Thu Jul 19 
03:59:58 2007
@@ -32,6 +32,7 @@
 class SequenceNumber
 {
     int32_t value;
+
  public:
     SequenceNumber();
     SequenceNumber(uint32_t v);
@@ -43,6 +44,8 @@
     bool operator<(const SequenceNumber& other) const;
     bool operator>(const SequenceNumber& other) const;
     uint32_t getValue() const { return (uint32_t) value; }
+
+    friend int32_t operator-(const SequenceNumber& a, const SequenceNumber& b);
 };    
 
 }} // namespace qpid::framing

Modified: incubator/qpid/trunk/qpid/cpp/src/tests/SequenceNumberTest.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/SequenceNumberTest.cpp?view=diff&rev=557570&r1=557569&r2=557570
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/SequenceNumberTest.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/SequenceNumberTest.cpp Thu Jul 19 
03:59:58 2007
@@ -31,6 +31,9 @@
     CPPUNIT_TEST(testIncrementPostfix);
     CPPUNIT_TEST(testIncrementPrefix);
     CPPUNIT_TEST(testWrapAround);
+    CPPUNIT_TEST(testDifference);
+    CPPUNIT_TEST(testDifferenceWithWrapAround1);
+    CPPUNIT_TEST(testDifferenceWithWrapAround2);
     CPPUNIT_TEST_SUITE_END();
 
   public:
@@ -83,23 +86,84 @@
         const uint32_t max = 0xFFFFFFFF;
         SequenceNumber a(max - 10);
         SequenceNumber b(max - 5);
+        checkComparison(a, b, 5);
 
+        const uint32_t max_signed = 0x7FFFFFFF;
+        SequenceNumber c(max_signed - 10);
+        SequenceNumber d(max_signed - 5);
+        checkComparison(c, d, 5);
+    }
+
+    void checkComparison(SequenceNumber& a, SequenceNumber& b, int gap)
+    {
         //increment until b wraps around
-        for (int i = 0; i < 6; i++) {
+        for (int i = 0; i < (gap + 2); i++) {
             CPPUNIT_ASSERT(++a < ++b);//test prefix
         }
-        //verify we have wrapped around
-        CPPUNIT_ASSERT(a.getValue() > b.getValue());
         //keep incrementing until a also wraps around
-        for (int i = 0; i < 6; i++) {            
+        for (int i = 0; i < (gap + 2); i++) {            
             CPPUNIT_ASSERT(a++ < b++);//test postfix
         }
         //let a 'catch up'
-        for (int i = 0; i < 5; i++) {
+        for (int i = 0; i < gap; i++) {
             a++;
         }
         CPPUNIT_ASSERT(a == b);
         CPPUNIT_ASSERT(++a > b);
+    }
+
+    void testDifference()
+    {
+        SequenceNumber a;
+        SequenceNumber b;
+
+        for (int i = 0; i < 10; i++, ++a) {
+            CPPUNIT_ASSERT_EQUAL(i, a - b);
+            CPPUNIT_ASSERT_EQUAL(-i, b - a);
+        }
+
+        b = a;
+
+        for (int i = 0; i < 10; i++, ++b) {
+            CPPUNIT_ASSERT_EQUAL(-i, a - b);
+            CPPUNIT_ASSERT_EQUAL(i, b - a);
+        }
+    }
+
+    void testDifferenceWithWrapAround1()
+    {
+        const uint32_t max = 0xFFFFFFFF;
+        SequenceNumber a(max - 5);
+        SequenceNumber b(max - 10);
+        checkDifference(a, b, 5);
+    }
+
+    void testDifferenceWithWrapAround2()
+    {
+        const uint32_t max_signed = 0x7FFFFFFF;
+        SequenceNumber c(max_signed - 5);
+        SequenceNumber d(max_signed - 10);
+        checkDifference(c, d, 5);
+    }
+
+    void checkDifference(SequenceNumber& a, SequenceNumber& b, int gap)
+    {
+        CPPUNIT_ASSERT_EQUAL(gap, a - b);
+        CPPUNIT_ASSERT_EQUAL(-gap, b - a);
+
+        //increment until b wraps around
+        for (int i = 0; i < (gap + 2); i++, ++a, ++b) {
+            CPPUNIT_ASSERT_EQUAL(gap, a - b);
+        }
+        //keep incrementing until a also wraps around
+        for (int i = 0; i < (gap + 2); i++, ++a, ++b) {
+            CPPUNIT_ASSERT_EQUAL(gap, a - b);
+        }
+        //let b catch up and overtake
+        for (int i = 0; i < (gap*2); i++, ++b) {
+            CPPUNIT_ASSERT_EQUAL(gap - i, a - b);
+            CPPUNIT_ASSERT_EQUAL(i - gap, b - a);
+        }
     }
 };
     


Reply via email to