1 /***************************************************************************
2 * Copyright (C) 2006 by Michael Andreen *
3 * andreen@student.chalmers.se *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA *
19 ***************************************************************************/
21 #ifndef __GENEORDER_H__
22 #define __GENEORDER_H__
30 * Stores a gene order permutation and ensures that all genes are present
33 * It has limited support for acting as an STL container, but still maintaining
34 * the invariant of a permutation starting with 0 and ending with n, with all
37 * \author Michael Andreen
42 typedef std::vector<Gene> GeneList;
43 typedef GeneList::size_type size_type;
44 typedef GeneList::const_iterator iterator;
47 * Creates a copy of the given gene order
49 GeneOrder(const GeneOrder& go);
52 * Creates a gene order from a given list, using STL-type iterators.
54 * The given permutation needs to contain all genes 1 to n, if 0 is
55 * included it has to be the first item, if it is not present it will
56 * be added automatically. Similarily, if n is not the last item, then
57 * n+1 will be added to the end.
59 * \param begin iterator to the first element in the list, from begin()
60 * on stl collections and pointer to first item on plain arrays.
62 * \param end iterator to the element behind the last, from end() in
63 * stl collections or pointer to first element+size on plain arrays.
65 * \throws std::invalid_argument if the list is not a valid permutation.
68 GeneOrder(T begin, T end);
71 * Destroyes the gene order.
76 * Copies the given gene order.
78 const GeneOrder& operator=(const GeneOrder& go);
81 * Returns the gene at the given index.
83 * \throws std::out_of_range if i is smaller than 0 or bigger than n.
85 const Gene& operator[](size_type i) const;
88 * Returns the size of the permutation.
90 size_type size() const;
93 * Returns the vector containing the gene order permutation.
95 const GeneList& list() const;
98 * Returns the start iterator for the permutation.
99 * To be used with STL style functions.
103 iterator begin() const;
106 * Returns the end iterator for the permutation.
107 * To be used with STL style functions.
111 iterator end() const;
114 * Reverserses the interval [i,j], changing the sign on all elements
117 * \throws std::out_of_range if i is smaller than 0 or bigger than n.
119 void reverse(size_type i, size_type j);
125 * pads the permutation with 0 in front and n+1 at the end if needed
130 * Verifies that the permutation starts with 0, ends with n+1 and that all genes i, 0 < i < n+1
131 * are present, without duplication.
138 * Put all the genes in the list, check that all genes are included, pad with 0 and n+1 if needed.
139 * TODO: This is far from done atm
142 GeneOrder::GeneOrder(T begin, T end): _geneorder(begin,end){