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