3 // Copyright (C) 2005, 2006 Free Software Foundation, Inc.
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
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.
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.
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
31 // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
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
43 * @file common_type.hpp
44 * Contains common types.
47 #ifndef PB_DS_COMMON_TYPES_HPP
48 #define PB_DS_COMMON_TYPES_HPP
50 #include <ext/pb_ds/detail/type_utils.hpp>
51 #include <common_type/assoc/template_policy.hpp>
52 #include <ext/pb_ds/assoc_container.hpp>
58 template<typename Key
,
60 class Hash_Fn
= typename
pb_ds::detail::default_hash_fn
<Key
>::type
,
61 class Eq_Fn
= std::equal_to
<Key
>,
62 class Allocator
= std::allocator
<std::pair
<const Key
, Data
> > >
63 struct hash_common_types
66 typedef typename
Allocator::size_type size_type
;
69 pb_ds::test::hash_load_check_resize_trigger_t_
<
74 no_access_half_load_check_resize_trigger_policy
;
77 pb_ds::test::hash_load_check_resize_trigger_t_
<
82 access_half_load_check_resize_trigger_policy
;
85 pb_ds::test::hash_load_check_resize_trigger_t_
<
90 no_access_one_load_check_resize_trigger_policy
;
93 pb_ds::test::cc_hash_max_collision_check_resize_trigger_t_
<
97 no_access_half_max_col_check_check_resize_trigger_policy
;
100 pb_ds::test::cc_hash_max_collision_check_resize_trigger_t_
<
104 access_half_max_col_check_check_resize_trigger_policy
;
106 typedef pb_ds::test::linear_probe_fn_t_
<Key
, Allocator
> lin_p_t
;
108 typedef pb_ds::test::quadratic_probe_fn_t_
<Key
, Allocator
> quad_p_t
;
111 typename
__gnu_cxx::typelist::create4
<
112 pb_ds::detail::false_type
,
113 pb_ds::test::direct_mask_range_hashing_t_
<
115 no_access_half_load_check_resize_trigger_policy
,
116 pb_ds::test::hash_exponential_size_policy_t_
<
118 performance_cc_policy0
;
121 typename
__gnu_cxx::typelist::create4
<
122 pb_ds::detail::false_type
,
123 pb_ds::test::direct_mod_range_hashing_t_
<
125 no_access_half_load_check_resize_trigger_policy
,
126 pb_ds::test::hash_prime_size_policy_t_
>::type
127 performance_cc_policy1
;
130 typename
__gnu_cxx::typelist::create4
<
131 pb_ds::detail::false_type
,
132 pb_ds::test::direct_mask_range_hashing_t_
<
134 no_access_one_load_check_resize_trigger_policy
,
135 pb_ds::test::hash_exponential_size_policy_t_
<
137 performance_cc_policy2
;
140 typename
__gnu_cxx::typelist::create4
<
141 pb_ds::detail::false_type
,
142 pb_ds::test::direct_mod_range_hashing_t_
<
144 no_access_one_load_check_resize_trigger_policy
,
145 pb_ds::test::hash_prime_size_policy_t_
>::type
146 performance_cc_policy3
;
149 typename
__gnu_cxx::typelist::create4
<
150 pb_ds::detail::true_type
,
151 pb_ds::test::direct_mask_range_hashing_t_
<
153 no_access_half_load_check_resize_trigger_policy
,
154 pb_ds::test::hash_exponential_size_policy_t_
<
156 performance_cc_policy4
;
159 typename
__gnu_cxx::typelist::create4
<
160 pb_ds::detail::false_type
,
161 pb_ds::test::direct_mask_range_hashing_t_
<
163 no_access_half_max_col_check_check_resize_trigger_policy
,
164 pb_ds::test::hash_exponential_size_policy_t_
<
166 performance_cc_policy5
;
169 typename
__gnu_cxx::typelist::create4
<
170 pb_ds::detail::false_type
,
171 pb_ds::test::direct_mask_range_hashing_t_
<
173 access_half_max_col_check_check_resize_trigger_policy
,
174 pb_ds::test::hash_exponential_size_policy_t_
<
176 regression_cc_policy0
;
179 typename
__gnu_cxx::typelist::create4
<
180 pb_ds::detail::false_type
,
181 pb_ds::test::direct_mask_range_hashing_t_
<
183 access_half_load_check_resize_trigger_policy
,
184 pb_ds::test::hash_exponential_size_policy_t_
<
186 regression_cc_policy1
;
189 typename
__gnu_cxx::typelist::create4
<
190 pb_ds::detail::true_type
,
191 pb_ds::test::direct_mod_range_hashing_t_
<
193 no_access_half_load_check_resize_trigger_policy
,
194 pb_ds::test::hash_prime_size_policy_t_
>::type
195 regression_cc_policy2
;
198 typename
__gnu_cxx::typelist::create5
<
199 pb_ds::detail::false_type
,
201 pb_ds::test::direct_mask_range_hashing_t_
<
203 no_access_half_load_check_resize_trigger_policy
,
204 pb_ds::test::hash_exponential_size_policy_t_
<
206 performance_gp_policy0
;
209 typename
__gnu_cxx::typelist::create5
<
210 pb_ds::detail::false_type
,
212 pb_ds::test::direct_mod_range_hashing_t_
<
214 no_access_half_load_check_resize_trigger_policy
,
215 pb_ds::test::hash_prime_size_policy_t_
>::type
216 performance_gp_policy1
;
219 typename
__gnu_cxx::typelist::create5
<
220 pb_ds::detail::false_type
,
222 pb_ds::test::direct_mod_range_hashing_t_
<
224 access_half_load_check_resize_trigger_policy
,
225 pb_ds::test::hash_prime_size_policy_t_
>::type
226 regression_gp_policy0
;
229 typename
__gnu_cxx::typelist::create5
<
230 pb_ds::detail::true_type
,
232 pb_ds::test::direct_mask_range_hashing_t_
<
234 access_half_load_check_resize_trigger_policy
,
235 pb_ds::test::hash_exponential_size_policy_t_
<
237 regression_gp_policy1
;
240 typename
__gnu_cxx::typelist::create6
<
241 performance_cc_policy0
,
242 performance_cc_policy1
,
243 performance_cc_policy2
,
244 performance_cc_policy3
,
245 performance_cc_policy4
,
246 performance_cc_policy5
>::type
247 performance_cc_range_hashing_policies
;
250 typename
__gnu_cxx::typelist::create3
<
251 regression_cc_policy0
,
252 regression_cc_policy1
,
253 regression_cc_policy2
>::type
254 regression_cc_range_hashing_policies
;
257 typename
__gnu_cxx::typelist::create2
<
258 performance_gp_policy0
,
259 performance_gp_policy1
>::type
260 performance_gp_range_hashing_policies
;
263 typename
__gnu_cxx::typelist::create2
<
264 regression_gp_policy0
,
265 regression_gp_policy1
>::type
266 regression_gp_range_hashing_policies
;
268 template<typename Policy_Tl
>
269 struct no_access_generic_cc_hash_table_t
273 typename
__gnu_cxx::typelist::at_index
<
275 store_hash_indicator
;
279 store_hash
= store_hash_indicator::value
283 typename
__gnu_cxx::typelist::at_index
<
288 typename
__gnu_cxx::typelist::at_index
<
293 typename
__gnu_cxx::typelist::at_index
<
299 pb_ds::cc_hash_table
<
305 pb_ds::hash_standard_resize_policy
<
314 template<typename Policy_Tl
>
315 struct access_generic_cc_hash_table_t
319 typename
__gnu_cxx::typelist::at_index
<
321 store_hash_indicator
;
325 store_hash
= store_hash_indicator::value
329 typename
__gnu_cxx::typelist::at_index
<
334 typename
__gnu_cxx::typelist::at_index
<
339 typename
__gnu_cxx::typelist::at_index
<
345 pb_ds::cc_hash_table
<
351 pb_ds::hash_standard_resize_policy
<
360 template<typename Policy_Tl
>
361 struct no_access_generic_gp_hash_table_t
365 typename
__gnu_cxx::typelist::at_index
<
367 store_hash_indicator
;
371 store_hash
= store_hash_indicator::value
375 typename
__gnu_cxx::typelist::at_index
<
380 typename
__gnu_cxx::typelist::at_index
<
385 typename
__gnu_cxx::typelist::at_index
<
390 typename
__gnu_cxx::typelist::at_index
<
396 pb_ds::gp_hash_table
<
403 pb_ds::hash_standard_resize_policy
<
412 template<typename Policy_Tl
>
413 struct access_generic_gp_hash_table_t
417 typename
__gnu_cxx::typelist::at_index
<
419 store_hash_indicator
;
423 store_hash
= store_hash_indicator::value
427 typename
__gnu_cxx::typelist::at_index
<
432 typename
__gnu_cxx::typelist::at_index
<
437 typename
__gnu_cxx::typelist::at_index
<
442 typename
__gnu_cxx::typelist::at_index
<
448 pb_ds::gp_hash_table
<
455 pb_ds::hash_standard_resize_policy
<
465 typename
__gnu_cxx::typelist::transform
<
466 performance_cc_range_hashing_policies
,
467 no_access_generic_cc_hash_table_t
>::type
468 performance_cc_types
;
471 typename
__gnu_cxx::typelist::transform
<
472 regression_cc_range_hashing_policies
,
473 access_generic_cc_hash_table_t
>::type
477 typename
__gnu_cxx::typelist::at_index
<
478 performance_cc_types
,
480 performance_min_cc_type
;
483 typename
__gnu_cxx::typelist::transform
<
484 performance_gp_range_hashing_policies
,
485 no_access_generic_gp_hash_table_t
>::type
486 performance_gp_types
;
489 typename
__gnu_cxx::typelist::transform
<
490 regression_gp_range_hashing_policies
,
491 access_generic_gp_hash_table_t
>::type
495 typename
__gnu_cxx::typelist::at_index
<
496 performance_gp_types
,
498 performance_min_gp_type
;
502 typename
__gnu_cxx::typelist::append
<
503 performance_cc_types
,
504 performance_gp_types
>::type
508 typename
__gnu_cxx::typelist::append
<
510 regression_cc_types
>::type
514 typename
__gnu_cxx::typelist::create1
<
515 performance_min_cc_type
>::type
519 template<typename Key
,
521 class Comb_Hash_Fn_TL
,
522 class Comb_Probe_Fn_TL
,
530 struct ranged_hash_common_types
533 typedef typename
Allocator::size_type size_type
;
536 pb_ds::test::hash_load_check_resize_trigger_t_
<
541 no_access_half_load_check_resize_trigger_policy
;
544 pb_ds::test::hash_load_check_resize_trigger_t_
<
549 no_access_one_load_check_resize_trigger_policy
;
552 pb_ds::hash_standard_resize_policy
<
553 pb_ds::test::hash_exponential_size_policy_t_
<
555 no_access_half_load_check_resize_trigger_policy
>
556 mask_half_resize_policy_t
;
559 pb_ds::hash_standard_resize_policy
<
560 pb_ds::test::hash_exponential_size_policy_t_
<
562 no_access_one_load_check_resize_trigger_policy
>
563 mask_one_resize_policy_t
;
566 pb_ds::hash_standard_resize_policy
<
567 pb_ds::test::hash_prime_size_policy_t_
,
568 no_access_half_load_check_resize_trigger_policy
>
569 mod_half_resize_policy_t
;
572 pb_ds::hash_standard_resize_policy
<
573 pb_ds::test::hash_prime_size_policy_t_
,
574 no_access_one_load_check_resize_trigger_policy
>
575 mod_one_resize_policy_t
;
577 template<typename Comb_Hash_Fn_
>
578 struct half_resize_policy_selector
;
580 template<typename Allocator_
>
581 struct half_resize_policy_selector
<
582 pb_ds::test::direct_mask_range_hashing_t_
<
585 typedef mask_half_resize_policy_t type
;
588 template<typename Allocator_
>
589 struct half_resize_policy_selector
<
590 pb_ds::test::direct_mod_range_hashing_t_
<
593 typedef mod_half_resize_policy_t type
;
596 template<typename Comb_Hash_Fn_
>
597 struct one_resize_policy_selector
;
599 template<typename Allocator_
>
600 struct one_resize_policy_selector
<
601 pb_ds::test::direct_mask_range_hashing_t_
<
604 typedef mask_one_resize_policy_t type
;
607 template<typename Allocator_
>
608 struct one_resize_policy_selector
<
609 pb_ds::test::direct_mod_range_hashing_t_
<
612 typedef mod_one_resize_policy_t type
;
615 template<typename Comb_Hash_Fn
>
616 struct generic_cc_hash_table_t
619 pb_ds::cc_hash_table
<
625 typename one_resize_policy_selector
<
626 typename
Comb_Hash_Fn::comb_fn
>::type
,
633 typename
__gnu_cxx::typelist::transform
<
635 generic_cc_hash_table_t
>::type
636 performance_cc_types
;
638 template<typename Comb_Probe_Fn
>
639 struct no_access_generic_gp_hash_table_t
642 pb_ds::gp_hash_table
<
648 pb_ds::null_probe_fn
,
649 typename half_resize_policy_selector
<
650 typename
Comb_Probe_Fn::comb_fn
>::type
,
657 typename
__gnu_cxx::typelist::transform
<
659 no_access_generic_gp_hash_table_t
>::type
660 performance_gp_types
;
664 typename
__gnu_cxx::typelist::append
<
665 performance_cc_types
,
666 performance_gp_types
>::type
670 template<typename Key
, typename Data
, class Eq_Fn
= std::equal_to
<Key
>,
672 std::allocator
<char> >
673 class lu_common_types
676 typedef typename
Allocator::size_type size_type
;
678 typedef pb_ds::test::move_to_front_lu_policy_t_ mtf_u
;
680 typedef pb_ds::test::counter_lu_policy_t_
<Allocator
, 5> cnt_5_u
;
682 typedef typename
__gnu_cxx::typelist::create1
<mtf_u
>::type lu_policy0
;
684 typedef typename
__gnu_cxx::typelist::create1
<cnt_5_u
>::type lu_policy1
;
687 typename
__gnu_cxx::typelist::create2
<
692 template<typename Policy_Tl
>
693 struct generic_list_update_t
697 typename
__gnu_cxx::typelist::at_index
<
713 typename
__gnu_cxx::typelist::transform
<
715 generic_list_update_t
>::type
719 typename
__gnu_cxx::typelist::at_index
<
725 typedef lu_types performance_tl
;
726 typedef lu_types regression_tl
;
728 typedef typename
__gnu_cxx::typelist::create1
<min_lu_type
>::type performance_min_tl
;
731 template<typename Key
, typename Data
, class Cmp_Fn
= std::less
<Key
>,
732 template<typename Const_Node_Iterator
,
736 class Node_Update
= pb_ds::null_tree_node_update
,
737 class Allocator
= std::allocator
<std::pair
<const Key
, Data
> > >
738 struct tree_common_types
749 ov_tree_assoc_container_t
;
759 rb_tree_assoc_container_t
;
766 pb_ds::splay_tree_tag
,
769 splay_tree_assoc_container_t
;
773 typename
__gnu_cxx::typelist::create3
<
774 splay_tree_assoc_container_t
,
775 rb_tree_assoc_container_t
,
776 ov_tree_assoc_container_t
>::type
780 typename
__gnu_cxx::typelist::create3
<
781 ov_tree_assoc_container_t
,
782 splay_tree_assoc_container_t
,
783 rb_tree_assoc_container_t
>::type
787 typename
__gnu_cxx::typelist::create1
<
788 rb_tree_assoc_container_t
>::type
792 template<typename Key
,
794 class E_Access_Traits
=
795 typename
pb_ds::detail::default_trie_e_access_traits
<Key
>::type
,
796 class Tag
= pb_ds::pat_trie_tag
,
797 template<typename Const_Node_Iterator
,
798 typename Node_Iterator
,
799 class E_Access_Traits_
,
801 class Node_Update
= pb_ds::null_trie_node_update
,
802 class Allocator
= std::allocator
<char> >
803 class trie_common_types
806 typedef pb_ds::trie
<Key
, Data
, E_Access_Traits
, Tag
, Node_Update
, Allocator
> type
;
809 typedef typename
__gnu_cxx::typelist::create1
<type
>::type performance_tl
;
810 typedef typename
__gnu_cxx::typelist::create1
<type
>::type regression_tl
;
811 typedef typename
__gnu_cxx::typelist::create1
<type
>::type performance_min_tl
;
818 #endif // #ifndef PB_DS_COMMON_TYPES_HPP