PolyBoRi
CBlockOrderingFacade.h
Go to the documentation of this file.
1 // -*- c++ -*-
2 //*****************************************************************************
14 //*****************************************************************************
15 
16 #ifndef polybori_orderings_CBlockOrderingFacade_h_
17 #define polybori_orderings_CBlockOrderingFacade_h_
18 
19 #include "COrderingFacade.h"
20 
22 
27 template <class OrderType, class OrderTag>
29  public COrderingFacade <OrderType, OrderTag> {
30 
31  typedef CBlockOrderingFacade self;
33 
34 public:
35 
37  typedef self base;
38 
40 
42  typedef typename base_type::poly_type poly_type;
44  typedef typename base_type::exp_type exp_type;
45  typedef typename base_type::deg_type deg_type;
46  typedef typename base_type::set_type set_type;
47  typedef typename base_type::comp_type comp_type;
49 
51  CBlockOrderingFacade(): base_type(), m_indices() {
52  m_indices.push_back(0);
53  m_indices.push_back(CTypes::max_index());
54  };
55 
57  CBlockOrderingFacade(const self& rhs): base_type(rhs), m_indices(rhs.m_indices) {};
58 
60  ~CBlockOrderingFacade() = 0;
61 
63 
64  COrderingBase::block_iterator blockBegin() const { return m_indices.begin() + 1; }
65  COrderingBase::block_iterator blockEnd() const { return m_indices.end(); }
66 
68 
69  // by checked_idx_type idx should always be <= max(int) (== blockEnd() - 1)
70  PBORI_ASSERT(idx <= *(blockEnd() - 1));
71 
72  if PBORI_UNLIKELY((idx >= CTypes::max_index()) || (idx <= *(blockEnd() - 2)))
73  throw std::runtime_error("Blocks must be positive and have to be "
74  "added in a strictly increasing order.");
75 
76  m_indices.back() = idx;
77  m_indices.push_back(CTypes::max_index());
78  }
79 
80  void clearBlocks() {
81  m_indices.clear();
82  m_indices.push_back(0);
83  m_indices.push_back(CTypes::max_index());
84  }
86 
88  monom_type lead(const poly_type& poly) const {
89 
90  CBlockDegreeCache<set_type> blockDegCache(poly.ring());
91  CacheManager<order_lead_tag> cache_mgr(poly.ring());
92  typename base_type::descending_property descending;
93 
94  return base_type::monom( dd_block_degree_lead(cache_mgr, blockDegCache,
95  poly.navigation(), m_indices.begin(),
96  set_type(poly.ring()), descending) );
97  }
98 
101  monom_type lead(const poly_type& poly, deg_type) const {
102  return lead(poly);
103  }
104 
106  exp_type leadExp(const poly_type& poly) const {
107  return lead(poly).exp();
108  }
109 
112  exp_type leadExp(const poly_type& poly, deg_type) const {
113  return leadExp(poly);
114  }
115 
116 protected:
117 
119  template <class TermType, class BinOpType>
120  comp_type compare_terms(const TermType& lhs, const TermType& rhs,
121  const BinOpType& idx_comparer) const {
122 
123  return block_dlex_compare(lhs.begin(), lhs.end(),rhs.begin(), rhs.end(),
124  blockBegin(), blockEnd(), idx_comparer);
125  }
126 
129 };
130 
131 template <class OrderType, class OrderTag>
133 
135 
136 #endif