Go to the documentation of this file.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::bool_type bool_type;
00070
00072 typedef typename poly_type::monom_type monom_type;
00073
00075 typedef monom_type term_type;
00076
00078 typedef typename poly_type::deg_iterator deg_iterator;
00079
00081
00082 typedef term_type value_type;
00083 typedef std::forward_iterator_tag iterator_category;
00084 typedef typename deg_iterator::difference_type difference_type;
00085 typedef void pointer;
00086 typedef value_type reference;
00088
00090 typedef CDelayedTermIter<monom_type,
00091 change_assign<monom_type>, project_ith<2>,
00092 deg_iterator> delayed_term_iterator;
00093
00094 typedef CRestrictedIter<delayed_term_iterator> bounded_iterator;
00095
00097 typedef CDegLexIter self;
00098
00099
00100 CDegLexIter(const delayed_term_iterator& start,
00101 const delayed_term_iterator& finish ):
00102 m_iter(std::max_element(start, finish)), m_start(start), m_finish(finish) {
00103
00104 }
00105
00106 CDegLexIter(): m_iter(), m_start(), m_finish() {}
00107
00109 reference operator*() const {
00110 return m_iter.term();
00111 }
00112
00114 self& operator++() {
00115 if (m_iter != m_finish) {
00116 size_type deg = *m_iter;
00117 ++m_iter;
00118 m_iter = std::find(m_iter, m_finish, deg);
00119
00120 if(m_iter == m_finish) {
00121 m_iter = std::max_element( bounded_iterator(m_start, deg),
00122 bounded_iterator(m_finish, deg) );
00123
00124 }
00125 }
00126
00127 return *this;
00128 }
00129
00130 self operator++(int) {
00131 self result(*this);
00132 operator++();
00133 return result;
00134 }
00135
00136
00137 bool_type operator!=(const self& rhs) const {
00138 return (m_iter != rhs.m_iter);
00139 }
00140
00141 bool_type operator==(const self& rhs) const {
00142 return (m_iter == rhs.m_iter);
00143 }
00144
00145 private:
00146 delayed_term_iterator m_iter, m_start, m_finish;
00147 };
00148
00149 #endif
00150
00151 END_NAMESPACE_PBORI
00152
00153 #endif