1 |
#ifndef _CONSTRAINT_ITERATOR_H_ |
2 |
#define _CONSTRAINT_ITERATOR_H_ |
3 |
#include <list> |
4 |
#include <vector> |
5 |
|
6 |
using namespace std; |
7 |
//abstract iterator class |
8 |
template<class Item> class IteratorBase{ |
9 |
public: |
10 |
virtual ~IteratorBase(){} |
11 |
virtual void first() = 0; |
12 |
virtual void next() = 0; |
13 |
virtual bool isEnd() = 0; |
14 |
|
15 |
virtual Item* currentItem() =0; |
16 |
|
17 |
protected: |
18 |
IteratorBase() {}; |
19 |
}; |
20 |
|
21 |
template <class Item> class ConstraintIterator{ |
22 |
public: |
23 |
ConstraintIterator(list<vector<Item*> >& aContainer) : container(aContainer){} |
24 |
|
25 |
virtual void first(){ |
26 |
listIter = container.begin(); |
27 |
//the construction of the container will guarantee every vector in list will contain at least one element |
28 |
//so we don't need to worry about the empty vector problem |
29 |
//while (listIter->empty()) |
30 |
// ++listIter; |
31 |
|
32 |
vectorIter = listIter->begin(); |
33 |
} |
34 |
|
35 |
virtual void next(){ |
36 |
++vectorIter; |
37 |
if (vectorIter == listIter->end()){ |
38 |
|
39 |
//do{ |
40 |
//++listIter; |
41 |
//}while(listIter->empty()) |
42 |
++listIter; |
43 |
if (listIter != container.end()) |
44 |
vectorIter = listIter->begin(); |
45 |
} |
46 |
} |
47 |
|
48 |
virtual bool isEnd(){ |
49 |
return listIter == container.end(); |
50 |
} |
51 |
|
52 |
Item* currentItem(){ |
53 |
return listIter ==container.end() ? NULL : *vectorIter; |
54 |
} |
55 |
|
56 |
private: |
57 |
list<vector<Item*> >& container; |
58 |
|
59 |
typename list<vector<Item*> >::iterator listIter; |
60 |
typename vector<Item*>::iterator vectorIter; |
61 |
}; |
62 |
|
63 |
typedef ConstraintIterator<ConstraintPair> ConstraintPairIterator; |
64 |
typedef ConstraintIterator<ConstraintElement> ConstraintElementIterator; |
65 |
|
66 |
|
67 |
#endif //end ifndef _CONSTRAINT_ITERATOR_H_ |