1 /* Copyright (C) 2021 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
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)
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.
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. */
21 #ifndef _DBE_DEFAULTMAP2D_H
22 #define _DBE_DEFAULTMAP2D_H
26 #include <DefaultMap.h>
27 #include <IntervalMap.h>
31 * Default Map2D implementation.
33 * Default Map2D is a cartesian product of two default Maps.
36 template <typename Key1_t, typename Key2_t, typename Value_t>
37 class DefaultMap2D : public Map2D<Key1_t, Key2_t, Value_t>
41 DefaultMap2D (typename Map2D<Key1_t, Key2_t, Value_t>::MapType _type);
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);
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;
55 template <typename Key1_t, typename Key2_t, typename Value_t>
56 DefaultMap2D<Key1_t, Key2_t, Value_t>::DefaultMap2D ()
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>*>;
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)
68 map1 = new DefaultMap<Key1_t, Map<Key2_t, Value_t>*>;
69 map2list = new Vector<Map<Key2_t, Value_t>*>;
72 template <typename Key1_t, typename Key2_t, typename Value_t>
73 DefaultMap2D<Key1_t, Key2_t, Value_t>::~DefaultMap2D ()
80 template <typename Key1_t, typename Key2_t, typename Value_t>
82 DefaultMap2D<Key1_t, Key2_t, Value_t>::put (Key1_t key1, Key2_t key2, Value_t val)
84 Map<Key2_t, Value_t> *map2 = map1->get (key1);
87 if (type == Map2D<Key1_t, Key2_t, Value_t>::Interval)
88 map2 = new IntervalMap<Key2_t, Value_t>;
90 map2 = new DefaultMap<Key2_t, Value_t>;
91 map2list->append (map2);
92 map1->put (key1, map2);
94 map2->put (key2, val);
97 template <typename Key1_t, typename Key2_t, typename Value_t>
99 DefaultMap2D<Key1_t, Key2_t, Value_t>::get (Key1_t key1, Key2_t key2)
101 Map<Key2_t, Value_t> *map2 = map1->get (key1);
104 return map2->get (key2);
107 template <typename Key1_t, typename Key2_t, typename 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)
112 Map<Key2_t, Value_t> *map2 = map1->get (key1);
115 typename Map<Key2_t, Value_t>::Relation rel2;
118 case Map2D<Key1_t, Key2_t, Value_t>::REL_EQLT:
121 case Map2D<Key1_t, Key2_t, Value_t>::REL_EQLE:
124 case Map2D<Key1_t, Key2_t, Value_t>::REL_EQGE:
127 case Map2D<Key1_t, Key2_t, Value_t>::REL_EQGT:
134 return map2->get (key2, rel2);
137 template <typename Key1_t, typename Key2_t, typename Value_t>
139 DefaultMap2D<Key1_t, Key2_t, Value_t>::remove (Key1_t, Key2_t)