]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/libstdc++/include/ext/pb_ds/detail/container_base_dispatch.hpp
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / libstdc++ / include / ext / pb_ds / detail / container_base_dispatch.hpp
1 // -*- C++ -*-
2
3 // Copyright (C) 2005, 2006 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 2, 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 // You should have received a copy of the GNU General Public License
17 // along with this library; see the file COPYING.  If not, write to
18 // the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
19 // MA 02111-1307, USA.
20
21 // As a special exception, you may use this file as part of a free
22 // software library without restriction.  Specifically, if other files
23 // instantiate templates or use macros or inline functions from this
24 // file, or you compile this file and link it with other files to
25 // produce an executable, this file does not by itself cause the
26 // resulting executable to be covered by the GNU General Public
27 // License.  This exception does not however invalidate any other
28 // reasons why the executable file might be covered by the GNU General
29 // Public License.
30
31 // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
32
33 // Permission to use, copy, modify, sell, and distribute this software
34 // is hereby granted without fee, provided that the above copyright
35 // notice appears in all copies, and that both that copyright notice
36 // and this permission notice appear in supporting documentation. None
37 // of the above authors, nor IBM Haifa Research Laboratories, make any
38 // representation about the suitability of this software for any
39 // purpose. It is provided "as is" without express or implied
40 // warranty.
41
42 /**
43  * @file container_base_dispatch.hpp
44  * Contains an associative container dispatching base.
45  */
46
47 #ifndef PB_DS_ASSOC_CNTNR_BASE_DS_DISPATCHER_HPP
48 #define PB_DS_ASSOC_CNTNR_BASE_DS_DISPATCHER_HPP
49
50 #include <ext/typelist.h>
51
52 #define PB_DS_DATA_TRUE_INDICATOR
53 #include <ext/pb_ds/detail/list_update_map_/lu_map_.hpp>
54 #undef PB_DS_DATA_TRUE_INDICATOR
55
56 #define PB_DS_DATA_FALSE_INDICATOR
57 #include <ext/pb_ds/detail/list_update_map_/lu_map_.hpp>
58 #undef PB_DS_DATA_FALSE_INDICATOR
59
60 #define PB_DS_DATA_TRUE_INDICATOR
61 #include <ext/pb_ds/detail/rb_tree_map_/rb_tree_.hpp>
62 #undef PB_DS_DATA_TRUE_INDICATOR
63
64 #define PB_DS_DATA_FALSE_INDICATOR
65 #include <ext/pb_ds/detail/rb_tree_map_/rb_tree_.hpp>
66 #undef PB_DS_DATA_FALSE_INDICATOR
67
68 #define PB_DS_DATA_TRUE_INDICATOR
69 #include <ext/pb_ds/detail/splay_tree_/splay_tree_.hpp>
70 #undef PB_DS_DATA_TRUE_INDICATOR
71
72 #define PB_DS_DATA_FALSE_INDICATOR
73 #include <ext/pb_ds/detail/splay_tree_/splay_tree_.hpp>
74 #undef PB_DS_DATA_FALSE_INDICATOR
75
76 #define PB_DS_DATA_TRUE_INDICATOR
77 #include <ext/pb_ds/detail/ov_tree_map_/ov_tree_map_.hpp>
78 #undef PB_DS_DATA_TRUE_INDICATOR
79
80 #define PB_DS_DATA_FALSE_INDICATOR
81 #include <ext/pb_ds/detail/ov_tree_map_/ov_tree_map_.hpp>
82 #undef PB_DS_DATA_FALSE_INDICATOR
83
84 #define PB_DS_DATA_TRUE_INDICATOR
85 #include <ext/pb_ds/detail/cc_hash_table_map_/cc_ht_map_.hpp>
86 #undef PB_DS_DATA_TRUE_INDICATOR
87
88 #define PB_DS_DATA_FALSE_INDICATOR
89 #include <ext/pb_ds/detail/cc_hash_table_map_/cc_ht_map_.hpp>
90 #undef PB_DS_DATA_FALSE_INDICATOR
91
92 #define PB_DS_DATA_TRUE_INDICATOR
93 #include <ext/pb_ds/detail/gp_hash_table_map_/gp_ht_map_.hpp>
94 #undef PB_DS_DATA_TRUE_INDICATOR
95
96 #define PB_DS_DATA_FALSE_INDICATOR
97 #include <ext/pb_ds/detail/gp_hash_table_map_/gp_ht_map_.hpp>
98 #undef PB_DS_DATA_FALSE_INDICATOR
99
100 #define PB_DS_DATA_TRUE_INDICATOR
101 #include <ext/pb_ds/detail/pat_trie_/pat_trie_.hpp>
102 #undef PB_DS_DATA_TRUE_INDICATOR
103
104 #define PB_DS_DATA_FALSE_INDICATOR
105 #include <ext/pb_ds/detail/pat_trie_/pat_trie_.hpp>
106 #undef PB_DS_DATA_FALSE_INDICATOR
107
108 namespace pb_ds
109 {
110 namespace detail
111 {
112   // Primary template.
113   template<typename Key, typename Mapped, typename Data_Structure_Taq,
114            typename Policy_Tl, typename Alloc>
115     struct container_base_dispatch;
116
117   template<typename Key, typename Mapped, typename Policy_Tl, typename Alloc>
118     struct container_base_dispatch<Key, Mapped, list_update_tag, 
119                                    Policy_Tl, Alloc>
120     {
121     private:
122       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0>       at0;
123       typedef typename at0::type                                at0t;
124       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
125       typedef typename at1::type                                at1t;
126       
127     public:
128       typedef lu_map_data_<Key, Mapped, at0t, Alloc, at1t>      type;
129     };
130
131   template<typename Key, typename Policy_Tl, typename Alloc>
132     struct container_base_dispatch<Key, null_mapped_type, list_update_tag,
133                                    Policy_Tl, Alloc>
134     {
135     private:
136       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0>       at0;
137       typedef typename at0::type                                at0t;
138       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
139       typedef typename at1::type                                at1t;
140
141     public:
142       typedef lu_map_no_data_<Key, null_mapped_type, at0t, Alloc, at1t> type;
143     };
144
145   template<typename Key, typename Mapped, typename Policy_Tl, typename Alloc>
146     struct container_base_dispatch<Key, Mapped, pat_trie_tag, Policy_Tl, Alloc>
147     {
148     private:
149       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
150       typedef typename at1::type                                at1t;
151
152     public:
153       typedef pat_trie_data_<Key, Mapped, at1t, Alloc>          type;
154     };
155
156   template<typename Key, typename Policy_Tl, typename Alloc>
157     struct container_base_dispatch<Key, null_mapped_type, pat_trie_tag,
158                                    Policy_Tl, Alloc>
159     {
160     private:
161       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
162       typedef typename at1::type                                at1t;
163
164     public:
165       typedef pat_trie_no_data_<Key, null_mapped_type, at1t, Alloc> type;
166     };
167
168   template<typename Key, typename Mapped, typename Policy_Tl, typename Alloc>
169     struct container_base_dispatch<Key, Mapped, rb_tree_tag, Policy_Tl, Alloc>
170     {
171     private:
172       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0>       at0;
173       typedef typename at0::type                                at0t;
174       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
175       typedef typename at1::type                                at1t;
176
177     public:
178       typedef rb_tree_data_<Key, Mapped, at0t, at1t, Alloc>     type;
179     };
180
181   template<typename Key, typename Policy_Tl, typename Alloc>
182     struct container_base_dispatch<Key, null_mapped_type, rb_tree_tag,
183                                    Policy_Tl, Alloc>
184     {
185     private:
186       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0>       at0;
187       typedef typename at0::type                                at0t;
188       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
189       typedef typename at1::type                                at1t;
190
191     public:
192       typedef rb_tree_no_data_<Key, null_mapped_type, at0t, at1t, Alloc> type;
193     };
194
195   template<typename Key, typename Mapped, typename Policy_Tl, typename Alloc>
196     struct container_base_dispatch<Key, Mapped, splay_tree_tag, 
197                                    Policy_Tl, Alloc>
198     {
199     private:
200       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0>       at0;
201       typedef typename at0::type                                at0t;
202       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
203       typedef typename at1::type                                at1t;
204
205     public:
206       typedef splay_tree_data_<Key, Mapped, at0t, at1t, Alloc>  type;
207     };
208
209   template<typename Key, typename Policy_Tl, typename Alloc>
210     struct container_base_dispatch<Key, null_mapped_type, splay_tree_tag,
211                                    Policy_Tl, Alloc>
212     {
213     private:
214       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0>       at0;
215       typedef typename at0::type                                at0t;
216       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
217       typedef typename at1::type                                at1t;
218
219     public:
220       typedef splay_tree_no_data_<Key, null_mapped_type, at0t, at1t, Alloc> type;
221   };
222
223   template<typename Key, typename Mapped, typename Policy_Tl, typename Alloc>
224     struct container_base_dispatch<Key, Mapped, ov_tree_tag, Policy_Tl, Alloc>
225     {
226     private:
227       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0>       at0;
228       typedef typename at0::type                                at0t;
229       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
230       typedef typename at1::type                                at1t;
231
232     public:
233       typedef ov_tree_data_<Key, Mapped, at0t, at1t, Alloc>     type;
234   };
235
236   template<typename Key, typename Policy_Tl, typename Alloc>
237     struct container_base_dispatch<Key, null_mapped_type, ov_tree_tag,
238                                    Policy_Tl, Alloc>
239     {
240     private:
241       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0>       at0;
242       typedef typename at0::type                                at0t;
243       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
244       typedef typename at1::type                                at1t;
245
246     public:
247       typedef ov_tree_no_data_<Key, null_mapped_type, at0t, at1t, Alloc> type;
248   };
249
250   template<typename Key, typename Mapped, typename Policy_Tl, typename Alloc>
251     struct container_base_dispatch<Key, Mapped, cc_hash_tag, Policy_Tl, Alloc>
252     {
253     private:
254       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0>       at0;
255       typedef typename at0::type                                at0t;
256       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
257       typedef typename at1::type                                at1t;
258       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 2>       at2;
259       typedef typename at2::type                                at2t;
260       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 3>       at3;
261       typedef typename at3::type                                at3t;
262       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 4>       at4;
263       typedef typename at4::type                                at4t;
264
265     public:
266       typedef cc_ht_map_data_<Key, Mapped, at0t, at1t, Alloc, at3t::value, 
267                               at4t, at2t>                       type;
268   };
269
270   template<typename Key, typename Policy_Tl, typename Alloc>
271     struct container_base_dispatch<Key, null_mapped_type, cc_hash_tag, 
272                                    Policy_Tl, Alloc>
273     {
274     private:
275       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0>       at0;
276       typedef typename at0::type                                at0t;
277       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
278       typedef typename at1::type                                at1t;
279       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 2>       at2;
280       typedef typename at2::type                                at2t;
281       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 3>       at3;
282       typedef typename at3::type                                at3t;
283       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 4>       at4;
284       typedef typename at4::type                                at4t;
285
286     public:
287       typedef cc_ht_map_no_data_<Key, null_mapped_type, at0t, at1t, Alloc, 
288                                  at3t::value, at4t, at2t>       type;
289   };
290
291   template<typename Key, typename Mapped, typename Policy_Tl, typename Alloc>
292     struct container_base_dispatch<Key, Mapped, gp_hash_tag, Policy_Tl, Alloc>
293     {
294     private:
295       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0>       at0;
296       typedef typename at0::type                                at0t;
297       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
298       typedef typename at1::type                                at1t;
299       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 2>       at2;
300       typedef typename at2::type                                at2t;
301       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 3>       at3;
302       typedef typename at3::type                                at3t;
303       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 4>       at4;
304       typedef typename at4::type                                at4t;
305       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 5>       at5;
306       typedef typename at5::type                                at5t;
307
308     public:
309       typedef gp_ht_map_data_<Key, Mapped, at0t, at1t, Alloc, at3t::value, 
310                               at4t, at5t, at2t>                 type;
311   };
312
313   template<typename Key, typename Policy_Tl, typename Alloc>
314     struct container_base_dispatch<Key, null_mapped_type, gp_hash_tag,
315                                    Policy_Tl, Alloc>
316     {
317     private:
318       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 0>       at0;
319       typedef typename at0::type                                at0t;
320       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 1>       at1;
321       typedef typename at1::type                                at1t;
322       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 2>       at2;
323       typedef typename at2::type                                at2t;
324       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 3>       at3;
325       typedef typename at3::type                                at3t;
326       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 4>       at4;
327       typedef typename at4::type                                at4t;
328       typedef __gnu_cxx::typelist::at_index<Policy_Tl, 5>       at5;
329       typedef typename at5::type                                at5t;
330
331     public:
332       typedef gp_ht_map_no_data_<Key, null_mapped_type, at0t, at1t, Alloc,
333                                  at3t::value, at4t, at5t, at2t> type;
334   };
335 } // namespace detail
336 } // namespace pb_ds
337
338 #endif