00001
00002
00102
00103
00104
00105 #include "pbori_defs.h"
00106
00107
00108 #include "pbori_func.h"
00109
00110
00111 #include "pbori_traits.h"
00112
00113
00114
00115 #include <boost/iterator/iterator_facade.hpp>
00116
00117 #include "BooleEnv.h"
00118 #ifndef CTermIter_h_
00119 #define CTermIter_h_
00120
00121 BEGIN_NAMESPACE_PBORI
00122
00123
00130 template <class StackType, class TermGeneratorType>
00131 class CTermIter:
00132 public boost::iterator_facade<
00133 CTermIter<StackType, TermGeneratorType>,
00134 typename TermGeneratorType::value_type,
00135 typename StackType::iterator_category,
00136 typename TermGeneratorType::result_type
00137 > {
00138
00139 public:
00140
00142 typedef StackType stack_type;
00143
00145 typedef typename stack_type::navigator navigator;
00146
00148 typedef typename navigator::idx_type idx_type;
00149
00151 typedef typename navigator::bool_type bool_type;
00152
00154 typedef typename navigator::size_type size_type;
00155
00157 typedef TermGeneratorType term_generator;
00158
00160
00161 typedef typename stack_type::const_iterator const_iterator;
00162 typedef typename stack_type::const_reverse_iterator
00163 const_reverse_iterator;
00165
00167 CTermIter(const CTermIter& rhs):
00168 m_getTerm(rhs.m_getTerm), m_stack(rhs.m_stack) {
00169 }
00170
00172 template <class MgrType>
00173 CTermIter(navigator navi, const MgrType& mgr):
00174 m_getTerm(mgr), m_stack(navi, mgr) {
00175 m_stack.init();
00176 }
00177
00179 CTermIter(): m_getTerm(), m_stack() {}
00180
00182 ~CTermIter() {}
00183
00185 void increment() {
00186 m_stack.increment();
00187 }
00188
00190 bool_type equal (const CTermIter& rhs) const {
00191 return m_stack.equal(rhs.m_stack);
00192 }
00193
00195 typename term_generator::result_type dereference() const {
00196 return m_getTerm(m_stack);
00197 }
00198
00200
00201 const_iterator begin() const { return m_stack.begin(); }
00202 const_iterator end() const { return m_stack.end(); }
00203 const_reverse_iterator rbegin() const { return m_stack.rbegin(); }
00204 const_reverse_iterator rend() const { return m_stack.rend(); }
00206
00208 bool_type isOne() const { return m_stack.isOne(); }
00209
00211 bool_type isZero() const { return m_stack.isZero(); }
00212
00214 size_type deg() const { return m_stack.deg(); }
00215
00217 idx_type firstIndex() const {
00218 assert(!m_stack.empty());
00219 return *begin();
00220 }
00221
00223 navigator navigation() const {
00224 return m_stack.navigation();
00225 }
00226
00227 protected:
00229 term_generator m_getTerm;
00230
00232 stack_type m_stack;
00233 };
00234
00235
00236 END_NAMESPACE_PBORI
00237
00238 #endif
00239