X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=src%2Fgeneorder.cpp;h=23bb9623513e1077b9a937e4a8a0ef48993efd1d;hb=HEAD;hp=994137d288a025e788eaf99d2b79b4272bc7d96a;hpb=61d4b0437c63ecc3452e8b59746d629a4387543f;p=germs.git diff --git a/src/geneorder.cpp b/src/geneorder.cpp index 994137d..23bb962 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,43 @@ 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(); +} + +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); +}