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 void decrement() {
00200 m_stack.decrement();
00201 }
00202
00204 bool_type equal (const CTermIter& rhs) const {
00205 return m_stack.equal(rhs.m_stack);
00206 }
00207
00209 typename term_generator::result_type dereference() const {
00210 return m_getTerm(m_stack);
00211 }
00212
00214
00215 const_iterator begin() const { return m_stack.begin(); }
00216 const_iterator end() const { return m_stack.end(); }
00217 const_reverse_iterator rbegin() const { return m_stack.rbegin(); }
00218 const_reverse_iterator rend() const { return m_stack.rend(); }
00220
00222 bool_type isOne() const { return m_stack.isOne(); }
00223
00225 bool_type isZero() const { return m_stack.isZero(); }
00226
00228 bool_type isEnd() const { return isZero(); }
00229
00231 deg_type deg() const { return m_stack.deg(); }
00232
00234 idx_type firstIndex() const {
00235 assert(!m_stack.empty());
00236 return *begin();
00237 }
00238
00240 navigator navigation() const {
00241 return m_stack.navigation();
00242 }
00243
00244 protected:
00246 term_generator m_getTerm;
00247
00249 stack_type m_stack;
00250 };
00251
00252
00253 END_NAMESPACE_PBORI
00254
00255 #endif
00256