PolyEntryIndices.h
Go to the documentation of this file.
// -*- c++ -*-
//*****************************************************************************
//*****************************************************************************
#ifndef polybori_groebner_PolyEntryIndices_h_
#define polybori_groebner_PolyEntryIndices_h_
// include basic definitions
#include "groebner_defs.h"
#include "PolyEntry.h"
BEGIN_NAMESPACE_PBORIGB
typedef Monomial::idx_map_type lm2Index_map_type;
typedef Exponent::idx_map_type exp2Index_map_type;
class PolyEntryIndices {
class check {};
class uncheck {};
public:
typedef Monomial::idx_map_type lm2Index_map_type;
typedef Exponent::idx_map_type exp2Index_map_type;
typedef lm2Index_map_type::value_type value_type;
typedef value_type::second_type data_type;
PolyEntryIndices():
lm2Index(), exp2Index() {}
void insert(const PolyEntry& entry, const data_type& rhs) {
exp2Index[entry.leadExp] = rhs;
lm2Index[entry.lead] = rhs;
}
void update(const Monomial& key, const PolyEntry& entry) {
if PBORI_UNLIKELY(entry.lead != key) {
lm2Index_map_type::iterator lm_pos = lm2Index.find(key);
PBORI_ASSERT(lm_pos != lm2Index.end());
lm2Index[entry.lead] = lm_pos->second;
exp2Index[entry.leadExp] = lm_pos->second;
lm2Index.erase(lm_pos);
exp2Index.erase(exp2Index.find(key.exp()));
}
}
template <class KeyType>
data_type operator()(const KeyType& key) const {
return get(key, uncheck());
}
template <class KeyType>
data_type checked(const KeyType& key) const {
return get(key, check());
}
protected:
template <class CheckType>
data_type get(data_type key, CheckType) const { return key; }
template <class CheckType>
data_type get(const Exponent& key, CheckType dummy) const {
return get(exp2Index, key, dummy);
}
template <class CheckType>
data_type get(const Monomial& key, CheckType dummy) const {
return get(lm2Index, key, dummy);
}
template <class CheckType>
data_type get(const PolyEntry& key, CheckType dummy) const {
return get(lm2Index, key.lead, dummy);
}
template <class MapType, class KeyType>
data_type get(const MapType& map, const KeyType& key, check) const {
typename MapType::const_iterator result(map.find(key));
if (result == map.end())
return (data_type)-1;
PBORI_ASSERT(result->second != data_type(-1));
return result->second;
}
template <class MapType, class KeyType>
data_type get(const MapType& map, const KeyType& key, uncheck) const {
typename MapType::const_iterator result(map.find(key));
PBORI_ASSERT(result != map.end());
return result->second;
}
private:
lm2Index_map_type lm2Index;
exp2Index_map_type exp2Index;
};
END_NAMESPACE_PBORIGB
#endif /* polybori_groebner_PolyEntryIndices_h_ */