PolyBoRi
|
00001 // -*- c++ -*- 00002 //***************************************************************************** 00039 //***************************************************************************** 00040 00041 00042 // include basic definitions 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 // Constructor 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 // Default Constructor 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