114 #ifndef COrderedIter_h_
115 #define COrderedIter_h_
120 template <
class NavigatorType>
121 class CAbstractStackBase {
123 typedef NavigatorType navigator;
125 typedef CAbstractStackBase<NavigatorType>
self;
126 typedef CTermStackBase<NavigatorType, self> iterator_core;
129 virtual
void increment() = 0;
130 virtual core_pointer copy() const = 0;
132 virtual ~CAbstractStackBase() {}
137 template <
class StackType>
141 typedef StackType base;
142 typedef CWrappedStack<StackType>
self;
144 typedef typename base::navigator navigator;
146 typedef typename base::iterator_core iterator_core;
149 template <class MgrType>
150 CWrappedStack(navigator navi, const MgrType& mgr):
154 CWrappedStack(): base() {}
155 CWrappedStack(
const self& rhs): base(rhs) {}
158 core_pointer copy()
const {
159 return core_pointer(
new self(*
this));
198 template <
class NavigatorType,
class MonomType>
200 public boost::iterator_facade<
201 COrderedIter<NavigatorType, MonomType>,
202 MonomType, std::forward_iterator_tag, MonomType
207 typedef COrderedIter<NavigatorType, MonomType>
self;
208 typedef CAbstractStackBase<NavigatorType> stack_base;
209 typedef CTermStackBase<NavigatorType, stack_base> iterator_core;
212 typedef CTermGenerator<MonomType> term_generator;
214 typedef typename iterator_core::const_iterator const_iterator;
215 typedef typename iterator_core::const_reverse_iterator
216 const_reverse_iterator;
217 typedef typename iterator_core::size_type size_type;
222 typedef NavigatorType navigator;
228 typedef
bool bool_type;
231 COrderedIter(core_pointer rhs,
232 const term_generator & getTerm):
233 m_getTerm(getTerm), p_iter(rhs) {}
238 bool equal(
const self& rhs)
const {
239 return p_iter->equal(*rhs.p_iter); }
243 if (!p_iter.unique()) {
244 core_pointer tmp(p_iter->copy());
252 bool_type isOne()
const {
return p_iter->isOne(); }
255 bool_type isZero()
const {
return p_iter->isZero(); }
258 bool_type isEnd()
const {
return isZero(); }
261 MonomType dereference()
const {
263 return m_getTerm(*p_iter);
266 const_iterator begin()
const {
return p_iter->begin(); }
267 const_iterator end()
const {
return p_iter->end(); }
268 const_reverse_iterator rbegin()
const {
return p_iter->rbegin(); }
269 const_reverse_iterator rend()
const {
return p_iter->rend(); }
271 size_type deg()
const {
return p_iter->deg(); }
272 idx_type firstIndex()
const {
return *begin(); }
275 navigator navigation()
const {
276 return p_iter->navigation();
281 term_generator m_getTerm;
288 template <
class OrderType,
class NavigatorType,
class MonomType>
289 class CGenericOrderedIter:
290 public COrderedIter<NavigatorType, MonomType> {
292 typedef CAbstractStackBase<NavigatorType> stack_base;
293 typedef typename CStackSelector<OrderType, NavigatorType, stack_base>::type
295 typedef CWrappedStack<ordered_iter_base> ordered_iter_type;
297 typedef COrderedIter<NavigatorType, MonomType> base;
298 typedef typename base::iterator_core iterator_core;
299 typedef typename base::core_pointer core_pointer;
301 typedef typename base::term_generator term_generator;
303 template <
class MgrType>
304 CGenericOrderedIter(NavigatorType navi,
const MgrType& gen):
305 base( core_pointer(new ordered_iter_type(navi, gen) ), gen) {}
306 CGenericOrderedIter(): base( core_pointer(new ordered_iter_type()),
307 term_generator() ) {}
309 CGenericOrderedIter(
const CGenericOrderedIter& rhs): base(rhs) {}
312 template <
class OrderType,
class NavigatorType>
313 class CGenericOrderedIter<OrderType, NavigatorType, BooleExponent> :
314 public COrderedIter<NavigatorType, BooleExponent> {
316 typedef CAbstractStackBase<NavigatorType> stack_base;
317 typedef typename CStackSelector<OrderType, NavigatorType, stack_base>::type
319 typedef CWrappedStack<ordered_iter_base> ordered_iter_type;
321 typedef COrderedIter<NavigatorType, BooleExponent> base;
322 typedef typename base::iterator_core iterator_core;
323 typedef typename base::core_pointer core_pointer;
325 typedef typename base::term_generator term_generator;
327 template <
class MgrType>
328 CGenericOrderedIter(NavigatorType navi,
const MgrType& mgr):
329 base( core_pointer(new ordered_iter_type(navi, mgr)),
330 term_generator() ) {}
332 CGenericOrderedIter(): base( core_pointer(new ordered_iter_type()),
333 term_generator() ) {}
335 CGenericOrderedIter(
const CGenericOrderedIter& rhs): base(rhs) {}