OSDN Git Service

2010-11-18 Benjamin Kosnik <bkoz@redhat.com>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / include / tr1 / unordered_map.h
1 // TR1 unordered_map implementation -*- C++ -*-
2
3 // Copyright (C) 2010 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_map.h
26  *  This is an internal header file, included by other library headers.
27  *  Do not attempt to use it directly. @headername{tr1/unordered_map}
28  */
29
30 namespace std
31 {
32 namespace tr1
33 {
34   // XXX When we get typedef templates these class definitions
35   // will be unnecessary.
36   template<class _Key, class _Tp,
37            class _Hash = hash<_Key>,
38            class _Pred = std::equal_to<_Key>,
39            class _Alloc = std::allocator<std::pair<const _Key, _Tp> >,
40            bool __cache_hash_code = false>
41     class __unordered_map
42     : public _Hashtable<_Key, std::pair<const _Key, _Tp>, _Alloc,
43                         std::_Select1st<std::pair<const _Key, _Tp> >, _Pred,
44                         _Hash, __detail::_Mod_range_hashing,
45                         __detail::_Default_ranged_hash,
46                         __detail::_Prime_rehash_policy,
47                         __cache_hash_code, false, true>
48     {
49       typedef _Hashtable<_Key, std::pair<const _Key, _Tp>, _Alloc,
50                          std::_Select1st<std::pair<const _Key, _Tp> >, _Pred,
51                          _Hash, __detail::_Mod_range_hashing,
52                          __detail::_Default_ranged_hash,
53                          __detail::_Prime_rehash_policy,
54                          __cache_hash_code, false, true>
55         _Base;
56
57     public:
58       typedef typename _Base::size_type       size_type;
59       typedef typename _Base::hasher          hasher;
60       typedef typename _Base::key_equal       key_equal;
61       typedef typename _Base::allocator_type  allocator_type;
62
63       explicit
64       __unordered_map(size_type __n = 10,
65                       const hasher& __hf = hasher(),
66                       const key_equal& __eql = key_equal(),
67                       const allocator_type& __a = allocator_type())
68       : _Base(__n, __hf, __detail::_Mod_range_hashing(),
69               __detail::_Default_ranged_hash(),
70               __eql, std::_Select1st<std::pair<const _Key, _Tp> >(), __a)
71       { }
72
73       template<typename _InputIterator>
74         __unordered_map(_InputIterator __f, _InputIterator __l,
75                         size_type __n = 10,
76                         const hasher& __hf = hasher(),
77                         const key_equal& __eql = key_equal(),
78                         const allocator_type& __a = allocator_type())
79         : _Base(__f, __l, __n, __hf, __detail::_Mod_range_hashing(),
80                 __detail::_Default_ranged_hash(),
81                 __eql, std::_Select1st<std::pair<const _Key, _Tp> >(), __a)
82         { }
83     };
84
85   template<class _Key, class _Tp,
86            class _Hash = hash<_Key>,
87            class _Pred = std::equal_to<_Key>,
88            class _Alloc = std::allocator<std::pair<const _Key, _Tp> >,
89            bool __cache_hash_code = false>
90     class __unordered_multimap
91     : public _Hashtable<_Key, std::pair<const _Key, _Tp>,
92                         _Alloc,
93                         std::_Select1st<std::pair<const _Key, _Tp> >, _Pred,
94                         _Hash, __detail::_Mod_range_hashing,
95                         __detail::_Default_ranged_hash,
96                         __detail::_Prime_rehash_policy,
97                         __cache_hash_code, false, false>
98     {
99       typedef _Hashtable<_Key, std::pair<const _Key, _Tp>,
100                          _Alloc,
101                          std::_Select1st<std::pair<const _Key, _Tp> >, _Pred,
102                          _Hash, __detail::_Mod_range_hashing,
103                          __detail::_Default_ranged_hash,
104                          __detail::_Prime_rehash_policy,
105                          __cache_hash_code, false, 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_multimap(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(),
121               __eql, std::_Select1st<std::pair<const _Key, _Tp> >(), __a)
122       { }
123
124
125       template<typename _InputIterator>
126         __unordered_multimap(_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(),
133                 __eql, std::_Select1st<std::pair<const _Key, _Tp> >(), __a)
134         { }
135     };
136
137   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc,
138            bool __cache_hash_code>
139     inline void
140     swap(__unordered_map<_Key, _Tp, _Hash, _Pred,
141          _Alloc, __cache_hash_code>& __x,
142          __unordered_map<_Key, _Tp, _Hash, _Pred,
143          _Alloc, __cache_hash_code>& __y)
144     { __x.swap(__y); }
145
146   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc,
147            bool __cache_hash_code>
148     inline void
149     swap(__unordered_multimap<_Key, _Tp, _Hash, _Pred,
150          _Alloc, __cache_hash_code>& __x,
151          __unordered_multimap<_Key, _Tp, _Hash, _Pred,
152          _Alloc, __cache_hash_code>& __y)
153     { __x.swap(__y); }
154
155
156   /**
157    *  @brief A standard container composed of unique keys (containing
158    *  at most one of each key value) that associates values of another type
159    *  with the keys.
160    *
161    *  @ingroup unordered_associative_containers
162    *
163    *  Meets the requirements of a <a href="tables.html#65">container</a>, and
164    *  <a href="tables.html#xx">unordered associative container</a>
165    *
166    *  @param  Key  Type of key objects.
167    *  @param  Tp  Type of mapped objects.
168    *  @param  Hash  Hashing function object type, defaults to hash<Value>.
169    *  @param  Pred  Predicate function object type, defaults to equal_to<Value>.
170    *  @param  Alloc  Allocator type, defaults to allocator<Key>.
171    *
172    * The resulting value type of the container is std::pair<const Key, Tp>.
173    */
174   template<class _Key, class _Tp,
175            class _Hash = hash<_Key>,
176            class _Pred = std::equal_to<_Key>,
177            class _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
178     class unordered_map
179     : public __unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>
180     {
181       typedef __unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>  _Base;
182
183     public:
184       typedef typename _Base::value_type      value_type;
185       typedef typename _Base::size_type       size_type;
186       typedef typename _Base::hasher          hasher;
187       typedef typename _Base::key_equal       key_equal;
188       typedef typename _Base::allocator_type  allocator_type;
189
190       explicit
191       unordered_map(size_type __n = 10,
192                     const hasher& __hf = hasher(),
193                     const key_equal& __eql = key_equal(),
194                     const allocator_type& __a = allocator_type())
195       : _Base(__n, __hf, __eql, __a)
196       { }
197
198       template<typename _InputIterator>
199         unordered_map(_InputIterator __f, _InputIterator __l,
200                       size_type __n = 10,
201                       const hasher& __hf = hasher(),
202                       const key_equal& __eql = key_equal(),
203                       const allocator_type& __a = allocator_type())
204         : _Base(__f, __l, __n, __hf, __eql, __a)
205         { }
206     };
207
208   /**
209    *  @brief A standard container composed of equivalent keys
210    *  (possibly containing multiple of each key value) that associates
211    *  values of another type with the keys.
212    *
213    *  @ingroup unordered_associative_containers
214    *
215    *  Meets the requirements of a <a href="tables.html#65">container</a>, and
216    *  <a href="tables.html#xx">unordered associative container</a>
217    *
218    *  @param  Key  Type of key objects.
219    *  @param  Tp  Type of mapped objects.
220    *  @param  Hash  Hashing function object type, defaults to hash<Value>.
221    *  @param  Pred  Predicate function object type, defaults to equal_to<Value>.
222    *  @param  Alloc  Allocator type, defaults to allocator<Key>.
223    *
224    * The resulting value type of the container is std::pair<const Key, Tp>.
225    */
226   template<class _Key, class _Tp,
227            class _Hash = hash<_Key>,
228            class _Pred = std::equal_to<_Key>,
229            class _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
230     class unordered_multimap
231     : public __unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>
232     {
233       typedef __unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>  _Base;
234
235     public:
236       typedef typename _Base::value_type      value_type;
237       typedef typename _Base::size_type       size_type;
238       typedef typename _Base::hasher          hasher;
239       typedef typename _Base::key_equal       key_equal;
240       typedef typename _Base::allocator_type  allocator_type;
241
242       explicit
243       unordered_multimap(size_type __n = 10,
244                          const hasher& __hf = hasher(),
245                          const key_equal& __eql = key_equal(),
246                          const allocator_type& __a = allocator_type())
247       : _Base(__n, __hf, __eql, __a)
248       { }
249
250
251       template<typename _InputIterator>
252         unordered_multimap(_InputIterator __f, _InputIterator __l,
253                            typename _Base::size_type __n = 0,
254                            const hasher& __hf = hasher(),
255                            const key_equal& __eql = key_equal(),
256                            const allocator_type& __a = allocator_type())
257         : _Base(__f, __l, __n, __hf, __eql, __a)
258         { }
259
260     };
261
262   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
263     inline void
264     swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
265          unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
266     { __x.swap(__y); }
267
268   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
269     inline void
270     swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
271          unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
272     { __x.swap(__y); }
273 }
274 }