15 #ifndef polybori_iterators_CBidirectTermIter_h_
16 #define polybori_iterators_CBidirectTermIter_h_
30 template<
class NavigatorType>
32 public std::deque<NavigatorType> {
36 typedef std::deque<NavigatorType>
base;
40 while(!base::empty() && (*top() >= *navi) )
43 base::push_back(navi);
46 void pop() { base::pop_back(); }
51 PBORI_ASSERT(base::empty() || rhs.empty() || ((**rhs.begin()) > (*top())) );
52 base::insert(base::end(), rhs.begin(), rhs.end());
63 template <
class TermType,
class NavigatorType,
64 class ForwardOp,
class BackwardOp,
65 class TerminalValueOp = project_ith<2> >
66 class CBidirectTermIter:
67 public CTermIter<TermType, NavigatorType,
68 ForwardOp, BackwardOp,
70 handle_else<NavigatorType> >{
75 typedef TermType term_type;
78 typedef NavigatorType navigator_type;
81 typedef ForwardOp forwardop_type;
84 typedef BackwardOp backwardop_type;
87 typedef TerminalValueOp termvalop_type;
90 typedef handle_else<navigator_type> elsehandle_type;
93 typedef CBidirectTermIter<term_type, navigator_type,
94 forwardop_type, backwardop_type, termvalop_type>
self;
97 typedef CTermIter<term_type, navigator_type,
98 forwardop_type, backwardop_type, termvalop_type,
99 elsehandle_type> base;
103 typedef std::bidirectional_iterator_tag iterator_category;
104 typedef typename base::difference_type difference_type;
105 typedef typename base::pointer pointer;
106 typedef typename base::reference reference;
110 using base::handleElse;
117 CBidirectTermIter(navigator_type navi,
118 forwardop_type fop_ = forwardop_type(),
119 backwardop_type bop_ = backwardop_type(),
120 termvalop_type tvop_ = termvalop_type() ):
121 base(navi, fop_, bop_, tvop_) {}
124 CBidirectTermIter(navigator_type navi, dummy_iterator):
133 CBidirectTermIter(
const self& rhs):
137 ~CBidirectTermIter() {};
146 self operator++(
int dummy) {
147 return base::operator++(dummy);
153 if (!handleElse.empty()){
154 navigator_type navi = handleElse.top();
155 base::popToIndex(*navi);
159 base::nextThen(navi);
169 self operator--(
int) {
178 void followElse(navigator_type& navi) {
179 while( !navi.isConstant() ) {
180 if(!navi.elseBranch().isEmpty()) {
181 handleElse.push(navi);
182 navi.incrementElse();
185 base::nextThen(navi);