]>
Commit | Line | Data |
---|---|---|
4569a895 AT |
1 | // -*- C++ -*- |
2 | ||
a345e45d | 3 | // Copyright (C) 2005, 2006, 2009, 2011 Free Software Foundation, Inc. |
4569a895 AT |
4 | // |
5 | // This file is part of the GNU ISO C++ Library. This library is free | |
6 | // software; you can redistribute it and/or modify it under the terms | |
7 | // of the GNU General Public License as published by the Free Software | |
748086b7 | 8 | // Foundation; either version 3, or (at your option) any later |
4569a895 AT |
9 | // version. |
10 | ||
11 | // This library is distributed in the hope that it will be useful, but | |
12 | // WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | // General Public License for more details. | |
15 | ||
748086b7 JJ |
16 | // Under Section 7 of GPL version 3, you are granted additional |
17 | // permissions described in the GCC Runtime Library Exception, version | |
18 | // 3.1, as published by the Free Software Foundation. | |
19 | ||
20 | // You should have received a copy of the GNU General Public License and | |
21 | // a copy of the GCC Runtime Library Exception along with this program; | |
22 | // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |
23 | // <http://www.gnu.org/licenses/>. | |
4569a895 AT |
24 | |
25 | // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL. | |
26 | ||
27 | // Permission to use, copy, modify, sell, and distribute this software | |
28 | // is hereby granted without fee, provided that the above copyright | |
29 | // notice appears in all copies, and that both that copyright notice | |
30 | // and this permission notice appear in supporting documentation. None | |
31 | // of the above authors, nor IBM Haifa Research Laboratories, make any | |
32 | // representation about the suitability of this software for any | |
33 | // purpose. It is provided "as is" without express or implied | |
34 | // warranty. | |
35 | ||
36 | /** | |
37 | * @file container_base_dispatch.hpp | |
a345e45d | 38 | * Contains associative container dispatching. |
4569a895 AT |
39 | */ |
40 | ||
41 | #ifndef PB_DS_ASSOC_CNTNR_BASE_DS_DISPATCHER_HPP | |
42 | #define PB_DS_ASSOC_CNTNR_BASE_DS_DISPATCHER_HPP | |
43 | ||
d7f245b1 | 44 | #include <ext/typelist.h> |
4569a895 | 45 | |
cfca3f72 FD |
46 | #define PB_DS_ASSERT_VALID(X) \ |
47 | _GLIBCXX_DEBUG_ONLY(X.assert_valid(__FILE__, __LINE__);) | |
48 | ||
49 | #define PB_DS_DEBUG_VERIFY(_Cond) \ | |
50 | _GLIBCXX_DEBUG_VERIFY_AT(_Cond, \ | |
51 | _M_message(#_Cond" assertion from %1;:%2;") \ | |
52 | ._M_string(__FILE__)._M_integer(__LINE__) \ | |
53 | ,__file,__line) | |
54 | ||
55 | #define PB_DS_CHECK_KEY_EXISTS(_Key) \ | |
56 | _GLIBCXX_DEBUG_ONLY(debug_base::check_key_exists(_Key, __FILE__, __LINE__);) | |
57 | ||
58 | #define PB_DS_CHECK_KEY_DOES_NOT_EXIST(_Key) \ | |
59 | _GLIBCXX_DEBUG_ONLY(debug_base::check_key_does_not_exist(_Key, \ | |
60 | __FILE__, __LINE__);) | |
61 | ||
4569a895 | 62 | #define PB_DS_DATA_TRUE_INDICATOR |
a345e45d BK |
63 | #define PB_DS_V2F(X) (X).first |
64 | #define PB_DS_V2S(X) (X).second | |
65 | #define PB_DS_EP2VP(X)& ((X)->m_value) | |
4569a895 | 66 | #include <ext/pb_ds/detail/list_update_map_/lu_map_.hpp> |
a345e45d | 67 | #include <ext/pb_ds/detail/bin_search_tree_/bin_search_tree_.hpp> |
4569a895 | 68 | #include <ext/pb_ds/detail/rb_tree_map_/rb_tree_.hpp> |
4569a895 | 69 | #include <ext/pb_ds/detail/splay_tree_/splay_tree_.hpp> |
4569a895 | 70 | #include <ext/pb_ds/detail/ov_tree_map_/ov_tree_map_.hpp> |
4569a895 | 71 | #include <ext/pb_ds/detail/cc_hash_table_map_/cc_ht_map_.hpp> |
4569a895 | 72 | #include <ext/pb_ds/detail/gp_hash_table_map_/gp_ht_map_.hpp> |
4569a895 AT |
73 | #include <ext/pb_ds/detail/pat_trie_/pat_trie_.hpp> |
74 | #undef PB_DS_DATA_TRUE_INDICATOR | |
a345e45d BK |
75 | #undef PB_DS_V2F |
76 | #undef PB_DS_V2S | |
77 | #undef PB_DS_EP2VP | |
4569a895 AT |
78 | |
79 | #define PB_DS_DATA_FALSE_INDICATOR | |
a345e45d BK |
80 | #define PB_DS_V2F(X) (X) |
81 | #define PB_DS_V2S(X) Mapped_Data() | |
82 | #define PB_DS_EP2VP(X)& ((X)->m_value.first) | |
83 | #include <ext/pb_ds/detail/list_update_map_/lu_map_.hpp> | |
84 | #include <ext/pb_ds/detail/bin_search_tree_/bin_search_tree_.hpp> | |
85 | #include <ext/pb_ds/detail/rb_tree_map_/rb_tree_.hpp> | |
86 | #include <ext/pb_ds/detail/splay_tree_/splay_tree_.hpp> | |
87 | #include <ext/pb_ds/detail/ov_tree_map_/ov_tree_map_.hpp> | |
88 | #include <ext/pb_ds/detail/cc_hash_table_map_/cc_ht_map_.hpp> | |
89 | #include <ext/pb_ds/detail/gp_hash_table_map_/gp_ht_map_.hpp> | |
4569a895 AT |
90 | #include <ext/pb_ds/detail/pat_trie_/pat_trie_.hpp> |
91 | #undef PB_DS_DATA_FALSE_INDICATOR | |
a345e45d BK |
92 | #undef PB_DS_V2F |
93 | #undef PB_DS_V2S | |
94 | #undef PB_DS_EP2VP | |
4569a895 | 95 | |
cfca3f72 FD |
96 | #undef PB_DS_CHECK_KEY_DOES_NOT_EXIST |
97 | #undef PB_DS_CHECK_KEY_EXISTS | |
98 | #undef PB_DS_DEBUG_VERIFY | |
99 | #undef PB_DS_ASSERT_VALID | |
100 | ||
5e11f978 | 101 | namespace __gnu_pbds |
4569a895 | 102 | { |
d7f245b1 BK |
103 | namespace detail |
104 | { | |
a345e45d BK |
105 | /// Specialization for list-update map. |
106 | template<typename Key, typename Mapped, typename _Alloc, typename Policy_Tl> | |
107 | struct container_base_dispatch<Key, Mapped, _Alloc, list_update_tag, | |
108 | Policy_Tl> | |
d7f245b1 BK |
109 | { |
110 | private: | |
111 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; | |
112 | typedef typename at0::type at0t; | |
113 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; | |
114 | typedef typename at1::type at1t; | |
a345e45d | 115 | |
d7f245b1 | 116 | public: |
a345e45d BK |
117 | /// Dispatched type. |
118 | typedef lu_map<Key, Mapped, at0t, _Alloc, at1t> type; | |
d7f245b1 BK |
119 | }; |
120 | ||
a345e45d BK |
121 | /// Specialization for list-update set. |
122 | template<typename Key, typename _Alloc, typename Policy_Tl> | |
123 | struct container_base_dispatch<Key, null_type, _Alloc, list_update_tag, | |
124 | Policy_Tl> | |
d7f245b1 BK |
125 | { |
126 | private: | |
127 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; | |
128 | typedef typename at0::type at0t; | |
129 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; | |
130 | typedef typename at1::type at1t; | |
131 | ||
132 | public: | |
a345e45d BK |
133 | /// Dispatched type. |
134 | typedef lu_set<Key, null_type, at0t, _Alloc, at1t> type; | |
d7f245b1 BK |
135 | }; |
136 | ||
a345e45d BK |
137 | /// Specialization for PATRICIA trie map. |
138 | template<typename Key, typename Mapped, typename _Alloc, typename Policy_Tl> | |
139 | struct container_base_dispatch<Key, Mapped, _Alloc, pat_trie_tag, Policy_Tl> | |
4569a895 | 140 | { |
d7f245b1 BK |
141 | private: |
142 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; | |
143 | typedef typename at1::type at1t; | |
4569a895 | 144 | |
d7f245b1 | 145 | public: |
a345e45d | 146 | typedef pat_trie_map<Key, Mapped, at1t, _Alloc> type; |
d7f245b1 BK |
147 | }; |
148 | ||
a345e45d BK |
149 | /// Specialization for PATRICIA trie set. |
150 | template<typename Key, typename _Alloc, typename Policy_Tl> | |
151 | struct container_base_dispatch<Key, null_type, _Alloc, pat_trie_tag, | |
152 | Policy_Tl> | |
d7f245b1 BK |
153 | { |
154 | private: | |
155 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; | |
156 | typedef typename at1::type at1t; | |
157 | ||
158 | public: | |
a345e45d BK |
159 | /// Dispatched type. |
160 | typedef pat_trie_set<Key, null_type, at1t, _Alloc> type; | |
d7f245b1 BK |
161 | }; |
162 | ||
a345e45d BK |
163 | /// Specialization for R-B tree map. |
164 | template<typename Key, typename Mapped, typename _Alloc, typename Policy_Tl> | |
165 | struct container_base_dispatch<Key, Mapped, _Alloc, rb_tree_tag, Policy_Tl> | |
d7f245b1 BK |
166 | { |
167 | private: | |
168 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; | |
169 | typedef typename at0::type at0t; | |
170 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; | |
171 | typedef typename at1::type at1t; | |
172 | ||
173 | public: | |
a345e45d BK |
174 | /// Dispatched type. |
175 | typedef rb_tree_map<Key, Mapped, at0t, at1t, _Alloc> type; | |
d7f245b1 BK |
176 | }; |
177 | ||
a345e45d BK |
178 | /// Specialization for R-B tree set. |
179 | template<typename Key, typename _Alloc, typename Policy_Tl> | |
180 | struct container_base_dispatch<Key, null_type, _Alloc, rb_tree_tag, | |
181 | Policy_Tl> | |
d7f245b1 BK |
182 | { |
183 | private: | |
184 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; | |
185 | typedef typename at0::type at0t; | |
186 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; | |
187 | typedef typename at1::type at1t; | |
188 | ||
189 | public: | |
a345e45d | 190 | typedef rb_tree_set<Key, null_type, at0t, at1t, _Alloc> type; |
d7f245b1 BK |
191 | }; |
192 | ||
a345e45d BK |
193 | /// Specialization splay tree map. |
194 | template<typename Key, typename Mapped, typename _Alloc, typename Policy_Tl> | |
195 | struct container_base_dispatch<Key, Mapped, _Alloc, splay_tree_tag, | |
196 | Policy_Tl> | |
d7f245b1 BK |
197 | { |
198 | private: | |
199 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; | |
200 | typedef typename at0::type at0t; | |
201 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; | |
202 | typedef typename at1::type at1t; | |
203 | ||
204 | public: | |
a345e45d BK |
205 | /// Dispatched type. |
206 | typedef splay_tree_map<Key, Mapped, at0t, at1t, _Alloc> type; | |
d7f245b1 BK |
207 | }; |
208 | ||
a345e45d BK |
209 | /// Specialization splay tree set. |
210 | template<typename Key, typename _Alloc, typename Policy_Tl> | |
211 | struct container_base_dispatch<Key, null_type, _Alloc, splay_tree_tag, | |
212 | Policy_Tl> | |
d7f245b1 BK |
213 | { |
214 | private: | |
215 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; | |
216 | typedef typename at0::type at0t; | |
217 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; | |
218 | typedef typename at1::type at1t; | |
219 | ||
220 | public: | |
a345e45d BK |
221 | /// Dispatched type. |
222 | typedef splay_tree_set<Key, null_type, at0t, at1t, _Alloc> type; | |
d7f245b1 BK |
223 | }; |
224 | ||
a345e45d BK |
225 | /// Specialization ordered-vector tree map. |
226 | template<typename Key, typename Mapped, typename _Alloc, typename Policy_Tl> | |
227 | struct container_base_dispatch<Key, Mapped, _Alloc, ov_tree_tag, Policy_Tl> | |
d7f245b1 BK |
228 | { |
229 | private: | |
230 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; | |
231 | typedef typename at0::type at0t; | |
232 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; | |
233 | typedef typename at1::type at1t; | |
234 | ||
235 | public: | |
a345e45d BK |
236 | /// Dispatched type. |
237 | typedef ov_tree_map<Key, Mapped, at0t, at1t, _Alloc> type; | |
d7f245b1 BK |
238 | }; |
239 | ||
a345e45d BK |
240 | /// Specialization ordered-vector tree set. |
241 | template<typename Key, typename _Alloc, typename Policy_Tl> | |
242 | struct container_base_dispatch<Key, null_type, _Alloc, ov_tree_tag, | |
243 | Policy_Tl> | |
d7f245b1 BK |
244 | { |
245 | private: | |
246 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; | |
247 | typedef typename at0::type at0t; | |
248 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; | |
249 | typedef typename at1::type at1t; | |
250 | ||
251 | public: | |
a345e45d BK |
252 | /// Dispatched type. |
253 | typedef ov_tree_set<Key, null_type, at0t, at1t, _Alloc> type; | |
d7f245b1 BK |
254 | }; |
255 | ||
a345e45d BK |
256 | /// Specialization colision-chaining hash map. |
257 | template<typename Key, typename Mapped, typename _Alloc, typename Policy_Tl> | |
258 | struct container_base_dispatch<Key, Mapped, _Alloc, cc_hash_tag, Policy_Tl> | |
d7f245b1 BK |
259 | { |
260 | private: | |
261 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; | |
262 | typedef typename at0::type at0t; | |
263 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; | |
264 | typedef typename at1::type at1t; | |
265 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 2> at2; | |
266 | typedef typename at2::type at2t; | |
267 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 3> at3; | |
268 | typedef typename at3::type at3t; | |
269 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 4> at4; | |
270 | typedef typename at4::type at4t; | |
271 | ||
272 | public: | |
a345e45d BK |
273 | /// Dispatched type. |
274 | typedef cc_ht_map<Key, Mapped, at0t, at1t, _Alloc, | |
275 | at3t::value, at4t, at2t> type; | |
d7f245b1 BK |
276 | }; |
277 | ||
a345e45d BK |
278 | /// Specialization colision-chaining hash set. |
279 | template<typename Key, typename _Alloc, typename Policy_Tl> | |
280 | struct container_base_dispatch<Key, null_type, _Alloc, cc_hash_tag, | |
281 | Policy_Tl> | |
d7f245b1 BK |
282 | { |
283 | private: | |
284 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; | |
285 | typedef typename at0::type at0t; | |
286 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; | |
287 | typedef typename at1::type at1t; | |
288 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 2> at2; | |
289 | typedef typename at2::type at2t; | |
290 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 3> at3; | |
291 | typedef typename at3::type at3t; | |
292 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 4> at4; | |
293 | typedef typename at4::type at4t; | |
294 | ||
295 | public: | |
a345e45d BK |
296 | /// Dispatched type. |
297 | typedef cc_ht_set<Key, null_type, at0t, at1t, _Alloc, | |
d7f245b1 BK |
298 | at3t::value, at4t, at2t> type; |
299 | }; | |
300 | ||
a345e45d BK |
301 | /// Specialization general-probe hash map. |
302 | template<typename Key, typename Mapped, typename _Alloc, typename Policy_Tl> | |
303 | struct container_base_dispatch<Key, Mapped, _Alloc, gp_hash_tag, Policy_Tl> | |
d7f245b1 BK |
304 | { |
305 | private: | |
306 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; | |
307 | typedef typename at0::type at0t; | |
308 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; | |
309 | typedef typename at1::type at1t; | |
310 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 2> at2; | |
311 | typedef typename at2::type at2t; | |
312 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 3> at3; | |
313 | typedef typename at3::type at3t; | |
314 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 4> at4; | |
315 | typedef typename at4::type at4t; | |
316 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 5> at5; | |
317 | typedef typename at5::type at5t; | |
318 | ||
319 | public: | |
a345e45d BK |
320 | /// Dispatched type. |
321 | typedef gp_ht_map<Key, Mapped, at0t, at1t, _Alloc, | |
322 | at3t::value, at4t, at5t, at2t> type; | |
d7f245b1 BK |
323 | }; |
324 | ||
a345e45d BK |
325 | /// Specialization general-probe hash set. |
326 | template<typename Key, typename _Alloc, typename Policy_Tl> | |
327 | struct container_base_dispatch<Key, null_type, _Alloc, gp_hash_tag, | |
328 | Policy_Tl> | |
d7f245b1 BK |
329 | { |
330 | private: | |
331 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0> at0; | |
332 | typedef typename at0::type at0t; | |
333 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1> at1; | |
334 | typedef typename at1::type at1t; | |
335 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 2> at2; | |
336 | typedef typename at2::type at2t; | |
337 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 3> at3; | |
338 | typedef typename at3::type at3t; | |
339 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 4> at4; | |
340 | typedef typename at4::type at4t; | |
341 | typedef __gnu_cxx::typelist::at_index<Policy_Tl, 5> at5; | |
342 | typedef typename at5::type at5t; | |
343 | ||
344 | public: | |
a345e45d BK |
345 | /// Dispatched type. |
346 | typedef gp_ht_set<Key, null_type, at0t, at1t, _Alloc, | |
347 | at3t::value, at4t, at5t, at2t> type; | |
d7f245b1 BK |
348 | }; |
349 | } // namespace detail | |
5e11f978 | 350 | } // namespace __gnu_pbds |
4569a895 | 351 | |
a345e45d | 352 | #endif |