1 /* Copyright (C) 2021 Free Software Foundation, Inc. 2 Contributed by Oracle. 3 4 This file is part of GNU Binutils. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, 51 Franklin Street - Fifth Floor, Boston, 19 MA 02110-1301, USA. */ 20 21 #ifndef _DBE_DEFAULTMAP2D_H 22 #define _DBE_DEFAULTMAP2D_H 23 24 #include <assert.h> 25 #include <vec.h> 26 #include <DefaultMap.h> 27 #include <IntervalMap.h> 28 #include <Map2D.h> 29 30 /* 31 * Default Map2D implementation. 32 * 33 * Default Map2D is a cartesian product of two default Maps. 34 */ 35 36 template <typename Key1_t, typename Key2_t, typename Value_t> 37 class DefaultMap2D : public Map2D<Key1_t, Key2_t, Value_t> 38 { 39 public: 40 DefaultMap2D (); 41 DefaultMap2D (typename Map2D<Key1_t, Key2_t, Value_t>::MapType _type); 42 ~DefaultMap2D (); 43 void put (Key1_t key1, Key2_t key2, Value_t val); 44 Value_t get (Key1_t key1, Key2_t key2); 45 Value_t get (Key1_t key1, Key2_t key2, 46 typename Map2D<Key1_t, Key2_t, Value_t>::Relation rel); 47 Value_t remove (Key1_t, Key2_t); 48 49 private: 50 typename Map2D<Key1_t, Key2_t, Value_t>::MapType type; 51 Map<Key1_t, Map<Key2_t, Value_t>*> *map1; 52 Vector<Map<Key2_t, Value_t>*> *map2list; 53 }; 54 55 template <typename Key1_t, typename Key2_t, typename Value_t> 56 DefaultMap2D<Key1_t, Key2_t, Value_t>::DefaultMap2D () 57 { 58 type = Map2D<Key1_t, Key2_t, Value_t>::Default; 59 map1 = new DefaultMap<Key1_t, Map<Key2_t, Value_t>*>; 60 map2list = new Vector<Map<Key2_t, Value_t>*>; 61 } 62 63 template <typename Key1_t, typename Key2_t, typename Value_t> 64 DefaultMap2D<Key1_t, Key2_t, Value_t>::DefaultMap2D ( 65 typename Map2D<Key1_t, Key2_t, Value_t>::MapType _type) 66 { 67 type = _type; 68 map1 = new DefaultMap<Key1_t, Map<Key2_t, Value_t>*>; 69 map2list = new Vector<Map<Key2_t, Value_t>*>; 70 } 71 72 template <typename Key1_t, typename Key2_t, typename Value_t> 73 DefaultMap2D<Key1_t, Key2_t, Value_t>::~DefaultMap2D () 74 { 75 map2list->destroy (); 76 delete map2list; 77 delete map1; 78 } 79 80 template <typename Key1_t, typename Key2_t, typename Value_t> 81 void 82 DefaultMap2D<Key1_t, Key2_t, Value_t>::put (Key1_t key1, Key2_t key2, Value_t val) 83 { 84 Map<Key2_t, Value_t> *map2 = map1->get (key1); 85 if (map2 == NULL) 86 { 87 if (type == Map2D<Key1_t, Key2_t, Value_t>::Interval) 88 map2 = new IntervalMap<Key2_t, Value_t>; 89 else 90 map2 = new DefaultMap<Key2_t, Value_t>; 91 map2list->append (map2); 92 map1->put (key1, map2); 93 } 94 map2->put (key2, val); 95 } 96 97 template <typename Key1_t, typename Key2_t, typename Value_t> 98 Value_t 99 DefaultMap2D<Key1_t, Key2_t, Value_t>::get (Key1_t key1, Key2_t key2) 100 { 101 Map<Key2_t, Value_t> *map2 = map1->get (key1); 102 if (map2 == NULL) 103 return (Value_t) 0; 104 return map2->get (key2); 105 } 106 107 template <typename Key1_t, typename Key2_t, typename Value_t> 108 Value_t 109 DefaultMap2D<Key1_t, Key2_t, Value_t>::get (Key1_t key1, Key2_t key2, 110 typename Map2D<Key1_t, Key2_t, Value_t>::Relation rel) 111 { 112 Map<Key2_t, Value_t> *map2 = map1->get (key1); 113 if (map2 == NULL) 114 return (Value_t) 0; 115 typename Map<Key2_t, Value_t>::Relation rel2; 116 switch (rel) 117 { 118 case Map2D<Key1_t, Key2_t, Value_t>::REL_EQLT: 119 rel2 = map2->REL_LT; 120 break; 121 case Map2D<Key1_t, Key2_t, Value_t>::REL_EQLE: 122 rel2 = map2->REL_LE; 123 break; 124 case Map2D<Key1_t, Key2_t, Value_t>::REL_EQGE: 125 rel2 = map2->REL_GE; 126 break; 127 case Map2D<Key1_t, Key2_t, Value_t>::REL_EQGT: 128 rel2 = map2->REL_GT; 129 break; 130 default: 131 rel2 = map2->REL_EQ; 132 break; 133 } 134 return map2->get (key2, rel2); 135 } 136 137 template <typename Key1_t, typename Key2_t, typename Value_t> 138 Value_t 139 DefaultMap2D<Key1_t, Key2_t, Value_t>::remove (Key1_t, Key2_t) 140 { 141 // Not implemented 142 if (1) 143 assert (0); 144 return (Value_t) 0; 145 } 146 147 #endif 148