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 standard_policies.hpp
44 * Contains standard policies for containers.
45 */
46
47#ifndef PB_DS_STANDARD_POLICIES_HPP
48#define PB_DS_STANDARD_POLICIES_HPP
49
50#include <memory>
51#include <ext/pb_ds/hash_policy.hpp>
52#include <ext/pb_ds/list_update_policy.hpp>
53#include <ext/pb_ds/tree_policy.hpp>
54#include <ext/pb_ds/detail/basic_tree_policy/null_node_metadata.hpp>
55#include <ext/pb_ds/trie_policy.hpp>
56#include <ext/pb_ds/tag_and_trait.hpp>
57#include <ext/hash_map>
58
59namespace pb_ds
60{
61  namespace detail
62  {
63    template<typename Key>
64    struct default_hash_fn
65    {
66      typedef __gnu_cxx::hash< Key> type;
67    };
68
69    template<typename Key>
70    struct default_eq_fn
71    {
72      typedef std::equal_to< Key> type;
73    };
74
75    enum
76      {
77	default_store_hash = false
78      };
79
80    struct default_comb_hash_fn
81    {
82      typedef pb_ds::direct_mask_range_hashing<> type;
83    };
84
85    template<typename Comb_Hash_Fn>
86    struct default_resize_policy
87    {
88    private:
89      typedef typename Comb_Hash_Fn::size_type size_type;
90
91      typedef
92      typename __conditional_type<
93	is_same<
94	pb_ds::direct_mask_range_hashing<
95	size_type>,
96	Comb_Hash_Fn>::value,
97	pb_ds::hash_exponential_size_policy<
98	size_type>,
99	pb_ds::hash_prime_size_policy>::__type
100      size_policy_type;
101
102    public:
103      typedef
104      pb_ds::hash_standard_resize_policy<
105      size_policy_type,
106      pb_ds::hash_load_check_resize_trigger<
107      false,
108      size_type>,
109      false,
110      size_type>
111      type;
112    };
113
114    struct default_update_policy
115    {
116      typedef pb_ds::move_to_front_lu_policy<> type;
117    };
118
119    template<typename Comb_Probe_Fn>
120    struct default_probe_fn
121    {
122    private:
123      typedef typename Comb_Probe_Fn::size_type size_type;
124
125    public:
126      typedef
127      typename __conditional_type<
128      is_same<
129      pb_ds::direct_mask_range_hashing<size_t>,
130      Comb_Probe_Fn>::value,
131      pb_ds::linear_probe_fn<
132      size_type>,
133      pb_ds::quadratic_probe_fn<
134      size_type> >::__type
135      type;
136    };
137
138    template<typename Key>
139    struct default_trie_e_access_traits;
140
141    template<typename Char, class Char_Traits>
142    struct default_trie_e_access_traits<
143      std::basic_string<
144      Char,
145      Char_Traits,
146      std::allocator<
147      char> > >
148    {
149      typedef
150      pb_ds::string_trie_e_access_traits<
151	std::basic_string<
152	Char,
153	Char_Traits,
154	std::allocator<
155	char> > >
156      type;
157    };
158
159  } // namespace detail
160} // namespace pb_ds
161
162#endif // #ifndef PB_DS_STANDARD_POLICIES_HPP
163
164