52 #ifndef CDegLexIter_h_
53 #define CDegLexIter_h_
57 template<
class PolyType,
class PolyDegIter =
typename PolyType::deg_iterator>
63 typedef PolyType poly_type;
66 typedef typename poly_type::size_type size_type;
69 typedef typename poly_type::bool_type bool_type;
72 typedef typename poly_type::monom_type monom_type;
75 typedef monom_type term_type;
78 typedef typename poly_type::deg_iterator deg_iterator;
82 typedef term_type value_type;
83 typedef std::forward_iterator_tag iterator_category;
84 typedef typename deg_iterator::difference_type difference_type;
86 typedef value_type reference;
90 typedef CDelayedTermIter<monom_type,
92 deg_iterator> delayed_term_iterator;
94 typedef CRestrictedIter<delayed_term_iterator> bounded_iterator;
97 typedef CDegLexIter
self;
100 CDegLexIter(
const delayed_term_iterator& start,
101 const delayed_term_iterator& finish ):
102 m_iter(std::max_element(start, finish)), m_start(start), m_finish(finish) {
106 CDegLexIter(): m_iter(), m_start(), m_finish() {}
110 return m_iter.term();
115 if (m_iter != m_finish) {
116 size_type deg = *m_iter;
118 m_iter = std::find(m_iter, m_finish, deg);
120 if(m_iter == m_finish) {
121 m_iter = std::max_element( bounded_iterator(m_start, deg),
122 bounded_iterator(m_finish, deg) );
130 self operator++(
int) {
138 return (m_iter != rhs.m_iter);
142 return (m_iter == rhs.m_iter);
146 delayed_term_iterator m_iter, m_start, m_finish;