PolyBoRi
CDegLexIter.h
Go to the documentation of this file.
1 // -*- c++ -*-
2 //*****************************************************************************
39 //*****************************************************************************
40 
41 
42 // include basic definitions
43 #include "pbori_defs.h"
44 
45 
46 #include "BoolePolynomial.h"
47 #include "CDelayedTermIter.h"
48 #include "CRestrictedIter.h"
49 
50 #include <algorithm>
51 
52 #ifndef CDegLexIter_h_
53 #define CDegLexIter_h_
54 
56 #if 0
57 template<class PolyType, class PolyDegIter = typename PolyType::deg_iterator>
58 class CDegLexIter {
59 
60 public:
61 
63  typedef PolyType poly_type;
64 
66  typedef typename poly_type::size_type size_type;
67 
69  typedef typename poly_type::bool_type bool_type;
70 
72  typedef typename poly_type::monom_type monom_type;
73 
75  typedef monom_type term_type;
76 
78  typedef typename poly_type::deg_iterator deg_iterator;
79 
81 
82  typedef term_type value_type;
83  typedef std::forward_iterator_tag iterator_category;
84  typedef typename deg_iterator::difference_type difference_type;
85  typedef void pointer;
86  typedef value_type reference;
88 
90  typedef CDelayedTermIter<monom_type,
91  change_assign<monom_type>, project_ith<2>,
92  deg_iterator> delayed_term_iterator;
93 
94  typedef CRestrictedIter<delayed_term_iterator> bounded_iterator;
95 
97  typedef CDegLexIter self;
98 
99  // Constructor
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) {
103 
104  }
105  // Default Constructor
106  CDegLexIter(): m_iter(), m_start(), m_finish() {}
107 
109  reference operator*() const {
110  return m_iter.term();
111  }
112 
114  self& operator++() {
115  if (m_iter != m_finish) {
116  size_type deg = *m_iter;
117  ++m_iter;
118  m_iter = std::find(m_iter, m_finish, deg);
119 
120  if(m_iter == m_finish) {
121  m_iter = std::max_element( bounded_iterator(m_start, deg),
122  bounded_iterator(m_finish, deg) );
123 
124  }
125  }
126 
127  return *this;
128  }
129 
130  self operator++(int) {
131  self result(*this);
132  operator++();
133  return result;
134  }
135 
136 
137  bool_type operator!=(const self& rhs) const {
138  return (m_iter != rhs.m_iter);
139  }
140 
141  bool_type operator==(const self& rhs) const {
142  return (m_iter == rhs.m_iter);
143  }
144 
145 private:
146  delayed_term_iterator m_iter, m_start, m_finish;
147 };
148 
149 #endif
150 
152 
153 #endif