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