PolyBoRi
CTermIter.h
Go to the documentation of this file.
00001 // -*- c++ -*-
00002 //*****************************************************************************
00013 //*****************************************************************************
00014 
00015 #ifndef polybori_iterators_CTermIter_h_
00016 #define polybori_iterators_CTermIter_h_
00017 
00018 // include basic definitions
00019 #include <polybori/pbori_defs.h>
00020 
00021 // include polybori functionals
00022 #include <polybori/routines/pbori_func.h>
00023 
00024 // include polybori properties
00025 #include <polybori/common/traits.h>
00026 
00027 
00028 // include boost's interator facade
00029 #include <boost/iterator/iterator_facade.hpp>
00030 
00031 #include <polybori/BooleEnv.h>
00032 
00033 
00034 BEGIN_NAMESPACE_PBORI
00035 
00036 
00043 template <class StackType, class TermGeneratorType>
00044 class CTermIter: 
00045   public boost::iterator_facade<
00046   CTermIter<StackType, TermGeneratorType>,
00047   typename TermGeneratorType::value_type,
00048   typename StackType::iterator_category, 
00049   typename TermGeneratorType::result_type
00050   > {
00051 
00052 public:
00053 
00055   typedef StackType stack_type;
00056   
00058   typedef typename stack_type::navigator navigator;
00059 
00061   typedef typename navigator::idx_type idx_type;
00062 
00064   typedef typename navigator::bool_type bool_type;
00065 
00067   typedef typename navigator::size_type size_type;
00068 
00070   typedef typename navigator::deg_type deg_type;
00071 
00073   typedef TermGeneratorType term_generator;
00074 
00076 
00077   typedef typename stack_type::const_iterator const_iterator;
00078   typedef typename stack_type::const_reverse_iterator 
00079   const_reverse_iterator;
00081 
00083   CTermIter(const CTermIter& rhs): 
00084     m_getTerm(rhs.m_getTerm), m_stack(rhs.m_stack) {
00085   }
00086 
00088   template <class MgrType>
00089   CTermIter(navigator navi, const MgrType& mgr): 
00090     m_getTerm(mgr), m_stack(navi, mgr) {
00091     m_stack.init(); 
00092   }
00093 
00095   ~CTermIter() {}
00096 
00098   void increment() {
00099     m_stack.increment();
00100   }
00101 
00103   void decrement() {
00104     m_stack.decrement();
00105   }
00106 
00108   bool_type equal (const CTermIter& rhs) const {
00109      return m_stack.equal(rhs.m_stack);
00110   }
00111 
00113   typename term_generator::result_type dereference() const {
00114     return m_getTerm(m_stack);
00115   }
00116 
00118 
00119   const_iterator begin() const { return m_stack.begin(); }
00120   const_iterator end() const { return m_stack.end(); }
00121   const_reverse_iterator rbegin() const { return m_stack.rbegin(); }
00122   const_reverse_iterator rend() const { return m_stack.rend(); }
00124 
00126   bool_type isOne() const { return m_stack.isOne(); }
00127 
00129   bool_type isZero() const { return m_stack.isZero(); }
00130 
00132   bool_type isEnd() const { return isZero(); }
00133 
00135   deg_type deg() const { return m_stack.deg(); }
00136 
00138   idx_type firstIndex() const { 
00139     PBORI_ASSERT(!m_stack.empty()); 
00140     return *begin(); 
00141   }
00142 
00144   navigator navigation() const {
00145     return m_stack.navigation();
00146   }
00147 
00148 protected:
00150   term_generator m_getTerm;
00151 
00153   stack_type m_stack;
00154 };
00155 
00156 
00157 END_NAMESPACE_PBORI
00158 
00159 #endif
00160