PolyBoRi

CDegLexIter.h

Go to the documentation of this file.
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