PolyBoRi
|
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