00001
00002
00108
00109
00110
00111 #include "pbori_defs.h"
00112
00113
00114 #include "pbori_func.h"
00115
00116
00117 #include "pbori_traits.h"
00118
00119
00120
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