1// -*- C++ -*-
2
3// Copyright (C) 2005-2015 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
101namespace __gnu_pbds
102{
103namespace 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
353