3 * Silicon Graphics Computer Systems, Inc.
5 * Permission to use, copy, modify, distribute and sell this software
6 * and its documentation for any purpose is hereby granted without fee,
7 * provided that the above copyright notice appear in all copies and
8 * that both that copyright notice and this permission notice appear
9 * in supporting documentation. Silicon Graphics makes no
10 * representations about the suitability of this software for any
11 * purpose. It is provided "as is" without express or implied warranty.
15 * Hewlett-Packard Company
17 * Permission to use, copy, modify, distribute and sell this software
18 * and its documentation for any purpose is hereby granted without fee,
19 * provided that the above copyright notice appear in all copies and
20 * that both that copyright notice and this permission notice appear
21 * in supporting documentation. Hewlett-Packard Company makes no
22 * representations about the suitability of this software for any
23 * purpose. It is provided "as is" without express or implied warranty.
27 /* NOTE: This is an internal header file, included by other STL headers.
28 * You should not attempt to use it directly.
31 #ifndef __SGI_STL_INTERNAL_HASH_MAP_H
32 #define __SGI_STL_INTERNAL_HASH_MAP_H
37 #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
42 #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
43 template <class _Key
, class _Tp
, class _HashFcn
= hash
<_Key
>,
44 class _EqualKey
= equal_to
<_Key
>,
45 class _Alloc
= __STL_DEFAULT_ALLOCATOR(_Tp
) >
47 template <class _Key
, class _Tp
, class _HashFcn
, class _EqualKey
,
48 class _Alloc
= __STL_DEFAULT_ALLOCATOR(_Tp
) >
53 typedef hashtable
<pair
<const _Key
,_Tp
>,_Key
,_HashFcn
,
54 _Select1st
<pair
<const _Key
,_Tp
> >,_EqualKey
,_Alloc
> _Ht
;
58 typedef typename
_Ht::key_type key_type
;
59 typedef _Tp data_type
;
60 typedef _Tp mapped_type
;
61 typedef typename
_Ht::value_type value_type
;
62 typedef typename
_Ht::hasher hasher
;
63 typedef typename
_Ht::key_equal key_equal
;
65 typedef typename
_Ht::size_type size_type
;
66 typedef typename
_Ht::difference_type difference_type
;
67 typedef typename
_Ht::pointer pointer
;
68 typedef typename
_Ht::const_pointer const_pointer
;
69 typedef typename
_Ht::reference reference
;
70 typedef typename
_Ht::const_reference const_reference
;
72 typedef typename
_Ht::iterator iterator
;
73 typedef typename
_Ht::const_iterator const_iterator
;
75 typedef typename
_Ht::allocator_type allocator_type
;
77 hasher
hash_funct() const { return _M_ht
.hash_funct(); }
78 key_equal
key_eq() const { return _M_ht
.key_eq(); }
79 allocator_type
get_allocator() const { return _M_ht
.get_allocator(); }
82 hash_map() : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
83 explicit hash_map(size_type __n
)
84 : _M_ht(__n
, hasher(), key_equal(), allocator_type()) {}
85 hash_map(size_type __n
, const hasher
& __hf
)
86 : _M_ht(__n
, __hf
, key_equal(), allocator_type()) {}
87 hash_map(size_type __n
, const hasher
& __hf
, const key_equal
& __eql
,
88 const allocator_type
& __a
= allocator_type())
89 : _M_ht(__n
, __hf
, __eql
, __a
) {}
91 #ifdef __STL_MEMBER_TEMPLATES
92 template <class _InputIterator
>
93 hash_map(_InputIterator __f
, _InputIterator __l
)
94 : _M_ht(100, hasher(), key_equal(), allocator_type())
95 { _M_ht
.insert_unique(__f
, __l
); }
96 template <class _InputIterator
>
97 hash_map(_InputIterator __f
, _InputIterator __l
, size_type __n
)
98 : _M_ht(__n
, hasher(), key_equal(), allocator_type())
99 { _M_ht
.insert_unique(__f
, __l
); }
100 template <class _InputIterator
>
101 hash_map(_InputIterator __f
, _InputIterator __l
, size_type __n
,
103 : _M_ht(__n
, __hf
, key_equal(), allocator_type())
104 { _M_ht
.insert_unique(__f
, __l
); }
105 template <class _InputIterator
>
106 hash_map(_InputIterator __f
, _InputIterator __l
, size_type __n
,
107 const hasher
& __hf
, const key_equal
& __eql
,
108 const allocator_type
& __a
= allocator_type())
109 : _M_ht(__n
, __hf
, __eql
, __a
)
110 { _M_ht
.insert_unique(__f
, __l
); }
113 hash_map(const value_type
* __f
, const value_type
* __l
)
114 : _M_ht(100, hasher(), key_equal(), allocator_type())
115 { _M_ht
.insert_unique(__f
, __l
); }
116 hash_map(const value_type
* __f
, const value_type
* __l
, size_type __n
)
117 : _M_ht(__n
, hasher(), key_equal(), allocator_type())
118 { _M_ht
.insert_unique(__f
, __l
); }
119 hash_map(const value_type
* __f
, const value_type
* __l
, size_type __n
,
121 : _M_ht(__n
, __hf
, key_equal(), allocator_type())
122 { _M_ht
.insert_unique(__f
, __l
); }
123 hash_map(const value_type
* __f
, const value_type
* __l
, size_type __n
,
124 const hasher
& __hf
, const key_equal
& __eql
,
125 const allocator_type
& __a
= allocator_type())
126 : _M_ht(__n
, __hf
, __eql
, __a
)
127 { _M_ht
.insert_unique(__f
, __l
); }
129 hash_map(const_iterator __f
, const_iterator __l
)
130 : _M_ht(100, hasher(), key_equal(), allocator_type())
131 { _M_ht
.insert_unique(__f
, __l
); }
132 hash_map(const_iterator __f
, const_iterator __l
, size_type __n
)
133 : _M_ht(__n
, hasher(), key_equal(), allocator_type())
134 { _M_ht
.insert_unique(__f
, __l
); }
135 hash_map(const_iterator __f
, const_iterator __l
, size_type __n
,
137 : _M_ht(__n
, __hf
, key_equal(), allocator_type())
138 { _M_ht
.insert_unique(__f
, __l
); }
139 hash_map(const_iterator __f
, const_iterator __l
, size_type __n
,
140 const hasher
& __hf
, const key_equal
& __eql
,
141 const allocator_type
& __a
= allocator_type())
142 : _M_ht(__n
, __hf
, __eql
, __a
)
143 { _M_ht
.insert_unique(__f
, __l
); }
144 #endif /*__STL_MEMBER_TEMPLATES */
147 size_type
size() const { return _M_ht
.size(); }
148 size_type
max_size() const { return _M_ht
.max_size(); }
149 bool empty() const { return _M_ht
.empty(); }
150 void swap(hash_map
& __hs
) { _M_ht
.swap(__hs
._M_ht
); }
152 operator== __STL_NULL_TMPL_ARGS (const hash_map
&, const hash_map
&);
154 iterator
begin() { return _M_ht
.begin(); }
155 iterator
end() { return _M_ht
.end(); }
156 const_iterator
begin() const { return _M_ht
.begin(); }
157 const_iterator
end() const { return _M_ht
.end(); }
160 pair
<iterator
,bool> insert(const value_type
& __obj
)
161 { return _M_ht
.insert_unique(__obj
); }
162 #ifdef __STL_MEMBER_TEMPLATES
163 template <class _InputIterator
>
164 void insert(_InputIterator __f
, _InputIterator __l
)
165 { _M_ht
.insert_unique(__f
,__l
); }
167 void insert(const value_type
* __f
, const value_type
* __l
) {
168 _M_ht
.insert_unique(__f
,__l
);
170 void insert(const_iterator __f
, const_iterator __l
)
171 { _M_ht
.insert_unique(__f
, __l
); }
172 #endif /*__STL_MEMBER_TEMPLATES */
173 pair
<iterator
,bool> insert_noresize(const value_type
& __obj
)
174 { return _M_ht
.insert_unique_noresize(__obj
); }
176 iterator
find(const key_type
& __key
) { return _M_ht
.find(__key
); }
177 const_iterator
find(const key_type
& __key
) const
178 { return _M_ht
.find(__key
); }
180 _Tp
& operator[](const key_type
& __key
) {
181 return _M_ht
.find_or_insert(value_type(__key
, _Tp())).second
;
184 size_type
count(const key_type
& __key
) const { return _M_ht
.count(__key
); }
186 pair
<iterator
, iterator
> equal_range(const key_type
& __key
)
187 { return _M_ht
.equal_range(__key
); }
188 pair
<const_iterator
, const_iterator
>
189 equal_range(const key_type
& __key
) const
190 { return _M_ht
.equal_range(__key
); }
192 size_type
erase(const key_type
& __key
) {return _M_ht
.erase(__key
); }
193 void erase(iterator __it
) { _M_ht
.erase(__it
); }
194 void erase(iterator __f
, iterator __l
) { _M_ht
.erase(__f
, __l
); }
195 void clear() { _M_ht
.clear(); }
197 void resize(size_type __hint
) { _M_ht
.resize(__hint
); }
198 size_type
bucket_count() const { return _M_ht
.bucket_count(); }
199 size_type
max_bucket_count() const { return _M_ht
.max_bucket_count(); }
200 size_type
elems_in_bucket(size_type __n
) const
201 { return _M_ht
.elems_in_bucket(__n
); }
204 template <class _Key
, class _Tp
, class _HashFcn
, class _EqlKey
, class _Alloc
>
206 operator==(const hash_map
<_Key
,_Tp
,_HashFcn
,_EqlKey
,_Alloc
>& __hm1
,
207 const hash_map
<_Key
,_Tp
,_HashFcn
,_EqlKey
,_Alloc
>& __hm2
)
209 return __hm1
._M_ht
== __hm2
._M_ht
;
212 #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
214 template <class _Key
, class _Tp
, class _HashFcn
, class _EqlKey
, class _Alloc
>
216 swap(hash_map
<_Key
,_Tp
,_HashFcn
,_EqlKey
,_Alloc
>& __hm1
,
217 hash_map
<_Key
,_Tp
,_HashFcn
,_EqlKey
,_Alloc
>& __hm2
)
222 #endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
224 #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
225 template <class _Key
, class _Tp
, class _HashFcn
= hash
<_Key
>,
226 class _EqualKey
= equal_to
<_Key
>,
227 class _Alloc
= __STL_DEFAULT_ALLOCATOR(_Tp
) >
229 template <class _Key
, class _Tp
, class _HashFcn
, class _EqualKey
,
230 class _Alloc
= __STL_DEFAULT_ALLOCATOR(_Tp
) >
235 typedef hashtable
<pair
<const _Key
, _Tp
>, _Key
, _HashFcn
,
236 _Select1st
<pair
<const _Key
, _Tp
> >, _EqualKey
, _Alloc
>
241 typedef typename
_Ht::key_type key_type
;
242 typedef _Tp data_type
;
243 typedef _Tp mapped_type
;
244 typedef typename
_Ht::value_type value_type
;
245 typedef typename
_Ht::hasher hasher
;
246 typedef typename
_Ht::key_equal key_equal
;
248 typedef typename
_Ht::size_type size_type
;
249 typedef typename
_Ht::difference_type difference_type
;
250 typedef typename
_Ht::pointer pointer
;
251 typedef typename
_Ht::const_pointer const_pointer
;
252 typedef typename
_Ht::reference reference
;
253 typedef typename
_Ht::const_reference const_reference
;
255 typedef typename
_Ht::iterator iterator
;
256 typedef typename
_Ht::const_iterator const_iterator
;
258 typedef typename
_Ht::allocator_type allocator_type
;
260 hasher
hash_funct() const { return _M_ht
.hash_funct(); }
261 key_equal
key_eq() const { return _M_ht
.key_eq(); }
262 allocator_type
get_allocator() const { return _M_ht
.get_allocator(); }
265 hash_multimap() : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
266 explicit hash_multimap(size_type __n
)
267 : _M_ht(__n
, hasher(), key_equal(), allocator_type()) {}
268 hash_multimap(size_type __n
, const hasher
& __hf
)
269 : _M_ht(__n
, __hf
, key_equal(), allocator_type()) {}
270 hash_multimap(size_type __n
, const hasher
& __hf
, const key_equal
& __eql
,
271 const allocator_type
& __a
= allocator_type())
272 : _M_ht(__n
, __hf
, __eql
, __a
) {}
274 #ifdef __STL_MEMBER_TEMPLATES
275 template <class _InputIterator
>
276 hash_multimap(_InputIterator __f
, _InputIterator __l
)
277 : _M_ht(100, hasher(), key_equal(), allocator_type())
278 { _M_ht
.insert_equal(__f
, __l
); }
279 template <class _InputIterator
>
280 hash_multimap(_InputIterator __f
, _InputIterator __l
, size_type __n
)
281 : _M_ht(__n
, hasher(), key_equal(), allocator_type())
282 { _M_ht
.insert_equal(__f
, __l
); }
283 template <class _InputIterator
>
284 hash_multimap(_InputIterator __f
, _InputIterator __l
, size_type __n
,
286 : _M_ht(__n
, __hf
, key_equal(), allocator_type())
287 { _M_ht
.insert_equal(__f
, __l
); }
288 template <class _InputIterator
>
289 hash_multimap(_InputIterator __f
, _InputIterator __l
, size_type __n
,
290 const hasher
& __hf
, const key_equal
& __eql
,
291 const allocator_type
& __a
= allocator_type())
292 : _M_ht(__n
, __hf
, __eql
, __a
)
293 { _M_ht
.insert_equal(__f
, __l
); }
296 hash_multimap(const value_type
* __f
, const value_type
* __l
)
297 : _M_ht(100, hasher(), key_equal(), allocator_type())
298 { _M_ht
.insert_equal(__f
, __l
); }
299 hash_multimap(const value_type
* __f
, const value_type
* __l
, size_type __n
)
300 : _M_ht(__n
, hasher(), key_equal(), allocator_type())
301 { _M_ht
.insert_equal(__f
, __l
); }
302 hash_multimap(const value_type
* __f
, const value_type
* __l
, size_type __n
,
304 : _M_ht(__n
, __hf
, key_equal(), allocator_type())
305 { _M_ht
.insert_equal(__f
, __l
); }
306 hash_multimap(const value_type
* __f
, const value_type
* __l
, size_type __n
,
307 const hasher
& __hf
, const key_equal
& __eql
,
308 const allocator_type
& __a
= allocator_type())
309 : _M_ht(__n
, __hf
, __eql
, __a
)
310 { _M_ht
.insert_equal(__f
, __l
); }
312 hash_multimap(const_iterator __f
, const_iterator __l
)
313 : _M_ht(100, hasher(), key_equal(), allocator_type())
314 { _M_ht
.insert_equal(__f
, __l
); }
315 hash_multimap(const_iterator __f
, const_iterator __l
, size_type __n
)
316 : _M_ht(__n
, hasher(), key_equal(), allocator_type())
317 { _M_ht
.insert_equal(__f
, __l
); }
318 hash_multimap(const_iterator __f
, const_iterator __l
, size_type __n
,
320 : _M_ht(__n
, __hf
, key_equal(), allocator_type())
321 { _M_ht
.insert_equal(__f
, __l
); }
322 hash_multimap(const_iterator __f
, const_iterator __l
, size_type __n
,
323 const hasher
& __hf
, const key_equal
& __eql
,
324 const allocator_type
& __a
= allocator_type())
325 : _M_ht(__n
, __hf
, __eql
, __a
)
326 { _M_ht
.insert_equal(__f
, __l
); }
327 #endif /*__STL_MEMBER_TEMPLATES */
330 size_type
size() const { return _M_ht
.size(); }
331 size_type
max_size() const { return _M_ht
.max_size(); }
332 bool empty() const { return _M_ht
.empty(); }
333 void swap(hash_multimap
& __hs
) { _M_ht
.swap(__hs
._M_ht
); }
335 operator== __STL_NULL_TMPL_ARGS (const hash_multimap
&,
336 const hash_multimap
&);
338 iterator
begin() { return _M_ht
.begin(); }
339 iterator
end() { return _M_ht
.end(); }
340 const_iterator
begin() const { return _M_ht
.begin(); }
341 const_iterator
end() const { return _M_ht
.end(); }
344 iterator
insert(const value_type
& __obj
)
345 { return _M_ht
.insert_equal(__obj
); }
346 #ifdef __STL_MEMBER_TEMPLATES
347 template <class _InputIterator
>
348 void insert(_InputIterator __f
, _InputIterator __l
)
349 { _M_ht
.insert_equal(__f
,__l
); }
351 void insert(const value_type
* __f
, const value_type
* __l
) {
352 _M_ht
.insert_equal(__f
,__l
);
354 void insert(const_iterator __f
, const_iterator __l
)
355 { _M_ht
.insert_equal(__f
, __l
); }
356 #endif /*__STL_MEMBER_TEMPLATES */
357 iterator
insert_noresize(const value_type
& __obj
)
358 { return _M_ht
.insert_equal_noresize(__obj
); }
360 iterator
find(const key_type
& __key
) { return _M_ht
.find(__key
); }
361 const_iterator
find(const key_type
& __key
) const
362 { return _M_ht
.find(__key
); }
364 size_type
count(const key_type
& __key
) const { return _M_ht
.count(__key
); }
366 pair
<iterator
, iterator
> equal_range(const key_type
& __key
)
367 { return _M_ht
.equal_range(__key
); }
368 pair
<const_iterator
, const_iterator
>
369 equal_range(const key_type
& __key
) const
370 { return _M_ht
.equal_range(__key
); }
372 size_type
erase(const key_type
& __key
) {return _M_ht
.erase(__key
); }
373 void erase(iterator __it
) { _M_ht
.erase(__it
); }
374 void erase(iterator __f
, iterator __l
) { _M_ht
.erase(__f
, __l
); }
375 void clear() { _M_ht
.clear(); }
378 void resize(size_type __hint
) { _M_ht
.resize(__hint
); }
379 size_type
bucket_count() const { return _M_ht
.bucket_count(); }
380 size_type
max_bucket_count() const { return _M_ht
.max_bucket_count(); }
381 size_type
elems_in_bucket(size_type __n
) const
382 { return _M_ht
.elems_in_bucket(__n
); }
385 template <class _Key
, class _Tp
, class _HF
, class _EqKey
, class _Alloc
>
387 operator==(const hash_multimap
<_Key
,_Tp
,_HF
,_EqKey
,_Alloc
>& __hm1
,
388 const hash_multimap
<_Key
,_Tp
,_HF
,_EqKey
,_Alloc
>& __hm2
)
390 return __hm1
._M_ht
== __hm2
._M_ht
;
393 #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
395 template <class _Key
, class _Tp
, class _HashFcn
, class _EqlKey
, class _Alloc
>
397 swap(hash_multimap
<_Key
,_Tp
,_HashFcn
,_EqlKey
,_Alloc
>& __hm1
,
398 hash_multimap
<_Key
,_Tp
,_HashFcn
,_EqlKey
,_Alloc
>& __hm2
)
403 #endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
405 #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
406 #pragma reset woff 1174
407 #pragma reset woff 1375
412 #endif /* __SGI_STL_INTERNAL_HASH_MAP_H */