55 #ifndef CBidirectTermIter_h_
56 #define CBidirectTermIter_h_
60 template<
class NavigatorType>
62 public std::deque<NavigatorType> {
66 typedef std::deque<NavigatorType>
base;
70 while(!base::empty() && (*top() >= *navi) )
73 base::push_back(navi);
76 void pop() { base::pop_back(); }
81 assert(base::empty() || rhs.empty() || ((**rhs.begin()) > (*top())) );
82 base::insert(base::end(), rhs.begin(), rhs.end());
93 template <
class TermType,
class NavigatorType,
94 class ForwardOp,
class BackwardOp,
96 class CBidirectTermIter:
97 public CTermIter<TermType, NavigatorType,
98 ForwardOp, BackwardOp,
100 handle_else<NavigatorType> >{
105 typedef TermType term_type;
108 typedef NavigatorType navigator_type;
111 typedef ForwardOp forwardop_type;
114 typedef BackwardOp backwardop_type;
117 typedef TerminalValueOp termvalop_type;
120 typedef handle_else<navigator_type> elsehandle_type;
123 typedef CBidirectTermIter<term_type, navigator_type,
124 forwardop_type, backwardop_type, termvalop_type>
self;
127 typedef CTermIter<term_type, navigator_type,
128 forwardop_type, backwardop_type, termvalop_type,
129 elsehandle_type> base;
133 typedef std::bidirectional_iterator_tag iterator_category;
134 typedef typename base::difference_type difference_type;
135 typedef typename base::pointer pointer;
136 typedef typename base::reference reference;
140 using base::handleElse;
147 CBidirectTermIter(navigator_type navi,
148 forwardop_type fop_ = forwardop_type(),
149 backwardop_type bop_ = backwardop_type(),
150 termvalop_type tvop_ = termvalop_type() ):
151 base(navi, fop_, bop_, tvop_) {}
154 CBidirectTermIter(navigator_type navi, dummy_iterator):
163 CBidirectTermIter(
const self& rhs):
167 ~CBidirectTermIter() {};
176 self operator++(
int dummy) {
177 return base::operator++(dummy);
183 if (!handleElse.empty()){
184 navigator_type navi = handleElse.top();
185 base::popToIndex(*navi);
189 base::nextThen(navi);
199 self operator--(
int) {
208 void followElse(navigator_type& navi) {
209 while( !navi.isConstant() ) {
210 if(!navi.elseBranch().isEmpty()) {
211 handleElse.push(navi);
212 navi.incrementElse();
215 base::nextThen(navi);