PolyBoRi
CBlockOrderingFacade.h
Go to the documentation of this file.
00001 // -*- c++ -*-
00002 //*****************************************************************************
00014 //*****************************************************************************
00015 
00016 #include "COrderingFacade.h"
00017 
00018 #ifndef CBlockOrderingFacade_h_
00019 #define CBlockOrderingFacade_h_
00020 
00021 
00022 BEGIN_NAMESPACE_PBORI
00023 
00028 template <class OrderType, class OrderTag>
00029 class CBlockOrderingFacade:
00030   public COrderingFacade <OrderType, OrderTag> {
00031 
00032   typedef CBlockOrderingFacade self;
00033   typedef COrderingFacade<OrderType, OrderTag> base_type;
00034 
00035 public:
00036 
00038   typedef self base;
00039 
00041 
00042   typedef typename base_type::order_lead_tag order_lead_tag;
00043   typedef typename base_type::poly_type poly_type;
00044   typedef typename base_type::monom_type monom_type;
00045   typedef typename base_type::exp_type exp_type;
00046   typedef typename base_type::deg_type deg_type;
00047   typedef typename base_type::set_type set_type;
00048   typedef typename base_type::comp_type comp_type;
00050 
00052   CBlockOrderingFacade(): base_type(), m_indices() {
00053     m_indices.push_back(0);
00054     m_indices.push_back(CTypes::max_index()); 
00055   };
00056 
00058   CBlockOrderingFacade(const self& rhs): base_type(rhs), m_indices(rhs.m_indices) {};
00059 
00061   ~CBlockOrderingFacade() = 0;
00062 
00064 
00065   COrderingBase::block_iterator blockBegin() const { return m_indices.begin() + 1; }
00066   COrderingBase::block_iterator blockEnd() const { return m_indices.end(); }
00067 
00068   void appendBlock(COrderingBase::checked_idx_type idx) {
00069 
00070     // by checked_idx_type idx should always be <= max(int) (== blockEnd() - 1)
00071     assert(idx <= *(blockEnd() - 1));
00072 
00073     if UNLIKELY((idx >= CTypes::max_index()) || (idx <= *(blockEnd() - 2)))
00074       throw std::runtime_error("Blocks must be positive and have to be "
00075                                "added in a strictly increasing order.");
00076 
00077     m_indices.back() = idx;
00078     m_indices.push_back(CTypes::max_index());
00079   }
00080 
00081   void clearBlocks() {
00082     m_indices.clear();
00083     m_indices.push_back(0); 
00084     m_indices.push_back(CTypes::max_index());
00085   }
00087 
00089   monom_type lead(const poly_type& poly) const {
00090 
00091     CBlockDegreeCache<set_type> blockDegCache(poly.ring());
00092     CacheManager<order_lead_tag> cache_mgr(poly.ring());
00093     typename base_type::descending_property descending;
00094 
00095     return monom(  dd_block_degree_lead(cache_mgr, blockDegCache, 
00096                                         poly.navigation(), m_indices.begin(),
00097                                         set_type(), descending) );
00098   }
00099 
00102   monom_type lead(const poly_type& poly, deg_type) const {
00103     return lead(poly); 
00104   }
00105 
00107   exp_type leadExp(const poly_type& poly) const {
00108     return lead(poly).exp();
00109   }
00110 
00113   exp_type leadExp(const poly_type& poly, deg_type) const {
00114     return leadExp(poly);
00115   }
00116 
00117 protected:
00118 
00120   template <class TermType, class BinOpType>
00121   comp_type compare_terms(const TermType& lhs, const TermType& rhs,
00122                           const BinOpType& idx_comparer) const {
00123   
00124     return block_dlex_compare(lhs.begin(), lhs.end(),rhs.begin(), rhs.end(),
00125                               blockBegin(), blockEnd(), idx_comparer);
00126   }
00127 
00129   COrderingBase::block_idx_type m_indices;
00130 };
00131 
00132 template <class OrderType, class OrderTag>
00133 inline CBlockOrderingFacade<OrderType, OrderTag>::~CBlockOrderingFacade() {}
00134 
00135 END_NAMESPACE_PBORI
00136 
00137 #endif