PolyBoRi
CTermIter.h
Go to the documentation of this file.
00001 // -*- c++ -*-
00002 //*****************************************************************************
00013 //*****************************************************************************
00014 
00015 // include basic definitions
00016 #include "pbori_defs.h"
00017 
00018 // include polybori functionals
00019 #include "pbori_func.h"
00020 
00021 // include polybori properties
00022 #include "pbori_traits.h"
00023 
00024 
00025 // include boost's interator facade
00026 #include <boost/iterator/iterator_facade.hpp>
00027 
00028 #include "BooleEnv.h"
00029 #ifndef CTermIter_h_
00030 #define CTermIter_h_
00031 
00032 BEGIN_NAMESPACE_PBORI
00033 
00034 
00041 template <class StackType, class TermGeneratorType>
00042 class CTermIter: 
00043   public boost::iterator_facade<
00044   CTermIter<StackType, TermGeneratorType>,
00045   typename TermGeneratorType::value_type,
00046   typename StackType::iterator_category, 
00047   typename TermGeneratorType::result_type
00048   > {
00049 
00050 public:
00051 
00053   typedef StackType stack_type;
00054   
00056   typedef typename stack_type::navigator navigator;
00057 
00059   typedef typename navigator::idx_type idx_type;
00060 
00062   typedef typename navigator::bool_type bool_type;
00063 
00065   typedef typename navigator::size_type size_type;
00066 
00068   typedef typename navigator::deg_type deg_type;
00069 
00071   typedef TermGeneratorType term_generator;
00072 
00074 
00075   typedef typename stack_type::const_iterator const_iterator;
00076   typedef typename stack_type::const_reverse_iterator 
00077   const_reverse_iterator;
00079 
00081   CTermIter(const CTermIter& rhs): 
00082     m_getTerm(rhs.m_getTerm), m_stack(rhs.m_stack) {
00083   }
00084 
00086   template <class MgrType>
00087   CTermIter(navigator navi, const MgrType& mgr): 
00088     m_getTerm(mgr), m_stack(navi, mgr) {
00089     m_stack.init(); 
00090   }
00091 
00093   CTermIter():  m_getTerm(), m_stack() {}
00094 
00096   ~CTermIter() {}
00097 
00099   void increment() {
00100     m_stack.increment();
00101   }
00102 
00104   void decrement() {
00105     m_stack.decrement();
00106   }
00107 
00109   bool_type equal (const CTermIter& rhs) const {
00110      return m_stack.equal(rhs.m_stack);
00111   }
00112 
00114   typename term_generator::result_type dereference() const {
00115     return m_getTerm(m_stack);
00116   }
00117 
00119 
00120   const_iterator begin() const { return m_stack.begin(); }
00121   const_iterator end() const { return m_stack.end(); }
00122   const_reverse_iterator rbegin() const { return m_stack.rbegin(); }
00123   const_reverse_iterator rend() const { return m_stack.rend(); }
00125 
00127   bool_type isOne() const { return m_stack.isOne(); }
00128 
00130   bool_type isZero() const { return m_stack.isZero(); }
00131 
00133   bool_type isEnd() const { return isZero(); }
00134 
00136   deg_type deg() const { return m_stack.deg(); }
00137 
00139   idx_type firstIndex() const { 
00140     assert(!m_stack.empty()); 
00141     return *begin(); 
00142   }
00143 
00145   navigator navigation() const {
00146     return m_stack.navigation();
00147   }
00148 
00149 protected:
00151   term_generator m_getTerm;
00152 
00154   stack_type m_stack;
00155 };
00156 
00157 
00158 END_NAMESPACE_PBORI
00159 
00160 #endif
00161