PolyBoRi

CTermIter.h

Go to the documentation of this file.
00001 // -*- c++ -*-
00002 //*****************************************************************************
00108 //*****************************************************************************
00109 
00110 // include basic definitions
00111 #include "pbori_defs.h"
00112 
00113 // include polybori functionals
00114 #include "pbori_func.h"
00115 
00116 // include polybori properties
00117 #include "pbori_traits.h"
00118 
00119 
00120 // include boost's interator facade
00121 #include <boost/iterator/iterator_facade.hpp>
00122 
00123 #include "BooleEnv.h"
00124 #ifndef CTermIter_h_
00125 #define CTermIter_h_
00126 
00127 BEGIN_NAMESPACE_PBORI
00128 
00129 
00136 template <class StackType, class TermGeneratorType>
00137 class CTermIter: 
00138   public boost::iterator_facade<
00139   CTermIter<StackType, TermGeneratorType>,
00140   typename TermGeneratorType::value_type,
00141   typename StackType::iterator_category, 
00142   typename TermGeneratorType::result_type
00143   > {
00144 
00145 public:
00146 
00148   typedef StackType stack_type;
00149   
00151   typedef typename stack_type::navigator navigator;
00152 
00154   typedef typename navigator::idx_type idx_type;
00155 
00157   typedef typename navigator::bool_type bool_type;
00158 
00160   typedef typename navigator::size_type size_type;
00161 
00163   typedef typename navigator::deg_type deg_type;
00164 
00166   typedef TermGeneratorType term_generator;
00167 
00169 
00170   typedef typename stack_type::const_iterator const_iterator;
00171   typedef typename stack_type::const_reverse_iterator 
00172   const_reverse_iterator;
00174 
00176   CTermIter(const CTermIter& rhs): 
00177     m_getTerm(rhs.m_getTerm), m_stack(rhs.m_stack) {
00178   }
00179 
00181   template <class MgrType>
00182   CTermIter(navigator navi, const MgrType& mgr): 
00183     m_getTerm(mgr), m_stack(navi, mgr) {
00184     m_stack.init(); 
00185   }
00186 
00188   CTermIter():  m_getTerm(), m_stack() {}
00189 
00191   ~CTermIter() {}
00192 
00194   void increment() {
00195     m_stack.increment();
00196   }
00197 
00199   bool_type equal (const CTermIter& rhs) const {
00200      return m_stack.equal(rhs.m_stack);
00201   }
00202 
00204   typename term_generator::result_type dereference() const {
00205     return m_getTerm(m_stack);
00206   }
00207 
00209 
00210   const_iterator begin() const { return m_stack.begin(); }
00211   const_iterator end() const { return m_stack.end(); }
00212   const_reverse_iterator rbegin() const { return m_stack.rbegin(); }
00213   const_reverse_iterator rend() const { return m_stack.rend(); }
00215 
00217   bool_type isOne() const { return m_stack.isOne(); }
00218 
00220   bool_type isZero() const { return m_stack.isZero(); }
00221 
00223   bool_type isEnd() const { return isZero(); }
00224 
00226   deg_type deg() const { return m_stack.deg(); }
00227 
00229   idx_type firstIndex() const { 
00230     assert(!m_stack.empty()); 
00231     return *begin(); 
00232   }
00233 
00235   navigator navigation() const {
00236     return m_stack.navigation();
00237   }
00238 
00239 protected:
00241   term_generator m_getTerm;
00242 
00244   stack_type m_stack;
00245 };
00246 
00247 
00248 END_NAMESPACE_PBORI
00249 
00250 #endif
00251