PolyBoRi
|
00001 // -*- c++ -*- 00002 //***************************************************************************** 00042 //***************************************************************************** 00043 00044 00045 // include basic definitions 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 // Constructor 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 // Default Constructor 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