1 /* Copyright (C) 2021-2024 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
)