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 /* 22 * Index Map2D implementation. 23 * 24 * Index Map2D is dynamic two dimensional array 25 */ 26 27 #ifndef _DBE_INDEXMAP2D_H 28 #define _DBE_INDEXMAP2D_H 29 30 #include <assert.h> 31 #include <vec.h> 32 #include <Map2D.h> 33 34 template <typename Key1_t, typename Key2_t, typename Value_t> 35 class IndexMap2D : public Map2D<Key1_t, Key2_t, Value_t> 36 { 37 public: 38 39 IndexMap2D (); 40 ~IndexMap2D (); 41 42 void put (Key1_t key1, Key2_t key2, Value_t val); 43 Value_t get (Key1_t key1, Key2_t key2); 44 Value_t get (Key1_t key1, Key2_t key2, 45 typename Map2D<Key1_t, Key2_t, Value_t>::Relation rel); 46 Value_t remove (Key1_t key1, Key2_t key2); 47 48 private: 49 50 Vector<Vector<Value_t>*> *map1; 51 }; 52 53 template <typename Key1_t, typename Key2_t, typename Value_t> 54 IndexMap2D<Key1_t, Key2_t, Value_t>::IndexMap2D () 55 { 56 map1 = new Vector<Vector<Value_t>*>; 57 } 58 59 template <typename Key1_t, typename Key2_t, typename Value_t> 60 IndexMap2D<Key1_t, Key2_t, Value_t>::~IndexMap2D () 61 { 62 map1->destroy (); 63 delete map1; 64 } 65 66 template <typename Key1_t, typename Key2_t, typename Value_t> 67 void 68 IndexMap2D<Key1_t, Key2_t, Value_t>::put (Key1_t key1, Key2_t key2, Value_t val) 69 { 70 if (key1 < 0 || key2 < 0) 71 return; 72 Vector<Value_t> *map2 = NULL; 73 if (key1 < map1->size ()) 74 map2 = map1->fetch ((int) key1); 75 if (map2 == NULL) 76 { 77 map2 = new Vector<Value_t>; 78 map1->store ((int) key1, map2); 79 } 80 map2->store ((int) key2, val); 81 } 82 83 template <typename Key1_t, typename Key2_t, typename Value_t> 84 Value_t 85 IndexMap2D<Key1_t, Key2_t, Value_t>::get (Key1_t key1, Key2_t key2) 86 { 87 if (key1 < 0 || key1 >= map1->size () || key2 < 0) 88 return (Value_t) 0; 89 Vector<Value_t> *map2 = map1->fetch ((int) key1); 90 if (map2 == NULL || key2 >= map2->size ()) 91 return (Value_t) 0; 92 return map2->fetch ((int) key2); 93 } 94 95 template <typename Key1_t, typename Key2_t, typename Value_t> 96 Value_t 97 IndexMap2D<Key1_t, Key2_t, Value_t>::get (Key1_t key1, Key2_t key2, 98 typename Map2D<Key1_t, Key2_t, Value_t>::Relation rel) 99 { 100 if (rel != Map2D<Key1_t, Key2_t, Value_t>::REL_EQEQ) 101 return (Value_t) 0; 102 return get (key1, key2); 103 } 104 105 template <typename Key1_t, typename Key2_t, typename Value_t> 106 Value_t 107 IndexMap2D<Key1_t, Key2_t, Value_t>::remove (Key1_t key1, Key2_t key2) 108 { 109 if (key1 < 0 || key1 >= map1->size () || key2 < 0) 110 return (Value_t) 0; 111 Vector<Value_t> *map2 = map1->fetch ((int) key1); 112 if (map2 == NULL || key2 >= map2->size ()) 113 return (Value_t) 0; 114 Value_t res = map2->fetch ((int) key2); 115 map2->store ((int) key2, (Value_t) 0); 116 return res; 117 } 118 119 #endif 120