]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gprofng/src/DefaultMap2D.h
Update year range in gprofng copyright notices
[thirdparty/binutils-gdb.git] / gprofng / src / DefaultMap2D.h
1 /* Copyright (C) 2021-2023 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