00001
00002
00094
00095
00096
00097
00098 #include "pbori_defs.h"
00099 #include "pbori_algo.h"
00100
00101
00102 #include "BoolePolynomial.h"
00103 #include "OrderedManager.h"
00104 #include "CDelayedTermIter.h"
00105 #include "CBidirectTermIter.h"
00106 #include <algorithm>
00107
00108 #include "CStackSelector.h"
00109 #include "CTermGenerator.h"
00110
00111 #ifndef COrderedIter_h_
00112 #define COrderedIter_h_
00113
00114 BEGIN_NAMESPACE_PBORI
00115
00116
00117 template <class NavigatorType>
00118 class CAbstractStackBase {
00119 public:
00120 typedef NavigatorType navigator;
00121
00122 typedef CAbstractStackBase<NavigatorType> self;
00123 typedef CTermStackBase<NavigatorType, self> iterator_core;
00124 typedef PBORI_SHARED_PTR(iterator_core) core_pointer;
00125
00126 virtual void increment() = 0;
00127 virtual core_pointer copy() const = 0;
00128
00129 virtual ~CAbstractStackBase() {}
00130 };
00131
00132
00133
00134 template <class StackType>
00135 class CWrappedStack:
00136 public StackType {
00137 public:
00138 typedef StackType base;
00139 typedef CWrappedStack<StackType> self;
00140
00141 typedef typename base::navigator navigator;
00142
00143 typedef typename base::iterator_core iterator_core;
00144 typedef PBORI_SHARED_PTR(iterator_core) core_pointer;
00145
00146 template <class MgrType>
00147 CWrappedStack(navigator navi, const MgrType& mgr):
00148 base(navi, mgr) {
00149 base::init();
00150 }
00151 CWrappedStack(): base() {}
00152 CWrappedStack(const self& rhs): base(rhs) {}
00153
00154
00155 core_pointer copy() const {
00156 return core_pointer(new self(*this));
00157 }
00158
00159 };
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 template <class NavigatorType, class MonomType>
00196 class COrderedIter:
00197 public boost::iterator_facade<
00198 COrderedIter<NavigatorType, MonomType>,
00199 MonomType, std::forward_iterator_tag, MonomType
00200 > {
00201
00202 public:
00203
00204 typedef COrderedIter<NavigatorType, MonomType> self;
00205 typedef CAbstractStackBase<NavigatorType> stack_base;
00206 typedef CTermStackBase<NavigatorType, stack_base> iterator_core;
00207
00209 typedef CTermGenerator<MonomType> term_generator;
00210
00211 typedef typename iterator_core::const_iterator const_iterator;
00212 typedef typename iterator_core::const_reverse_iterator
00213 const_reverse_iterator;
00214 typedef typename iterator_core::size_type size_type;
00215 typedef typename iterator_core::idx_type idx_type;
00216
00217
00219 typedef NavigatorType navigator;
00220
00221
00222 typedef PBORI_SHARED_PTR(iterator_core) core_pointer;
00223
00225 typedef bool bool_type;
00226
00227
00228 COrderedIter(core_pointer rhs,
00229 const term_generator & getTerm):
00230 m_getTerm(getTerm), p_iter(rhs) {}
00231
00232
00233 ~COrderedIter() {}
00234
00235 bool equal(const self& rhs) const {
00236 return p_iter->equal(*rhs.p_iter); }
00237
00239 void increment() {
00240 if (!p_iter.unique()) {
00241 core_pointer tmp(p_iter->copy());
00242 p_iter = tmp;
00243 }
00244
00245 p_iter->increment();
00246 }
00247
00249 bool_type isOne() const { return p_iter->isOne(); }
00250
00252 bool_type isZero() const { return p_iter->isZero(); }
00253
00255 MonomType dereference() const {
00256
00257 return m_getTerm(*p_iter);
00258 }
00259
00260 const_iterator begin() const { return p_iter->begin(); }
00261 const_iterator end() const { return p_iter->end(); }
00262 const_reverse_iterator rbegin() const { return p_iter->rbegin(); }
00263 const_reverse_iterator rend() const { return p_iter->rend(); }
00264
00265 size_type deg() const { return p_iter->deg(); }
00266 idx_type firstIndex() const { return *begin(); }
00267
00269 navigator navigation() const {
00270 return p_iter->navigation();
00271 }
00272
00273 protected:
00275 term_generator m_getTerm;
00276
00278 core_pointer p_iter;
00279 };
00280
00281
00282 template <class OrderType, class NavigatorType, class MonomType>
00283 class CGenericOrderedIter:
00284 public COrderedIter<NavigatorType, MonomType> {
00285 public:
00286 typedef CAbstractStackBase<NavigatorType> stack_base;
00287 typedef typename CStackSelector<OrderType, NavigatorType, stack_base>::type
00288 ordered_iter_base;
00289 typedef CWrappedStack<ordered_iter_base> ordered_iter_type;
00290
00291 typedef COrderedIter<NavigatorType, MonomType> base;
00292 typedef typename base::iterator_core iterator_core;
00293 typedef typename base::core_pointer core_pointer;
00294
00295 typedef typename base::term_generator term_generator;
00296
00297 template <class MgrType>
00298 CGenericOrderedIter(NavigatorType navi, const MgrType& gen):
00299 base( core_pointer(new ordered_iter_type(navi, gen) ), gen) {}
00300 CGenericOrderedIter(): base( core_pointer(new ordered_iter_type()),
00301 term_generator() ) {}
00302
00303 CGenericOrderedIter(const CGenericOrderedIter& rhs): base(rhs) {}
00304 };
00305
00306 template <class OrderType, class NavigatorType>
00307 class CGenericOrderedIter<OrderType, NavigatorType, BooleExponent> :
00308 public COrderedIter<NavigatorType, BooleExponent> {
00309 public:
00310 typedef CAbstractStackBase<NavigatorType> stack_base;
00311 typedef typename CStackSelector<OrderType, NavigatorType, stack_base>::type
00312 ordered_iter_base;
00313 typedef CWrappedStack<ordered_iter_base> ordered_iter_type;
00314
00315 typedef COrderedIter<NavigatorType, BooleExponent> base;
00316 typedef typename base::iterator_core iterator_core;
00317 typedef typename base::core_pointer core_pointer;
00318
00319 typedef typename base::term_generator term_generator;
00320
00321 template <class MgrType>
00322 CGenericOrderedIter(NavigatorType navi, const MgrType& mgr):
00323 base( core_pointer(new ordered_iter_type(navi, mgr)),
00324 term_generator() ) {}
00325
00326 CGenericOrderedIter(): base( core_pointer(new ordered_iter_type()),
00327 term_generator() ) {}
00328
00329 CGenericOrderedIter(const CGenericOrderedIter& rhs): base(rhs) {}
00330 };
00331
00332 END_NAMESPACE_PBORI
00333
00334 #endif