SortedSequence.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #ifndef SORTEDSEQUENCE_H
00007 #define SORTEDSEQUENCE_H
00008
00009 #include <vector>
00010 #include <iostream>
00011 #include "Benzene.hpp"
00012
00013 _BEGIN_BENZENE_NAMESPACE_
00014
00015
00016
00017
00018
00019
00020 class SortedSequence
00021 {
00022 public:
00023
00024
00025 SortedSequence();
00026
00027
00028 SortedSequence(int max, int num);
00029
00030
00031
00032 SortedSequence(int max, const std::vector<int>& seq);
00033
00034
00035 bool finished() const;
00036
00037
00038
00039
00040 int& operator[](int n);
00041
00042
00043 void operator++();
00044
00045
00046 std::vector<int>& indices();
00047
00048 private:
00049 int m_max;
00050 std::vector<int> m_seq;
00051 };
00052
00053
00054 inline SortedSequence::SortedSequence()
00055 : m_max(0),
00056 m_seq(1, 1)
00057 { }
00058
00059 inline SortedSequence::SortedSequence(int max, int num)
00060 : m_max(max),
00061 m_seq(num, 0)
00062 {
00063
00064 if (num == 0) {
00065 m_max = 1;
00066 m_seq = std::vector<int>(1, 0);
00067 }
00068
00069 for (int i=0; i<(int)m_seq.size(); ++i)
00070 m_seq[i] = i;
00071 }
00072
00073 inline SortedSequence::SortedSequence(int max, const std::vector<int>& seq)
00074 : m_max(max),
00075 m_seq(seq)
00076 { }
00077
00078 inline bool SortedSequence::finished() const
00079 {
00080 return (m_seq[0] > m_max-(int)m_seq.size());
00081 }
00082
00083 inline int& SortedSequence::operator[](int n)
00084 {
00085 assert(0 <= n && n < (int)m_seq.size());
00086 return m_seq[n];
00087 }
00088
00089 inline std::vector<int>& SortedSequence::indices()
00090 {
00091 return m_seq;
00092 }
00093
00094 inline void SortedSequence::operator++()
00095 {
00096 unsigned i = m_seq.size()-1;
00097 int off = 0;
00098 while (true) {
00099 m_seq[i]++;
00100
00101 if (m_seq[i] < m_max-off)
00102 break;
00103
00104 if (i == 0)
00105 break;
00106
00107 i--;
00108 off++;
00109 }
00110
00111 for (; i<m_seq.size()-1; ++i)
00112 m_seq[i+1] = m_seq[i]+1;
00113 }
00114
00115
00116
00117 _END_BENZENE_NAMESPACE_
00118
00119 #endif // SORTEDSEQUENCE_H