00001
00002
00042
00043
00044
00045
00046 #include "pbori_defs.h"
00047
00048
00049 #include "BoolePolynomial.h"
00050 #include "CDelayedTermIter.h"
00051 #include "CRestrictedIter.h"
00052
00053 #include <algorithm>
00054
00055 #ifndef CDegLexIter_h_
00056 #define CDegLexIter_h_
00057
00058 BEGIN_NAMESPACE_PBORI
00059 #if 0
00060 template<class PolyType, class PolyDegIter = typename PolyType::deg_iterator>
00061 class CDegLexIter {
00062
00063 public:
00064
00066 typedef PolyType poly_type;
00067
00069 typedef typename poly_type::size_type size_type;
00070
00072 typedef typename poly_type::deg_type deg_type;
00073
00075 typedef typename poly_type::bool_type bool_type;
00076
00078 typedef typename poly_type::monom_type monom_type;
00079
00081 typedef monom_type term_type;
00082
00084 typedef typename poly_type::deg_iterator deg_iterator;
00085
00087
00088 typedef term_type value_type;
00089 typedef std::forward_iterator_tag iterator_category;
00090 typedef typename deg_iterator::difference_type difference_type;
00091 typedef void pointer;
00092 typedef value_type reference;
00094
00096 typedef CDelayedTermIter<monom_type,
00097 change_assign<monom_type>, project_ith<2>,
00098 deg_iterator> delayed_term_iterator;
00099
00100 typedef CRestrictedIter<delayed_term_iterator> bounded_iterator;
00101
00103 typedef CDegLexIter self;
00104
00105
00106 CDegLexIter(const delayed_term_iterator& start,
00107 const delayed_term_iterator& finish ):
00108 m_iter(std::max_element(start, finish)), m_start(start), m_finish(finish) {
00109
00110 }
00111
00112 CDegLexIter(): m_iter(), m_start(), m_finish() {}
00113
00115 reference operator*() const {
00116 return m_iter.term();
00117 }
00118
00120 self& operator++() {
00121 if (m_iter != m_finish) {
00122 deg_type deg = *m_iter;
00123 ++m_iter;
00124 m_iter = std::find(m_iter, m_finish, deg);
00125
00126 if(m_iter == m_finish) {
00127 m_iter = std::max_element( bounded_iterator(m_start, deg),
00128 bounded_iterator(m_finish, deg) );
00129
00130 }
00131 }
00132
00133 return *this;
00134 }
00135
00136 self operator++(int) {
00137 self result(*this);
00138 operator++();
00139 return result;
00140 }
00141
00142
00143 bool_type operator!=(const self& rhs) const {
00144 return (m_iter != rhs.m_iter);
00145 }
00146
00147 bool_type operator==(const self& rhs) const {
00148 return (m_iter == rhs.m_iter);
00149 }
00150
00151 private:
00152 delayed_term_iterator m_iter, m_start, m_finish;
00153 };
00154
00155 #endif
00156
00157 END_NAMESPACE_PBORI
00158
00159 #endif