PolyBoRi
CBidirectTermIter.h
Go to the documentation of this file.
1 // -*- c++ -*-
2 //*****************************************************************************
13 //*****************************************************************************
14 
15 #ifndef polybori_iterators_CBidirectTermIter_h_
16 #define polybori_iterators_CBidirectTermIter_h_
17 
18 // get standard header
19 #include <stack>
20 #include <utility>
21 
22 // include basic definitions
23 #include <polybori/pbori_defs.h>
24 
25 // Get forward term iterator
26 #include "CTermIter.h"
27 
29 
30 template<class NavigatorType>
31 class handle_else :
32  public std::deque<NavigatorType> {
33 public:
34 
35  typedef NavigatorType navigator_type;
36  typedef std::deque<NavigatorType> base;
37 
38  void operator()(const navigator_type& navi) {
39 
40  while(!base::empty() && (*top() >= *navi) )
41  base::pop_back();
42 
43  base::push_back(navi);
44  }
45  void push(const navigator_type& navi) { base::push_back(navi); }
46  void pop() { base::pop_back(); }
47 
48  const navigator_type& top() const { return base::back(); };
49 
50  void append(const handle_else& rhs) {
51  PBORI_ASSERT(base::empty() || rhs.empty() || ((**rhs.begin()) > (*top())) );
52  base::insert(base::end(), rhs.begin(), rhs.end());
53  }
54 };
55 
56 #if 0
57 
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,
69  TerminalValueOp,
70  handle_else<NavigatorType> >{
71 
72 public:
73 
75  typedef TermType term_type;
76 
78  typedef NavigatorType navigator_type;
79 
81  typedef ForwardOp forwardop_type;
82 
84  typedef BackwardOp backwardop_type;
85 
87  typedef TerminalValueOp termvalop_type;
88 
90  typedef handle_else<navigator_type> elsehandle_type;
91 
93  typedef CBidirectTermIter<term_type, navigator_type,
94  forwardop_type, backwardop_type, termvalop_type> self;
95 
97  typedef CTermIter<term_type, navigator_type,
98  forwardop_type, backwardop_type, termvalop_type,
99  elsehandle_type> base;
100 
102 
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;
108 
110  using base::handleElse;
111 
113  CBidirectTermIter():
114  base() {}
115 
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_) {}
122 
124  CBidirectTermIter(navigator_type navi, dummy_iterator):
125  base() {
126  if(navi.isValid()) {
127  followElse(navi);
128  terminate(navi);
129  }
130  }
131 
133  CBidirectTermIter(const self& rhs):
134  base(rhs) {};
135 
137  ~CBidirectTermIter() {};
138 
140  self& operator++() {
141  base::operator++();
142  return *this;
143  }
144 
146  self operator++(int dummy) {
147  return base::operator++(dummy);
148  };
149 
151  self& operator--() {
152 
153  if (!handleElse.empty()){
154  navigator_type navi = handleElse.top();
155  base::popToIndex(*navi);
156 
157 
158  handleElse.pop();
159  base::nextThen(navi);
160 
161  followElse(navi);
162  }
163  else
164  base::clear();
165  return *this;
166  }
167 
169  self operator--(int) {
170  self tmp(*this);
171  operator--();
172  return tmp;
173  };
174 
175 protected:
176 
177 
178  void followElse(navigator_type& navi) {
179  while( !navi.isConstant() ) { // if still in interior of a path
180  if(!navi.elseBranch().isEmpty()) {
181  handleElse.push(navi);
182  navi.incrementElse(); // go in direction of last term, if possible
183  }
184  else
185  base::nextThen(navi);
186  }
187  }
188 
189 };
190 
191 #endif
192 
194 
195 #endif
const navigator_type & top() const
Definition: CBidirectTermIter.h:48
#define END_NAMESPACE_PBORI
Finish project's namespace.
Definition: pbori_defs.h:77
#define BEGIN_NAMESPACE_PBORI
Start project's namespace.
Definition: pbori_defs.h:74
Definition: CBidirectTermIter.h:31
NavigatorType navigator_type
Definition: CBidirectTermIter.h:35
void push(const navigator_type &navi)
Definition: CBidirectTermIter.h:45
#define PBORI_ASSERT(arg)
Definition: pbori_defs.h:118
std::deque< NavigatorType > base
Definition: CBidirectTermIter.h:36
void operator()(const navigator_type &navi)
Definition: CBidirectTermIter.h:38
void pop()
Definition: CBidirectTermIter.h:46
void append(const handle_else &rhs)
Definition: CBidirectTermIter.h:50