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