Import GCC-8 to a new vendor branch
[dragonfly.git] / contrib / gcc-8.0 / libstdc++-v3 / include / ext / pb_ds / detail / container_base_dispatch.hpp
1 // -*- C++ -*-
2
3 // Copyright (C) 2005-2018 Free Software Foundation, Inc.
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
8 // Foundation; either version 3, or (at your option) any later
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
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/>.
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
38  * Contains associative container dispatching.
39  */
40
41 #ifndef PB_DS_ASSOC_CNTNR_BASE_DS_DISPATCHER_HPP
42 #define PB_DS_ASSOC_CNTNR_BASE_DS_DISPATCHER_HPP
43
44 #include <ext/typelist.h>
45
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
62 #define PB_DS_DATA_TRUE_INDICATOR
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)
66 #include <ext/pb_ds/detail/list_update_map_/lu_map_.hpp>
67 #include <ext/pb_ds/detail/bin_search_tree_/bin_search_tree_.hpp>
68 #include <ext/pb_ds/detail/rb_tree_map_/rb_tree_.hpp>
69 #include <ext/pb_ds/detail/splay_tree_/splay_tree_.hpp>
70 #include <ext/pb_ds/detail/ov_tree_map_/ov_tree_map_.hpp>
71 #include <ext/pb_ds/detail/cc_hash_table_map_/cc_ht_map_.hpp>
72 #include <ext/pb_ds/detail/gp_hash_table_map_/gp_ht_map_.hpp>
73 #include <ext/pb_ds/detail/pat_trie_/pat_trie_.hpp>
74 #undef PB_DS_DATA_TRUE_INDICATOR
75 #undef PB_DS_V2F
76 #undef PB_DS_V2S
77 #undef PB_DS_EP2VP
78
79 #define PB_DS_DATA_FALSE_INDICATOR
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>
90 #include <ext/pb_ds/detail/pat_trie_/pat_trie_.hpp>
91 #undef PB_DS_DATA_FALSE_INDICATOR
92 #undef PB_DS_V2F
93 #undef PB_DS_V2S
94 #undef PB_DS_EP2VP
95
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
101 namespace __gnu_pbds
102 {
103 namespace detail
104 {
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>
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;
115
116     public:
117       /// Dispatched type.
118       typedef lu_map<Key, Mapped, at0t, _Alloc, at1t>   type;
119     };
120
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>
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:
133       /// Dispatched type.
134       typedef lu_set<Key, null_type, at0t, _Alloc, at1t> type;
135     };
136
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>
140     {
141     private:
142       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
143       typedef typename at1::type                                at1t;
144
145     public:
146       typedef pat_trie_map<Key, Mapped, at1t, _Alloc>           type;
147     };
148
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>
153     {
154     private:
155       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
156       typedef typename at1::type                                at1t;
157
158     public:
159       /// Dispatched type.
160       typedef pat_trie_set<Key, null_type, at1t, _Alloc> type;
161     };
162
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>
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:
174       /// Dispatched type.
175       typedef rb_tree_map<Key, Mapped, at0t, at1t, _Alloc>      type;
176     };
177
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>
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:
190       typedef rb_tree_set<Key, null_type, at0t, at1t, _Alloc> type;
191     };
192
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>
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:
205       /// Dispatched type.
206       typedef splay_tree_map<Key, Mapped, at0t, at1t, _Alloc>   type;
207     };
208
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>
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:
221       /// Dispatched type.
222       typedef splay_tree_set<Key, null_type, at0t, at1t, _Alloc> type;
223   };
224
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>
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:
236       /// Dispatched type.
237       typedef ov_tree_map<Key, Mapped, at0t, at1t, _Alloc>      type;
238   };
239
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>
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:
252       /// Dispatched type.
253       typedef ov_tree_set<Key, null_type, at0t, at1t, _Alloc> type;
254   };
255
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>
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:
273       /// Dispatched type.
274       typedef cc_ht_map<Key, Mapped, at0t, at1t, _Alloc, 
275                         at3t::value, at4t, at2t>                type;
276   };
277
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>
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:
296       /// Dispatched type.
297       typedef cc_ht_set<Key, null_type, at0t, at1t, _Alloc,
298                                  at3t::value, at4t, at2t>       type;
299   };
300
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>
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:
320       /// Dispatched type.
321       typedef gp_ht_map<Key, Mapped, at0t, at1t, _Alloc, 
322                         at3t::value, at4t, at5t, at2t>          type;
323   };
324
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>
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:
345       /// Dispatched type.
346       typedef gp_ht_set<Key, null_type, at0t, at1t, _Alloc,
347                         at3t::value, at4t, at5t, at2t>          type;
348   };
349 } // namespace detail
350 } // namespace __gnu_pbds
351
352 #endif