PolyBoRi
|
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