1// TR1 unordered_set implementation -*- C++ -*-
2
3// Copyright (C) 2010-2015 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
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file tr1/unordered_set.h
26 *  This is an internal header file, included by other library headers.
27 *  Do not attempt to use it directly. @headername{tr1/unordered_set}
28 */
29
30namespace std _GLIBCXX_VISIBILITY(default)
31{
32namespace tr1
33{
34_GLIBCXX_BEGIN_NAMESPACE_VERSION
35
36  // NB: When we get typedef templates these class definitions
37  // will be unnecessary.
38  template<class _Value,
39	   class _Hash = hash<_Value>,
40	   class _Pred = std::equal_to<_Value>,
41	   class _Alloc = std::allocator<_Value>,
42	   bool __cache_hash_code = false>
43    class __unordered_set
44    : public _Hashtable<_Value, _Value, _Alloc,
45			std::_Identity<_Value>, _Pred,
46			_Hash, __detail::_Mod_range_hashing,
47			__detail::_Default_ranged_hash,
48			__detail::_Prime_rehash_policy,
49			__cache_hash_code, true, true>
50    {
51      typedef _Hashtable<_Value, _Value, _Alloc,
52			 std::_Identity<_Value>, _Pred,
53			 _Hash, __detail::_Mod_range_hashing,
54			 __detail::_Default_ranged_hash,
55			 __detail::_Prime_rehash_policy,
56			 __cache_hash_code, true, true>
57	_Base;
58
59    public:
60      typedef typename _Base::size_type       size_type;
61      typedef typename _Base::hasher          hasher;
62      typedef typename _Base::key_equal       key_equal;
63      typedef typename _Base::allocator_type  allocator_type;
64
65      explicit
66      __unordered_set(size_type __n = 10,
67		      const hasher& __hf = hasher(),
68		      const key_equal& __eql = key_equal(),
69		      const allocator_type& __a = allocator_type())
70      : _Base(__n, __hf, __detail::_Mod_range_hashing(),
71	      __detail::_Default_ranged_hash(), __eql,
72	      std::_Identity<_Value>(), __a)
73      { }
74
75      template<typename _InputIterator>
76	__unordered_set(_InputIterator __f, _InputIterator __l,
77			size_type __n = 10,
78			const hasher& __hf = hasher(),
79			const key_equal& __eql = key_equal(),
80			const allocator_type& __a = allocator_type())
81	: _Base(__f, __l, __n, __hf, __detail::_Mod_range_hashing(),
82		__detail::_Default_ranged_hash(), __eql,
83		std::_Identity<_Value>(), __a)
84	{ }
85    };
86
87  template<class _Value,
88	   class _Hash = hash<_Value>,
89	   class _Pred = std::equal_to<_Value>,
90	   class _Alloc = std::allocator<_Value>,
91	   bool __cache_hash_code = false>
92    class __unordered_multiset
93    : public _Hashtable<_Value, _Value, _Alloc,
94			std::_Identity<_Value>, _Pred,
95			_Hash, __detail::_Mod_range_hashing,
96			__detail::_Default_ranged_hash,
97			__detail::_Prime_rehash_policy,
98			__cache_hash_code, true, false>
99    {
100      typedef _Hashtable<_Value, _Value, _Alloc,
101			 std::_Identity<_Value>, _Pred,
102			 _Hash, __detail::_Mod_range_hashing,
103			 __detail::_Default_ranged_hash,
104			 __detail::_Prime_rehash_policy,
105			 __cache_hash_code, true, false>
106	_Base;
107
108    public:
109      typedef typename _Base::size_type       size_type;
110      typedef typename _Base::hasher          hasher;
111      typedef typename _Base::key_equal       key_equal;
112      typedef typename _Base::allocator_type  allocator_type;
113
114      explicit
115      __unordered_multiset(size_type __n = 10,
116			   const hasher& __hf = hasher(),
117			   const key_equal& __eql = key_equal(),
118			   const allocator_type& __a = allocator_type())
119      : _Base(__n, __hf, __detail::_Mod_range_hashing(),
120	      __detail::_Default_ranged_hash(), __eql,
121	      std::_Identity<_Value>(), __a)
122      { }
123
124
125      template<typename _InputIterator>
126	__unordered_multiset(_InputIterator __f, _InputIterator __l,
127			     typename _Base::size_type __n = 0,
128			     const hasher& __hf = hasher(),
129			     const key_equal& __eql = key_equal(),
130			     const allocator_type& __a = allocator_type())
131	: _Base(__f, __l, __n, __hf, __detail::_Mod_range_hashing(),
132		__detail::_Default_ranged_hash(), __eql,
133		std::_Identity<_Value>(), __a)
134	{ }
135    };
136
137  template<class _Value, class _Hash, class _Pred, class _Alloc,
138	   bool __cache_hash_code>
139    inline void
140    swap(__unordered_set<_Value, _Hash, _Pred, _Alloc, __cache_hash_code>& __x,
141	 __unordered_set<_Value, _Hash, _Pred, _Alloc, __cache_hash_code>& __y)
142    { __x.swap(__y); }
143
144  template<class _Value, class _Hash, class _Pred, class _Alloc,
145	   bool __cache_hash_code>
146    inline void
147    swap(__unordered_multiset<_Value, _Hash, _Pred,
148	 _Alloc, __cache_hash_code>& __x,
149	 __unordered_multiset<_Value, _Hash, _Pred,
150	 _Alloc, __cache_hash_code>& __y)
151    { __x.swap(__y); }
152
153
154  /**
155   *  @brief A standard container composed of unique keys (containing
156   *  at most one of each key value) in which the elements' keys are
157   *  the elements themselves.
158   *
159   *  @ingroup unordered_associative_containers
160   *
161   *  Meets the requirements of a <a href="tables.html#65">container</a>, and
162   *  <a href="tables.html#xx">unordered associative container</a>
163   *
164   *  @param  Value  Type of key objects.
165   *  @param  Hash  Hashing function object type, defaults to hash<Value>.
166   *  @param  Pred  Predicate function object type, defaults to equal_to<Value>.
167   *  @param  Alloc  Allocator type, defaults to allocator<Key>.
168   */
169  template<class _Value,
170	   class _Hash = hash<_Value>,
171	   class _Pred = std::equal_to<_Value>,
172	   class _Alloc = std::allocator<_Value> >
173    class unordered_set
174    : public __unordered_set<_Value, _Hash, _Pred, _Alloc>
175    {
176      typedef __unordered_set<_Value, _Hash, _Pred, _Alloc>  _Base;
177
178    public:
179      typedef typename _Base::value_type      value_type;
180      typedef typename _Base::size_type       size_type;
181      typedef typename _Base::hasher          hasher;
182      typedef typename _Base::key_equal       key_equal;
183      typedef typename _Base::allocator_type  allocator_type;
184
185      explicit
186      unordered_set(size_type __n = 10,
187		    const hasher& __hf = hasher(),
188		    const key_equal& __eql = key_equal(),
189		    const allocator_type& __a = allocator_type())
190      : _Base(__n, __hf, __eql, __a)
191      { }
192
193      template<typename _InputIterator>
194	unordered_set(_InputIterator __f, _InputIterator __l,
195		      size_type __n = 10,
196		      const hasher& __hf = hasher(),
197		      const key_equal& __eql = key_equal(),
198		      const allocator_type& __a = allocator_type())
199	: _Base(__f, __l, __n, __hf, __eql, __a)
200	{ }
201    };
202
203  /**
204   *  @brief A standard container composed of equivalent keys
205   *  (possibly containing multiple of each key value) in which the
206   *  elements' keys are the elements themselves.
207   *
208   *  @ingroup unordered_associative_containers
209   *
210   *  Meets the requirements of a <a href="tables.html#65">container</a>, and
211   *  <a href="tables.html#xx">unordered associative container</a>
212   *
213   *  @param  Value  Type of key objects.
214   *  @param  Hash  Hashing function object type, defaults to hash<Value>.
215   *  @param  Pred  Predicate function object type, defaults to equal_to<Value>.
216   *  @param  Alloc  Allocator type, defaults to allocator<Key>.
217   */
218  template<class _Value,
219	   class _Hash = hash<_Value>,
220	   class _Pred = std::equal_to<_Value>,
221	   class _Alloc = std::allocator<_Value> >
222    class unordered_multiset
223    : public __unordered_multiset<_Value, _Hash, _Pred, _Alloc>
224    {
225      typedef __unordered_multiset<_Value, _Hash, _Pred, _Alloc>  _Base;
226
227    public:
228      typedef typename _Base::value_type      value_type;
229      typedef typename _Base::size_type       size_type;
230      typedef typename _Base::hasher          hasher;
231      typedef typename _Base::key_equal       key_equal;
232      typedef typename _Base::allocator_type  allocator_type;
233
234      explicit
235      unordered_multiset(size_type __n = 10,
236			 const hasher& __hf = hasher(),
237			 const key_equal& __eql = key_equal(),
238			 const allocator_type& __a = allocator_type())
239      : _Base(__n, __hf, __eql, __a)
240      { }
241
242
243      template<typename _InputIterator>
244	unordered_multiset(_InputIterator __f, _InputIterator __l,
245			   typename _Base::size_type __n = 0,
246			   const hasher& __hf = hasher(),
247			   const key_equal& __eql = key_equal(),
248			   const allocator_type& __a = allocator_type())
249	: _Base(__f, __l, __n, __hf, __eql, __a)
250	{ }
251    };
252
253  template<class _Value, class _Hash, class _Pred, class _Alloc>
254    inline void
255    swap(unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
256	 unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
257    { __x.swap(__y); }
258
259  template<class _Value, class _Hash, class _Pred, class _Alloc>
260    inline void
261    swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
262	 unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
263    { __x.swap(__y); }
264
265_GLIBCXX_END_NAMESPACE_VERSION
266}
267}
268