From 959f25585c048a9cda1653ef4c5ea2c1a7007b67 Mon Sep 17 00:00:00 2001 From: Michael Andreen Date: Mon, 18 Jun 2007 09:43:00 +0000 Subject: [PATCH] GeneOrder::reverse implemented --- src/geneorder.cpp | 20 ++++++++++++++++++++ src/geneorder.h | 8 ++++++++ src/test/geneordertest.cpp | 20 ++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/src/geneorder.cpp b/src/geneorder.cpp index 5915524..23bb962 100644 --- a/src/geneorder.cpp +++ b/src/geneorder.cpp @@ -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); +} diff --git a/src/geneorder.h b/src/geneorder.h index b29a1ac..a4b7aaa 100644 --- a/src/geneorder.h +++ b/src/geneorder.h @@ -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; diff --git a/src/test/geneordertest.cpp b/src/test/geneordertest.cpp index 8583b3b..bfa2dbd 100644 --- a/src/test/geneordertest.cpp +++ b/src/test/geneordertest.cpp @@ -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 ); -- 2.39.2