CluE  1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
subsetiterator.h
Go to the documentation of this file.
1 #ifndef SUBSETITERATOR_H
2 #define SUBSETITERATOR_H
3 
4 #include <stdexcept>
5 
6 #include "../misc/setiterator.h"
7 #include "../misc/flippinggraycodebits.h"
8 
9 namespace CluE
10 {
19 template<class T> class SubsetIterator : public SetIterator<T>
20 {
21 public:
25  SubsetIterator(std::set<T*> superset);
26 
30  SubsetIterator(std::vector<T*> superset);
31 
36  virtual size_t size() const;
37 
42  virtual void next();
43 
47  virtual bool hasMore() const;
48 
52  virtual std::set<T*> set() const;
53 
58  virtual std::vector<T*> vector() const;
59 
60 private:
62  std::vector<T*> supersetVector;
64  std::set<T*> currentSubset;
65  size_t currentSize;
66 };
67 
68 template<class T> SubsetIterator<T>::SubsetIterator(std::set<T*> superset) :
69  supersetVectorSize(superset.size()),
70  currentSize(0),
71  supersetVector(superset.begin(), superset.end())
72 {
73 }
74 
75 template<class T> SubsetIterator<T>::SubsetIterator(std::vector<T*> superset) :
76  supersetVector(superset),
77  supersetVectorSize(superset.size()),
78  currentSize(0)
79 {
80 }
81 
82 template<class T> size_t SubsetIterator<T>::size() const
83 {
84  return currentSize;
85 }
86 
87 template<class T> void SubsetIterator<T>::next()
88 {
89  size_t element = gcs.current();
90  if(element < supersetVectorSize)
91  {
92  if(currentSubset.find(supersetVector[element]) != currentSubset.end())
93  {
94  currentSubset.erase(supersetVector[element]);
95  currentSize--;
96  }
97  else
98  {
99  currentSubset.insert(supersetVector[element]);
100  currentSize++;
101  }
102  gcs.next();
103  }
104  else
105  {
106  throw std::out_of_range("No more subsets.");
107  }
108 }
109 
110 template<class T> bool SubsetIterator<T>::hasMore() const
111 {
112  if(gcs.current() < supersetVectorSize)
113  return true;
114  else
115  return false;
116 }
117 
118 template<class T> std::set<T*> SubsetIterator<T>::set() const
119 {
120  return currentSubset;
121 }
122 
123 template<class T> std::vector<T*> SubsetIterator<T>::vector() const
124 {
125  return std::vector<T*> (currentSubset.begin(), currentSubset.end());
126 }
127 
128 }
129 
130 #endif
GraycodeSequence gcs
virtual void next()
Generates the next subset.
Returns the bits flipped in a Graycode sequence.
virtual std::vector< T * > vector() const
Returns the current subset as a vector.
virtual size_t size() const
Size of the current subset.
SubsetIterator(std::set< T * > superset)
Provide the superset as a set.
Base class used to provide iterating over sets.
Definition: setiterator.h:15
std::vector< T * > supersetVector
std::set< T * > currentSubset
virtual bool hasMore() const
Returns if the Graycode sequence is incomplete yet or not.
Iterates over all subsets of a given superset.
virtual std::set< T * > set() const
Returns the current subset as a set.