00001
00002
00097
00098
00099
00100
00101 #include "pbori_defs.h"
00102 #include "pbori_algo.h"
00103
00104
00105 #include "BoolePolynomial.h"
00106 #include "OrderedManager.h"
00107 #include "CDelayedTermIter.h"
00108 #include "CBidirectTermIter.h"
00109 #include <algorithm>
00110
00111 #include "CStackSelector.h"
00112 #include "CTermGenerator.h"
00113
00114 #ifndef COrderedIter_h_
00115 #define COrderedIter_h_
00116
00117 BEGIN_NAMESPACE_PBORI
00118
00119
00120 template <class NavigatorType>
00121 class CAbstractStackBase {
00122 public:
00123 typedef NavigatorType navigator;
00124
00125 typedef CAbstractStackBase<NavigatorType> self;
00126 typedef CTermStackBase<NavigatorType, self> iterator_core;
00127 typedef PBORI_SHARED_PTR(iterator_core) core_pointer;
00128
00129 virtual void increment() = 0;
00130 virtual core_pointer copy() const = 0;
00131
00132 virtual ~CAbstractStackBase() {}
00133 };
00134
00135
00136
00137 template <class StackType>
00138 class CWrappedStack:
00139 public StackType {
00140 public:
00141 typedef StackType base;
00142 typedef CWrappedStack<StackType> self;
00143
00144 typedef typename base::navigator navigator;
00145
00146 typedef typename base::iterator_core iterator_core;
00147 typedef PBORI_SHARED_PTR(iterator_core) core_pointer;
00148
00149 template <class MgrType>
00150 CWrappedStack(navigator navi, const MgrType& mgr):
00151 base(navi, mgr) {
00152 base::init();
00153 }
00154 CWrappedStack(): base() {}
00155 CWrappedStack(const self& rhs): base(rhs) {}
00156
00157
00158 core_pointer copy() const {
00159 return core_pointer(new self(*this));
00160 }
00161
00162 };
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198 template <class NavigatorType, class MonomType>
00199 class COrderedIter:
00200 public boost::iterator_facade<
00201 COrderedIter<NavigatorType, MonomType>,
00202 MonomType, std::forward_iterator_tag, MonomType
00203 > {
00204
00205 public:
00206
00207 typedef COrderedIter<NavigatorType, MonomType> self;
00208 typedef CAbstractStackBase<NavigatorType> stack_base;
00209 typedef CTermStackBase<NavigatorType, stack_base> iterator_core;
00210
00212 typedef CTermGenerator<MonomType> term_generator;
00213
00214 typedef typename iterator_core::const_iterator const_iterator;
00215 typedef typename iterator_core::const_reverse_iterator
00216 const_reverse_iterator;
00217 typedef typename iterator_core::size_type size_type;
00218 typedef typename iterator_core::deg_type deg_type;
00219 typedef typename iterator_core::idx_type idx_type;
00220
00221
00223 typedef NavigatorType navigator;
00224
00225
00226 typedef PBORI_SHARED_PTR(iterator_core) core_pointer;
00227
00229 typedef bool bool_type;
00230
00231
00232 COrderedIter(core_pointer rhs,
00233 const term_generator & getTerm):
00234 m_getTerm(getTerm), p_iter(rhs) {}
00235
00236
00237 ~COrderedIter() {}
00238
00239 bool equal(const self& rhs) const {
00240 return p_iter->equal(*rhs.p_iter); }
00241
00243 void increment() {
00244 if (!p_iter.unique()) {
00245 core_pointer tmp(p_iter->copy());
00246 p_iter = tmp;
00247 }
00248
00249 p_iter->increment();
00250 }
00251
00253 bool_type isOne() const { return p_iter->isOne(); }
00254
00256 bool_type isZero() const { return p_iter->isZero(); }
00257
00259 bool_type isEnd() const { return isZero(); }
00260
00262 MonomType dereference() const {
00263
00264 return m_getTerm(*p_iter);
00265 }
00266
00267 const_iterator begin() const { return p_iter->begin(); }
00268 const_iterator end() const { return p_iter->end(); }
00269 const_reverse_iterator rbegin() const { return p_iter->rbegin(); }
00270 const_reverse_iterator rend() const { return p_iter->rend(); }
00271
00272 deg_type deg() const { return p_iter->deg(); }
00273 idx_type firstIndex() const { return *begin(); }
00274
00276 navigator navigation() const {
00277 return p_iter->navigation();
00278 }
00279
00280 protected:
00282 term_generator m_getTerm;
00283
00285 core_pointer p_iter;
00286 };
00287
00288
00289 template <class OrderType, class NavigatorType, class MonomType>
00290 class CGenericOrderedIter:
00291 public COrderedIter<NavigatorType, MonomType> {
00292 public:
00293 typedef CAbstractStackBase<NavigatorType> stack_base;
00294 typedef typename CStackSelector<OrderType, NavigatorType, stack_base>::type
00295 ordered_iter_base;
00296 typedef CWrappedStack<ordered_iter_base> ordered_iter_type;
00297
00298 typedef COrderedIter<NavigatorType, MonomType> base;
00299 typedef typename base::iterator_core iterator_core;
00300 typedef typename base::core_pointer core_pointer;
00301
00302 typedef typename base::term_generator term_generator;
00303
00304 template <class MgrType>
00305 CGenericOrderedIter(NavigatorType navi, const MgrType& gen):
00306 base( core_pointer(new ordered_iter_type(navi, gen) ), gen) {}
00307 CGenericOrderedIter(): base( core_pointer(new ordered_iter_type()),
00308 term_generator() ) {}
00309
00310 CGenericOrderedIter(const CGenericOrderedIter& rhs): base(rhs) {}
00311 };
00312
00313 template <class OrderType, class NavigatorType>
00314 class CGenericOrderedIter<OrderType, NavigatorType, BooleExponent> :
00315 public COrderedIter<NavigatorType, BooleExponent> {
00316 public:
00317 typedef CAbstractStackBase<NavigatorType> stack_base;
00318 typedef typename CStackSelector<OrderType, NavigatorType, stack_base>::type
00319 ordered_iter_base;
00320 typedef CWrappedStack<ordered_iter_base> ordered_iter_type;
00321
00322 typedef COrderedIter<NavigatorType, BooleExponent> base;
00323 typedef typename base::iterator_core iterator_core;
00324 typedef typename base::core_pointer core_pointer;
00325
00326 typedef typename base::term_generator term_generator;
00327
00328 template <class MgrType>
00329 CGenericOrderedIter(NavigatorType navi, const MgrType& mgr):
00330 base( core_pointer(new ordered_iter_type(navi, mgr)),
00331 term_generator() ) {}
00332
00333 CGenericOrderedIter(): base( core_pointer(new ordered_iter_type()),
00334 term_generator() ) {}
00335
00336 CGenericOrderedIter(const CGenericOrderedIter& rhs): base(rhs) {}
00337 };
00338
00339 END_NAMESPACE_PBORI
00340
00341 #endif