PolyBoRi
|
00001 // -*- c++ -*- 00002 //***************************************************************************** 00105 //***************************************************************************** 00106 00107 // include basic definitions 00108 #include "pbori_defs.h" 00109 00110 // include polybori functionals 00111 #include "pbori_func.h" 00112 00113 // include polybori properties 00114 #include "pbori_traits.h" 00115 00116 00117 // include boost's interator facade 00118 #include <boost/iterator/iterator_facade.hpp> 00119 00120 #include "BooleEnv.h" 00121 #ifndef CTermIter_h_ 00122 #define CTermIter_h_ 00123 00124 BEGIN_NAMESPACE_PBORI 00125 00126 00133 template <class StackType, class TermGeneratorType> 00134 class CTermIter: 00135 public boost::iterator_facade< 00136 CTermIter<StackType, TermGeneratorType>, 00137 typename TermGeneratorType::value_type, 00138 typename StackType::iterator_category, 00139 typename TermGeneratorType::result_type 00140 > { 00141 00142 public: 00143 00145 typedef StackType stack_type; 00146 00148 typedef typename stack_type::navigator navigator; 00149 00151 typedef typename navigator::idx_type idx_type; 00152 00154 typedef typename navigator::bool_type bool_type; 00155 00157 typedef typename navigator::size_type size_type; 00158 00160 typedef TermGeneratorType term_generator; 00161 00163 00164 typedef typename stack_type::const_iterator const_iterator; 00165 typedef typename stack_type::const_reverse_iterator 00166 const_reverse_iterator; 00168 00170 CTermIter(const CTermIter& rhs): 00171 m_getTerm(rhs.m_getTerm), m_stack(rhs.m_stack) { 00172 } 00173 00175 template <class MgrType> 00176 CTermIter(navigator navi, const MgrType& mgr): 00177 m_getTerm(mgr), m_stack(navi, mgr) { 00178 m_stack.init(); 00179 } 00180 00182 CTermIter(): m_getTerm(), m_stack() {} 00183 00185 ~CTermIter() {} 00186 00188 void increment() { 00189 m_stack.increment(); 00190 } 00191 00193 bool_type equal (const CTermIter& rhs) const { 00194 return m_stack.equal(rhs.m_stack); 00195 } 00196 00198 typename term_generator::result_type dereference() const { 00199 return m_getTerm(m_stack); 00200 } 00201 00203 00204 const_iterator begin() const { return m_stack.begin(); } 00205 const_iterator end() const { return m_stack.end(); } 00206 const_reverse_iterator rbegin() const { return m_stack.rbegin(); } 00207 const_reverse_iterator rend() const { return m_stack.rend(); } 00209 00211 bool_type isOne() const { return m_stack.isOne(); } 00212 00214 bool_type isZero() const { return m_stack.isZero(); } 00215 00217 bool_type isEnd() const { return isZero(); } 00218 00220 size_type deg() const { return m_stack.deg(); } 00221 00223 idx_type firstIndex() const { 00224 assert(!m_stack.empty()); 00225 return *begin(); 00226 } 00227 00229 navigator navigation() const { 00230 return m_stack.navigation(); 00231 } 00232 00233 protected: 00235 term_generator m_getTerm; 00236 00238 stack_type m_stack; 00239 }; 00240 00241 00242 END_NAMESPACE_PBORI 00243 00244 #endif 00245