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