PolyBoRi
PolyEntryIndices.h
Go to the documentation of this file.
00001 // -*- c++ -*-
00002 //*****************************************************************************
00014 //*****************************************************************************
00015 
00016 #ifndef polybori_groebner_PolyEntryIndices_h_
00017 #define polybori_groebner_PolyEntryIndices_h_
00018 
00019 // include basic definitions
00020 #include "groebner_defs.h"
00021 #include "PolyEntry.h"
00022 
00023 BEGIN_NAMESPACE_PBORIGB
00024 
00025 typedef Monomial::idx_map_type lm2Index_map_type;
00026 typedef Exponent::idx_map_type exp2Index_map_type;
00027 
00033 class PolyEntryIndices {
00034 
00035   class check {};
00036   class uncheck {};
00037 
00038 public:
00039   typedef Monomial::idx_map_type lm2Index_map_type;
00040   typedef Exponent::idx_map_type exp2Index_map_type;
00041   typedef lm2Index_map_type::value_type value_type;
00042   typedef value_type::second_type data_type;
00043 
00044   PolyEntryIndices():
00045     lm2Index(), exp2Index() {}
00046 
00048   void insert(const PolyEntry& entry, const data_type& rhs) {
00049     exp2Index[entry.leadExp] = rhs;
00050     lm2Index[entry.lead] = rhs;
00051   }
00052 
00054   void update(const Monomial& key, const PolyEntry& entry) {
00055 
00056     if PBORI_UNLIKELY(entry.lead != key) {
00057       lm2Index_map_type::iterator lm_pos = lm2Index.find(key);
00058       PBORI_ASSERT(lm_pos != lm2Index.end());
00059       lm2Index[entry.lead] = lm_pos->second;
00060       exp2Index[entry.leadExp] = lm_pos->second;
00061       lm2Index.erase(lm_pos);
00062       exp2Index.erase(exp2Index.find(key.exp()));
00063     }
00064   }
00065 
00067   template <class KeyType>
00068   data_type operator()(const KeyType& key) const {
00069     return get(key, uncheck());
00070   }
00071 
00073   template <class KeyType>
00074   data_type checked(const KeyType& key) const {
00075     return get(key, check());
00076   }
00077 
00078 protected:
00079 
00080 
00081   template <class CheckType>
00082   data_type get(data_type key, CheckType) const { return key; }
00083 
00084   template <class CheckType>
00085   data_type get(const Exponent& key, CheckType dummy) const {
00086     return get(exp2Index, key, dummy);
00087   }
00088 
00089   template <class CheckType>
00090   data_type get(const Monomial& key, CheckType dummy) const {
00091     return get(lm2Index, key, dummy);
00092   }
00093 
00094   template <class CheckType>
00095   data_type get(const PolyEntry& key, CheckType dummy) const {
00096     return get(lm2Index, key.lead, dummy);
00097   }
00098 
00099   template <class MapType, class KeyType>
00100   data_type get(const MapType& map, const KeyType& key, check) const {
00101 
00102     typename MapType::const_iterator result(map.find(key));
00103 
00104     if (result == map.end())
00105       return (data_type)-1;
00106 
00107     PBORI_ASSERT(result->second != data_type(-1));
00108     return result->second;
00109   }
00110 
00111   template <class MapType, class KeyType>
00112   data_type get(const MapType& map, const KeyType& key, uncheck) const {
00113 
00114     typename MapType::const_iterator result(map.find(key));
00115     PBORI_ASSERT(result != map.end());
00116     return result->second;
00117   }
00118 
00119 private:
00120   lm2Index_map_type lm2Index;
00121   exp2Index_map_type exp2Index;
00122 };
00123 
00124 
00125 END_NAMESPACE_PBORIGB
00126 
00127 #endif /* polybori_groebner_PolyEntryIndices_h_ */