From c0c87c4e18985ba969174716f7576f291b0fd6a6 Mon Sep 17 00:00:00 2001 From: Michael Andreen Date: Mon, 18 Jun 2007 09:01:36 +0000 Subject: [PATCH] some cleanup, documentation, begin() and end() methods --- src/geneorder.cpp | 29 +++++++++++++++++++---------- src/geneorder.h | 38 +++++++++++++++++++++++++++++++++----- src/test/geneordertest.cpp | 8 ++++---- 3 files changed, 56 insertions(+), 19 deletions(-) diff --git a/src/geneorder.cpp b/src/geneorder.cpp index 994137d..5915524 100644 --- a/src/geneorder.cpp +++ b/src/geneorder.cpp @@ -18,13 +18,13 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * ***************************************************************************/ -#include - #include +#include #include - using namespace std; +#include "geneorder.h" + /** * \file GeneOrder.cpp * Implements the GeneOrder class @@ -33,7 +33,6 @@ using namespace std; */ - GeneOrder::GeneOrder(const GeneOrder& go){ _geneorder = go._geneorder; } @@ -45,7 +44,7 @@ void GeneOrder::pad(){ _geneorder.push_back(_geneorder.size()); } -struct test{ +struct Abs{ Gene operator()(Gene x) const{ return abs(x); } @@ -53,11 +52,12 @@ struct test{ void GeneOrder::verify(){ if(_geneorder[0] != 0) - throw std::invalid_argument("Permutation doesn't start with 0"); + throw invalid_argument("Permutation doesn't start with 0"); if ( _geneorder.back() != static_cast(_geneorder.size() - 1)) - throw std::invalid_argument("Permutation doesn't end with n+1"); + throw invalid_argument("Permutation doesn't end with n+1"); + GeneList genes(_geneorder); - transform(genes.begin(),genes.end(),genes.begin(),test()); + transform(genes.begin(),genes.end(),genes.begin(),Abs()); sort(genes.begin(),genes.end()); if (unique(genes.begin(),genes.end()) != genes.end()) throw std::invalid_argument("Not all genes are present exactly 1 time"); @@ -77,14 +77,23 @@ const GeneOrder& GeneOrder::operator=(const GeneOrder& go){ */ const Gene& GeneOrder::operator[](size_type i) const{ if (i < 0 || i >= _geneorder.size()) - throw out_of_range("Index is not in valid range"); + throw out_of_range("Indexis not in valid range"); return _geneorder[i]; } -int GeneOrder::size() const{ +GeneOrder::size_type GeneOrder::size() const{ return _geneorder.size(); } const GeneOrder::GeneList& GeneOrder::list() const{ return _geneorder; } + + +GeneOrder::iterator GeneOrder::begin() const{ + return _geneorder.begin(); +} + +GeneOrder::iterator GeneOrder::end() const{ + return _geneorder.end(); +} diff --git a/src/geneorder.h b/src/geneorder.h index ebc427a..b29a1ac 100644 --- a/src/geneorder.h +++ b/src/geneorder.h @@ -33,8 +33,9 @@ class GeneOrder{ public: - typedef std::vector GeneList; + typedef std::vector GeneList; typedef GeneList::size_type size_type; + typedef GeneList::const_iterator iterator; /** * Creates a copy of the given gene order @@ -42,9 +43,20 @@ class GeneOrder{ GeneOrder(const GeneOrder& go); /** - * Creates a gene order from a given list. + * Creates a gene order from a given list, using STL-type iterators. * - * \throws invalid_argument if the list is not a valid permutation. + * The given permutation needs to contain all genes 1 to n, if 0 is + * included it has to be the first item, if it is not present it will + * be added automatically. Similarily, if n is not the last item, then + * n+1 will be added to the end. + * + * \param begin iterator to the first element in the list, from begin() + * on stl collections and pointer to first item on plain arrays. + * + * \param end iterator to the element behind the last, from end() in + * stl collections or pointer to first element+size on plain arrays. + * + * \throws std::invalid_argument if the list is not a valid permutation. */ template GeneOrder(T begin, T end); @@ -62,20 +74,36 @@ class GeneOrder{ /** * Returns the gene at the given index. * - * \throws out_of_range if i is smaller than 0 or too big. + * \throws std::out_of_range if i is smaller than 0 or bigger than n. */ const Gene& operator[](size_type i) const; /** * Returns the size of the permutation. */ - int size() const; + size_type size() const; /** * Returns the vector containing the gene order permutation. */ const GeneList& list() const; + /** + * Returns the start iterator for the permutation. + * To be used with STL style functions. + * + * \see end + */ + iterator begin() const; + + /** + * Returns the end iterator for the permutation. + * To be used with STL style functions. + * + * \see begin + */ + iterator end() const; + private: GeneList _geneorder; diff --git a/src/test/geneordertest.cpp b/src/test/geneordertest.cpp index 0d37456..8583b3b 100644 --- a/src/test/geneordertest.cpp +++ b/src/test/geneordertest.cpp @@ -58,17 +58,17 @@ protected: void testCopyCreate (){ GeneOrder go(_bigvalidPerm.begin(),_bigvalidPerm.end()); GeneOrder go2(go); - CPPUNIT_ASSERT(equal(go.list().begin(),go.list().end(),go2.list().begin())); + CPPUNIT_ASSERT(equal(go.begin(),go.end(),go2.begin())); GeneOrder go3(_validPerm.begin(),_validPerm.end()); - CPPUNIT_ASSERT(!equal(go3.list().begin(),go3.list().end(),go2.list().begin())); + CPPUNIT_ASSERT(!equal(go3.begin(),go3.end(),go2.begin())); } void testAssign (){ GeneOrder go(_bigvalidPerm.begin(),_bigvalidPerm.end()); GeneOrder go2(_validPerm.begin(),_validPerm.end()); go2 = go; - CPPUNIT_ASSERT(equal(go.list().begin(),go.list().end(),go2.list().begin())); + CPPUNIT_ASSERT(equal(go.begin(),go.end(),go2.begin())); GeneOrder go3(_validPerm.begin(),_validPerm.end()); - CPPUNIT_ASSERT(!equal(go3.list().begin(),go3.list().end(),go2.list().begin())); + CPPUNIT_ASSERT(!equal(go3.begin(),go3.end(),go2.begin())); } }; -- 2.39.2