]> Git Repo - binutils.git/blob - gprofng/src/DefaultMap2D.h
Automatic date update in version.in
[binutils.git] / gprofng / src / DefaultMap2D.h
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
This page took 0.031634 seconds and 4 git commands to generate.