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