blob: 209208747f4e473eef2c105d730a3f9331fceb88 [file] [log] [blame]
// -*- C++ -*-
// Copyright (C) 2005, 2006 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the terms
// of the GNU General Public License as published by the Free Software
// Foundation; either version 2, or (at your option) any later
// version.
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this library; see the file COPYING. If not, write to
// the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
// MA 02111-1307, USA.
// As a special exception, you may use this file as part of a free
// software library without restriction. Specifically, if other files
// instantiate templates or use macros or inline functions from this
// file, or you compile this file and link it with other files to
// produce an executable, this file does not by itself cause the
// resulting executable to be covered by the GNU General Public
// License. This exception does not however invalidate any other
// reasons why the executable file might be covered by the GNU General
// Public License.
// Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
// Permission to use, copy, modify, sell, and distribute this software
// is hereby granted without fee, provided that the above copyright
// notice appears in all copies, and that both that copyright notice
// and this permission notice appear in supporting documentation. None
// of the above authors, nor IBM Haifa Research Laboratories, make any
// representation about the suitability of this software for any
// purpose. It is provided "as is" without express or implied
// warranty.
/**
* @file common_type.hpp
* Contains common types.
*/
#ifndef PB_DS_COMMON_TYPES_HPP
#define PB_DS_COMMON_TYPES_HPP
#include <ext/pb_ds/detail/type_utils.hpp>
#include <common_type/assoc/template_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
namespace pb_ds
{
namespace test
{
template<typename Key,
typename Data,
class Hash_Fn = typename pb_ds::detail::default_hash_fn<Key>::type,
class Eq_Fn = std::equal_to<Key>,
class Allocator = std::allocator<std::pair<const Key, Data> > >
struct hash_common_types
{
private:
typedef typename Allocator::size_type size_type;
typedef
pb_ds::test::hash_load_check_resize_trigger_t_<
Allocator,
1, 8,
1, 2,
false>
no_access_half_load_check_resize_trigger_policy;
typedef
pb_ds::test::hash_load_check_resize_trigger_t_<
Allocator,
1, 8,
1, 2,
true>
access_half_load_check_resize_trigger_policy;
typedef
pb_ds::test::hash_load_check_resize_trigger_t_<
Allocator,
1, 8,
1, 1,
false>
no_access_one_load_check_resize_trigger_policy;
typedef
pb_ds::test::cc_hash_max_collision_check_resize_trigger_t_<
Allocator,
1, 2,
false>
no_access_half_max_col_check_check_resize_trigger_policy;
typedef
pb_ds::test::cc_hash_max_collision_check_resize_trigger_t_<
Allocator,
1, 2,
true>
access_half_max_col_check_check_resize_trigger_policy;
typedef pb_ds::test::linear_probe_fn_t_<Key, Allocator> lin_p_t;
typedef pb_ds::test::quadratic_probe_fn_t_<Key, Allocator> quad_p_t;
typedef
typename __gnu_cxx::typelist::create4<
pb_ds::detail::false_type,
pb_ds::test::direct_mask_range_hashing_t_<
Allocator>,
no_access_half_load_check_resize_trigger_policy,
pb_ds::test::hash_exponential_size_policy_t_<
Allocator> >::type
performance_cc_policy0;
typedef
typename __gnu_cxx::typelist::create4<
pb_ds::detail::false_type,
pb_ds::test::direct_mod_range_hashing_t_<
Allocator>,
no_access_half_load_check_resize_trigger_policy,
pb_ds::test::hash_prime_size_policy_t_>::type
performance_cc_policy1;
typedef
typename __gnu_cxx::typelist::create4<
pb_ds::detail::false_type,
pb_ds::test::direct_mask_range_hashing_t_<
Allocator>,
no_access_one_load_check_resize_trigger_policy,
pb_ds::test::hash_exponential_size_policy_t_<
Allocator> >::type
performance_cc_policy2;
typedef
typename __gnu_cxx::typelist::create4<
pb_ds::detail::false_type,
pb_ds::test::direct_mod_range_hashing_t_<
Allocator>,
no_access_one_load_check_resize_trigger_policy,
pb_ds::test::hash_prime_size_policy_t_ >::type
performance_cc_policy3;
typedef
typename __gnu_cxx::typelist::create4<
pb_ds::detail::true_type,
pb_ds::test::direct_mask_range_hashing_t_<
Allocator>,
no_access_half_load_check_resize_trigger_policy,
pb_ds::test::hash_exponential_size_policy_t_<
Allocator> >::type
performance_cc_policy4;
typedef
typename __gnu_cxx::typelist::create4<
pb_ds::detail::false_type,
pb_ds::test::direct_mask_range_hashing_t_<
Allocator>,
no_access_half_max_col_check_check_resize_trigger_policy,
pb_ds::test::hash_exponential_size_policy_t_<
Allocator> >::type
performance_cc_policy5;
typedef
typename __gnu_cxx::typelist::create4<
pb_ds::detail::false_type,
pb_ds::test::direct_mask_range_hashing_t_<
Allocator>,
access_half_max_col_check_check_resize_trigger_policy,
pb_ds::test::hash_exponential_size_policy_t_<
Allocator> >::type
regression_cc_policy0;
typedef
typename __gnu_cxx::typelist::create4<
pb_ds::detail::false_type,
pb_ds::test::direct_mask_range_hashing_t_<
Allocator>,
access_half_load_check_resize_trigger_policy,
pb_ds::test::hash_exponential_size_policy_t_<
Allocator> >::type
regression_cc_policy1;
typedef
typename __gnu_cxx::typelist::create4<
pb_ds::detail::true_type,
pb_ds::test::direct_mod_range_hashing_t_<
Allocator>,
no_access_half_load_check_resize_trigger_policy,
pb_ds::test::hash_prime_size_policy_t_ >::type
regression_cc_policy2;
typedef
typename __gnu_cxx::typelist::create5<
pb_ds::detail::false_type,
lin_p_t,
pb_ds::test::direct_mask_range_hashing_t_<
Allocator>,
no_access_half_load_check_resize_trigger_policy,
pb_ds::test::hash_exponential_size_policy_t_<
Allocator> >::type
performance_gp_policy0;
typedef
typename __gnu_cxx::typelist::create5<
pb_ds::detail::false_type,
quad_p_t,
pb_ds::test::direct_mod_range_hashing_t_<
Allocator>,
no_access_half_load_check_resize_trigger_policy,
pb_ds::test::hash_prime_size_policy_t_ >::type
performance_gp_policy1;
typedef
typename __gnu_cxx::typelist::create5<
pb_ds::detail::false_type,
quad_p_t,
pb_ds::test::direct_mod_range_hashing_t_<
Allocator>,
access_half_load_check_resize_trigger_policy,
pb_ds::test::hash_prime_size_policy_t_>::type
regression_gp_policy0;
typedef
typename __gnu_cxx::typelist::create5<
pb_ds::detail::true_type,
lin_p_t,
pb_ds::test::direct_mask_range_hashing_t_<
Allocator>,
access_half_load_check_resize_trigger_policy,
pb_ds::test::hash_exponential_size_policy_t_<
Allocator> >::type
regression_gp_policy1;
typedef
typename __gnu_cxx::typelist::create6<
performance_cc_policy0,
performance_cc_policy1,
performance_cc_policy2,
performance_cc_policy3,
performance_cc_policy4,
performance_cc_policy5>::type
performance_cc_range_hashing_policies;
typedef
typename __gnu_cxx::typelist::create3<
regression_cc_policy0,
regression_cc_policy1,
regression_cc_policy2>::type
regression_cc_range_hashing_policies;
typedef
typename __gnu_cxx::typelist::create2<
performance_gp_policy0,
performance_gp_policy1>::type
performance_gp_range_hashing_policies;
typedef
typename __gnu_cxx::typelist::create2<
regression_gp_policy0,
regression_gp_policy1>::type
regression_gp_range_hashing_policies;
template<typename Policy_Tl>
struct no_access_generic_cc_hash_table_t
{
private:
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 0>::type
store_hash_indicator;
enum
{
store_hash = store_hash_indicator::value
};
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 1>::type
comb_hash_fn;
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 2>::type
trigger_policy;
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 3>::type
size_policy;
public:
typedef
pb_ds::cc_hash_table<
Key,
Data,
Hash_Fn,
Eq_Fn,
comb_hash_fn,
pb_ds::hash_standard_resize_policy<
size_policy,
trigger_policy,
false>,
store_hash,
Allocator>
type;
};
template<typename Policy_Tl>
struct access_generic_cc_hash_table_t
{
private:
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 0>::type
store_hash_indicator;
enum
{
store_hash = store_hash_indicator::value
};
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 1>::type
comb_hash_fn;
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 2>::type
trigger_policy;
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 3>::type
size_policy;
public:
typedef
pb_ds::cc_hash_table<
Key,
Data,
Hash_Fn,
Eq_Fn,
comb_hash_fn,
pb_ds::hash_standard_resize_policy<
size_policy,
trigger_policy,
true>,
store_hash,
Allocator>
type;
};
template<typename Policy_Tl>
struct no_access_generic_gp_hash_table_t
{
private:
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 0>::type
store_hash_indicator;
enum
{
store_hash = store_hash_indicator::value
};
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 1>::type
probe_fn;
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 2>::type
comb_probe_fn;
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 3>::type
trigger_policy;
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 4>::type
size_policy;
public:
typedef
pb_ds::gp_hash_table<
Key,
Data,
Hash_Fn,
Eq_Fn,
comb_probe_fn,
probe_fn,
pb_ds::hash_standard_resize_policy<
size_policy,
trigger_policy,
false>,
store_hash,
Allocator>
type;
};
template<typename Policy_Tl>
struct access_generic_gp_hash_table_t
{
private:
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 0>::type
store_hash_indicator;
enum
{
store_hash = store_hash_indicator::value
};
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 1>::type
probe_fn;
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 2>::type
comb_probe_fn;
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 3>::type
trigger_policy;
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 4>::type
size_policy;
public:
typedef
pb_ds::gp_hash_table<
Key,
Data,
Hash_Fn,
Eq_Fn,
comb_probe_fn,
probe_fn,
pb_ds::hash_standard_resize_policy<
size_policy,
trigger_policy,
true>,
store_hash,
Allocator>
type;
};
typedef
typename __gnu_cxx::typelist::transform<
performance_cc_range_hashing_policies,
no_access_generic_cc_hash_table_t>::type
performance_cc_types;
typedef
typename __gnu_cxx::typelist::transform<
regression_cc_range_hashing_policies,
access_generic_cc_hash_table_t>::type
regression_cc_types;
typedef
typename __gnu_cxx::typelist::at_index<
performance_cc_types,
0>::type
performance_min_cc_type;
typedef
typename __gnu_cxx::typelist::transform<
performance_gp_range_hashing_policies,
no_access_generic_gp_hash_table_t>::type
performance_gp_types;
typedef
typename __gnu_cxx::typelist::transform<
regression_gp_range_hashing_policies,
access_generic_gp_hash_table_t>::type
regression_gp_types;
typedef
typename __gnu_cxx::typelist::at_index<
performance_gp_types,
0>::type
performance_min_gp_type;
public:
typedef
typename __gnu_cxx::typelist::append<
performance_cc_types,
performance_gp_types>::type
performance_tl;
typedef
typename __gnu_cxx::typelist::append<
regression_gp_types,
regression_cc_types>::type
regression_tl;
typedef
typename __gnu_cxx::typelist::create1<
performance_min_cc_type>::type
performance_min_tl;
};
template<typename Key,
typename Data,
class Comb_Hash_Fn_TL,
class Comb_Probe_Fn_TL,
class Eq_Fn =
std::equal_to<Key>,
class Allocator =
std::allocator<
std::pair<
const Key,
Data> > >
struct ranged_hash_common_types
{
private:
typedef typename Allocator::size_type size_type;
typedef
pb_ds::test::hash_load_check_resize_trigger_t_<
Allocator,
1, 8,
1, 2,
false>
no_access_half_load_check_resize_trigger_policy;
typedef
pb_ds::test::hash_load_check_resize_trigger_t_<
Allocator,
1, 8,
1, 1,
false>
no_access_one_load_check_resize_trigger_policy;
typedef
pb_ds::hash_standard_resize_policy<
pb_ds::test::hash_exponential_size_policy_t_<
Allocator>,
no_access_half_load_check_resize_trigger_policy>
mask_half_resize_policy_t;
typedef
pb_ds::hash_standard_resize_policy<
pb_ds::test::hash_exponential_size_policy_t_<
Allocator>,
no_access_one_load_check_resize_trigger_policy>
mask_one_resize_policy_t;
typedef
pb_ds::hash_standard_resize_policy<
pb_ds::test::hash_prime_size_policy_t_,
no_access_half_load_check_resize_trigger_policy>
mod_half_resize_policy_t;
typedef
pb_ds::hash_standard_resize_policy<
pb_ds::test::hash_prime_size_policy_t_,
no_access_one_load_check_resize_trigger_policy>
mod_one_resize_policy_t;
template<typename Comb_Hash_Fn_>
struct half_resize_policy_selector;
template<typename Allocator_>
struct half_resize_policy_selector<
pb_ds::test::direct_mask_range_hashing_t_<
Allocator_> >
{
typedef mask_half_resize_policy_t type;
};
template<typename Allocator_>
struct half_resize_policy_selector<
pb_ds::test::direct_mod_range_hashing_t_<
Allocator_> >
{
typedef mod_half_resize_policy_t type;
};
template<typename Comb_Hash_Fn_>
struct one_resize_policy_selector;
template<typename Allocator_>
struct one_resize_policy_selector<
pb_ds::test::direct_mask_range_hashing_t_<
Allocator_> >
{
typedef mask_one_resize_policy_t type;
};
template<typename Allocator_>
struct one_resize_policy_selector<
pb_ds::test::direct_mod_range_hashing_t_<
Allocator_> >
{
typedef mod_one_resize_policy_t type;
};
template<typename Comb_Hash_Fn>
struct generic_cc_hash_table_t
{
typedef
pb_ds::cc_hash_table<
Key,
Data,
pb_ds::null_hash_fn,
Eq_Fn,
Comb_Hash_Fn,
typename one_resize_policy_selector<
typename Comb_Hash_Fn::comb_fn>::type,
false,
Allocator>
type;
};
typedef
typename __gnu_cxx::typelist::transform<
Comb_Hash_Fn_TL,
generic_cc_hash_table_t>::type
performance_cc_types;
template<typename Comb_Probe_Fn>
struct no_access_generic_gp_hash_table_t
{
typedef
pb_ds::gp_hash_table<
Key,
Data,
pb_ds::null_hash_fn,
Eq_Fn,
Comb_Probe_Fn,
pb_ds::null_probe_fn,
typename half_resize_policy_selector<
typename Comb_Probe_Fn::comb_fn>::type,
false,
Allocator>
type;
};
typedef
typename __gnu_cxx::typelist::transform<
Comb_Probe_Fn_TL,
no_access_generic_gp_hash_table_t>::type
performance_gp_types;
public:
typedef
typename __gnu_cxx::typelist::append<
performance_cc_types,
performance_gp_types>::type
performance_tl;
};
template<typename Key, typename Data, class Eq_Fn = std::equal_to<Key>,
class Allocator =
std::allocator<char> >
class lu_common_types
{
private:
typedef typename Allocator::size_type size_type;
typedef pb_ds::test::move_to_front_lu_policy_t_ mtf_u;
typedef pb_ds::test::counter_lu_policy_t_<Allocator, 5> cnt_5_u;
typedef typename __gnu_cxx::typelist::create1<mtf_u>::type lu_policy0;
typedef typename __gnu_cxx::typelist::create1<cnt_5_u>::type lu_policy1;
typedef
typename __gnu_cxx::typelist::create2<
lu_policy0,
lu_policy1>::type
lu_policies;
template<typename Policy_Tl>
struct generic_list_update_t
{
private:
typedef
typename __gnu_cxx::typelist::at_index<
Policy_Tl, 0>::type
update_policy_t;
public:
typedef
pb_ds::list_update<
Key,
Data,
Eq_Fn,
update_policy_t,
Allocator>
type;
};
typedef
typename __gnu_cxx::typelist::transform<
lu_policies,
generic_list_update_t>::type
lu_types;
typedef
typename __gnu_cxx::typelist::at_index<
lu_types,
0>::type
min_lu_type;
public:
typedef lu_types performance_tl;
typedef lu_types regression_tl;
typedef typename __gnu_cxx::typelist::create1<min_lu_type>::type performance_min_tl;
};
template<typename Key, typename Data, class Cmp_Fn = std::less<Key>,
template<typename Const_Node_Iterator,
class Node_Iterator,
class Cmp_Fn_,
class Allocator_>
class Node_Update = pb_ds::null_tree_node_update,
class Allocator = std::allocator<std::pair<const Key, Data> > >
struct tree_common_types
{
private:
typedef
pb_ds::tree<
Key,
Data,
Cmp_Fn,
pb_ds::ov_tree_tag,
Node_Update,
Allocator>
ov_tree_assoc_container_t;
typedef
pb_ds::tree<
Key,
Data,
Cmp_Fn,
pb_ds::rb_tree_tag,
Node_Update,
Allocator>
rb_tree_assoc_container_t;
typedef
pb_ds::tree<
Key,
Data,
Cmp_Fn,
pb_ds::splay_tree_tag,
Node_Update,
Allocator>
splay_tree_assoc_container_t;
public:
typedef
typename __gnu_cxx::typelist::create3<
splay_tree_assoc_container_t,
rb_tree_assoc_container_t,
ov_tree_assoc_container_t>::type
performance_tl;
typedef
typename __gnu_cxx::typelist::create3<
ov_tree_assoc_container_t,
splay_tree_assoc_container_t,
rb_tree_assoc_container_t>::type
regression_tl;
typedef
typename __gnu_cxx::typelist::create1<
rb_tree_assoc_container_t>::type
performance_min_tl;
};
template<typename Key,
typename Data,
class E_Access_Traits =
typename pb_ds::detail::default_trie_e_access_traits<Key>::type,
class Tag = pb_ds::pat_trie_tag,
template<typename Const_Node_Iterator,
typename Node_Iterator,
class E_Access_Traits_,
typename Allocator_>
class Node_Update = pb_ds::null_trie_node_update,
class Allocator = std::allocator<char> >
class trie_common_types
{
private:
typedef pb_ds::trie<Key, Data, E_Access_Traits, Tag, Node_Update, Allocator> type;
public:
typedef typename __gnu_cxx::typelist::create1<type>::type performance_tl;
typedef typename __gnu_cxx::typelist::create1<type>::type regression_tl;
typedef typename __gnu_cxx::typelist::create1<type>::type performance_min_tl;
};
} // namespace test
} // namespace pb_ds
#endif // #ifndef PB_DS_COMMON_TYPES_HPP