]> ruin.nu Git - germs.git/commitdiff
GeneOrder::reverse implemented
authorMichael Andreen <harv@ruin.nu>
Mon, 18 Jun 2007 09:43:00 +0000 (09:43 +0000)
committerMichael Andreen <harv@ruin.nu>
Mon, 18 Jun 2007 09:43:00 +0000 (09:43 +0000)
src/geneorder.cpp
src/geneorder.h
src/test/geneordertest.cpp

index 5915524644e32ee84c76de09ebbcfac6932d3fb1..23bb9623513e1077b9a937e4a8a0ef48993efd1d 100644 (file)
@@ -97,3 +97,23 @@ GeneOrder::iterator GeneOrder::begin() const{
 GeneOrder::iterator GeneOrder::end() const{
        return _geneorder.end();
 }
+
+struct Sign{
+       Gene operator()(Gene x) const{
+               return x*-1;
+       }
+};
+
+void GeneOrder::reverse(size_type i, size_type j){
+       if (i > j)
+               throw out_of_range("i can't be bigger than j");
+       if (i < 0)
+               throw out_of_range("Index i is not in valid range");
+       if (j >= _geneorder.size())
+               throw out_of_range("Index j is not in valid range");
+       GeneList::iterator begin = _geneorder.begin()+i;
+       GeneList::iterator end = _geneorder.begin()+j+1;
+
+       transform(begin,end,begin,Sign());
+       std::reverse(begin,end);
+}
index b29a1acc2ceefc15d700f9720f09a2ad9f22568a..a4b7aaa0ae51a7567c450a7f87655627c0639ab4 100644 (file)
@@ -104,6 +104,14 @@ class GeneOrder{
                 */
                iterator end() const;
 
+               /**
+                * Reverserses the interval [i,j], changing the sign on all elements
+                * affected.
+                *
+                * \throws std::out_of_range if i is smaller than 0 or bigger than n.
+                */
+               void reverse(size_type i, size_type j);
+
 
        private:
                GeneList _geneorder;
index 8583b3b7731fe164776f5034c510995c8ad478ae..bfa2dbdd4dc82bb7fee3ba67ebe02130a677bdc8 100644 (file)
@@ -21,6 +21,7 @@ class TESTNAME : public CPPUNIT_NS::TestFixture
   CPPUNIT_TEST( testCreate );
   CPPUNIT_TEST( testCopyCreate );
   CPPUNIT_TEST( testAssign );
+  CPPUNIT_TEST( testReverse );
   CPPUNIT_TEST_SUITE_END();
 
 protected:
@@ -70,6 +71,25 @@ protected:
                GeneOrder go3(_validPerm.begin(),_validPerm.end());
                CPPUNIT_ASSERT(!equal(go3.begin(),go3.end(),go2.begin()));
        }
+       void testReverse(){
+               int validPerm[] = {1,2,3,4,5,6,7};
+               GeneOrder go(validPerm,validPerm+7);
+               int validPerm2[] = {1,-6,-5,-4,-3,-2,7};
+               GeneOrder go2(validPerm2,validPerm2+7);
+               go2.reverse(2,6);
+               CPPUNIT_ASSERT(equal(go.begin(),go.end(),go2.begin()));
+
+               int validPerm3[] = {1,6,-5,-4,-3,2,7};
+               GeneOrder go3(validPerm3,validPerm3+7);
+
+               go3.reverse(2,6);
+               CPPUNIT_ASSERT(!equal(go.begin(),go.end(),go3.begin()));
+
+               CPPUNIT_ASSERT_THROW(go.reverse(2,1),out_of_range);
+               CPPUNIT_ASSERT_THROW(go.reverse(1,9),out_of_range);
+               CPPUNIT_ASSERT_THROW(go.reverse(-1,3),out_of_range);
+       }
+
 };
 
 CPPUNIT_TEST_SUITE_REGISTRATION( TESTNAME );