PolyBoRi
|
00001 // -*- c++ -*- 00002 //***************************************************************************** 00013 //***************************************************************************** 00014 00015 00016 // include basic definitions 00017 #include "pbori_defs.h" 00018 00019 00020 #include "BoolePolynomial.h" 00021 #include "CDelayedTermIter.h" 00022 #include "CRestrictedIter.h" 00023 00024 #include <algorithm> 00025 00026 #ifndef CDegLexIter_h_ 00027 #define CDegLexIter_h_ 00028 00029 BEGIN_NAMESPACE_PBORI 00030 #if 0 00031 template<class PolyType, class PolyDegIter = typename PolyType::deg_iterator> 00032 class CDegLexIter { 00033 00034 public: 00035 00037 typedef PolyType poly_type; 00038 00040 typedef typename poly_type::size_type size_type; 00041 00043 typedef typename poly_type::deg_type deg_type; 00044 00046 typedef typename poly_type::bool_type bool_type; 00047 00049 typedef typename poly_type::monom_type monom_type; 00050 00052 typedef monom_type term_type; 00053 00055 typedef typename poly_type::deg_iterator deg_iterator; 00056 00058 00059 typedef term_type value_type; 00060 typedef std::forward_iterator_tag iterator_category; 00061 typedef typename deg_iterator::difference_type difference_type; 00062 typedef void pointer; 00063 typedef value_type reference; 00065 00067 typedef CDelayedTermIter<monom_type, 00068 change_assign<monom_type>, project_ith<2>, 00069 deg_iterator> delayed_term_iterator; 00070 00071 typedef CRestrictedIter<delayed_term_iterator> bounded_iterator; 00072 00074 typedef CDegLexIter self; 00075 00076 // Constructor 00077 CDegLexIter(const delayed_term_iterator& start, 00078 const delayed_term_iterator& finish ): 00079 m_iter(std::max_element(start, finish)), m_start(start), m_finish(finish) { 00080 00081 } 00082 // Default Constructor 00083 CDegLexIter(): m_iter(), m_start(), m_finish() {} 00084 00086 reference operator*() const { 00087 return m_iter.term(); 00088 } 00089 00091 self& operator++() { 00092 if (m_iter != m_finish) { 00093 deg_type deg = *m_iter; 00094 ++m_iter; 00095 m_iter = std::find(m_iter, m_finish, deg); 00096 00097 if(m_iter == m_finish) { 00098 m_iter = std::max_element( bounded_iterator(m_start, deg), 00099 bounded_iterator(m_finish, deg) ); 00100 00101 } 00102 } 00103 00104 return *this; 00105 } 00106 00107 self operator++(int) { 00108 self result(*this); 00109 operator++(); 00110 return result; 00111 } 00112 00113 00114 bool_type operator!=(const self& rhs) const { 00115 return (m_iter != rhs.m_iter); 00116 } 00117 00118 bool_type operator==(const self& rhs) const { 00119 return (m_iter == rhs.m_iter); 00120 } 00121 00122 private: 00123 delayed_term_iterator m_iter, m_start, m_finish; 00124 }; 00125 00126 #endif 00127 00128 END_NAMESPACE_PBORI 00129 00130 #endif