Merge -r 127928:132243 from trunk
[official-gcc.git] / libstdc++-v3 / include / tr1_impl / unordered_map
blob5ecd5c0a9983b205b347f21cf40aef2000a7b134
1 // TR1 unordered_map -*- C++ -*-
3 // Copyright (C) 2007 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 2, or (at your option)
9 // any later version.
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.
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING.  If not, write to the Free
18 // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19 // USA.
21 // As a special exception, you may use this file as part of a free software
22 // library without restriction.  Specifically, if other files instantiate
23 // templates or use macros or inline functions from this file, or you compile
24 // this file and link it with other files to produce an executable, this
25 // file does not by itself cause the resulting executable to be covered by
26 // the GNU General Public License.  This exception does not however
27 // invalidate any other reasons why the executable file might be covered by
28 // the GNU General Public License.
30 /** @file tr1_impl/unordered_map
31  *  This is an internal header file, included by other library headers.
32  *  You should not attempt to use it directly.
33  */
35 namespace std
37 _GLIBCXX_BEGIN_NAMESPACE_TR1
39   // XXX When we get typedef templates these class definitions
40   // will be unnecessary.
41   template<class _Key, class _Tp,
42            class _Hash = hash<_Key>,
43            class _Pred = std::equal_to<_Key>,
44            class _Alloc = std::allocator<std::pair<const _Key, _Tp> >,
45            bool __cache_hash_code = false>
46     class __unordered_map
47     : public _Hashtable<_Key, std::pair<const _Key, _Tp>, _Alloc,
48                         std::_Select1st<std::pair<const _Key, _Tp> >, _Pred, 
49                         _Hash, __detail::_Mod_range_hashing,
50                         __detail::_Default_ranged_hash,
51                         __detail::_Prime_rehash_policy,
52                         __cache_hash_code, false, true>
53     {
54       typedef _Hashtable<_Key, std::pair<const _Key, _Tp>, _Alloc,
55                          std::_Select1st<std::pair<const _Key, _Tp> >, _Pred,
56                          _Hash, __detail::_Mod_range_hashing,
57                          __detail::_Default_ranged_hash,
58                          __detail::_Prime_rehash_policy,
59                          __cache_hash_code, false, true>
60         _Base;
62     public:
63       typedef typename _Base::size_type       size_type;
64       typedef typename _Base::hasher          hasher;
65       typedef typename _Base::key_equal       key_equal;
66       typedef typename _Base::allocator_type  allocator_type;
68       explicit
69       __unordered_map(size_type __n = 10,
70                       const hasher& __hf = hasher(),
71                       const key_equal& __eql = key_equal(),
72                       const allocator_type& __a = allocator_type())
73       : _Base(__n, __hf, __detail::_Mod_range_hashing(),
74               __detail::_Default_ranged_hash(),
75               __eql, std::_Select1st<std::pair<const _Key, _Tp> >(), __a)
76       { }
78       template<typename _InputIterator>
79         __unordered_map(_InputIterator __f, _InputIterator __l, 
80                         size_type __n = 10,
81                         const hasher& __hf = hasher(), 
82                         const key_equal& __eql = key_equal(), 
83                         const allocator_type& __a = allocator_type())
84         : _Base(__f, __l, __n, __hf, __detail::_Mod_range_hashing(),
85                 __detail::_Default_ranged_hash(),
86                 __eql, std::_Select1st<std::pair<const _Key, _Tp> >(), __a)
87         { }
89 #ifdef _GLIBCXX_INCLUDE_AS_CXX0X
90       __unordered_map(__unordered_map&& __x)
91       : _Base(std::forward<_Base>(__x)) { }
92 #endif
93     };
94   
95   template<class _Key, class _Tp,
96            class _Hash = hash<_Key>,
97            class _Pred = std::equal_to<_Key>,
98            class _Alloc = std::allocator<std::pair<const _Key, _Tp> >,
99            bool __cache_hash_code = false>
100     class __unordered_multimap
101     : public _Hashtable<_Key, std::pair<const _Key, _Tp>,
102                         _Alloc,
103                         std::_Select1st<std::pair<const _Key, _Tp> >, _Pred,
104                         _Hash, __detail::_Mod_range_hashing,
105                         __detail::_Default_ranged_hash,
106                         __detail::_Prime_rehash_policy,
107                         __cache_hash_code, false, false>
108     {
109       typedef _Hashtable<_Key, std::pair<const _Key, _Tp>,
110                          _Alloc,
111                          std::_Select1st<std::pair<const _Key, _Tp> >, _Pred,
112                          _Hash, __detail::_Mod_range_hashing,
113                          __detail::_Default_ranged_hash,
114                          __detail::_Prime_rehash_policy,
115                          __cache_hash_code, false, false>
116         _Base;
118     public:
119       typedef typename _Base::size_type       size_type;
120       typedef typename _Base::hasher          hasher;
121       typedef typename _Base::key_equal       key_equal;
122       typedef typename _Base::allocator_type  allocator_type;
123       
124       explicit
125       __unordered_multimap(size_type __n = 10,
126                            const hasher& __hf = hasher(),
127                            const key_equal& __eql = key_equal(),
128                            const allocator_type& __a = allocator_type())
129       : _Base(__n, __hf, __detail::_Mod_range_hashing(),
130               __detail::_Default_ranged_hash(),
131               __eql, std::_Select1st<std::pair<const _Key, _Tp> >(), __a)
132       { }
135       template<typename _InputIterator>
136         __unordered_multimap(_InputIterator __f, _InputIterator __l, 
137                              typename _Base::size_type __n = 0,
138                              const hasher& __hf = hasher(), 
139                              const key_equal& __eql = key_equal(), 
140                              const allocator_type& __a = allocator_type())
141         : _Base(__f, __l, __n, __hf, __detail::_Mod_range_hashing(),
142                 __detail::_Default_ranged_hash(),
143                 __eql, std::_Select1st<std::pair<const _Key, _Tp> >(), __a)
144         { }
146 #ifdef _GLIBCXX_INCLUDE_AS_CXX0X
147       __unordered_multimap(__unordered_multimap&& __x)
148       : _Base(std::forward<_Base>(__x)) { }
149 #endif
150     };
152   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc,
153            bool __cache_hash_code>
154     inline void
155     swap(__unordered_map<_Key, _Tp, _Hash, _Pred,
156          _Alloc, __cache_hash_code>& __x,
157          __unordered_map<_Key, _Tp, _Hash, _Pred,
158          _Alloc, __cache_hash_code>& __y)
159     { __x.swap(__y); }
161   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc,
162            bool __cache_hash_code>
163     inline void
164     swap(__unordered_multimap<_Key, _Tp, _Hash, _Pred,
165          _Alloc, __cache_hash_code>& __x,
166          __unordered_multimap<_Key, _Tp, _Hash, _Pred,
167          _Alloc, __cache_hash_code>& __y)
168     { __x.swap(__y); }
171   template<class _Key, class _Tp,
172            class _Hash = hash<_Key>,
173            class _Pred = std::equal_to<_Key>,
174            class _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
175     class unordered_map
176     : public __unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>
177     {
178       typedef __unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>  _Base;
180     public:
181       typedef typename _Base::size_type       size_type;
182       typedef typename _Base::hasher          hasher;
183       typedef typename _Base::key_equal       key_equal;
184       typedef typename _Base::allocator_type  allocator_type;
186       explicit
187       unordered_map(size_type __n = 10,
188                     const hasher& __hf = hasher(),
189                     const key_equal& __eql = key_equal(),
190                     const allocator_type& __a = allocator_type())
191       : _Base(__n, __hf, __eql, __a)
192       { }
194       template<typename _InputIterator>
195         unordered_map(_InputIterator __f, _InputIterator __l, 
196                       size_type __n = 10,
197                       const hasher& __hf = hasher(), 
198                       const key_equal& __eql = key_equal(), 
199                       const allocator_type& __a = allocator_type())
200         : _Base(__f, __l, __n, __hf, __eql, __a)
201         { }
203 #ifdef _GLIBCXX_INCLUDE_AS_CXX0X
204       unordered_map(unordered_map&& __x)
205       : _Base(std::forward<_Base>(__x)) { }
207       unordered_map&
208       operator=(unordered_map&& __x)
209       {
210         // NB: DR 675.
211         this->clear();
212         this->swap(__x); 
213         return *this;   
214       }
215 #endif
216     };
217   
218   template<class _Key, class _Tp,
219            class _Hash = hash<_Key>,
220            class _Pred = std::equal_to<_Key>,
221            class _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
222     class unordered_multimap
223     : public __unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>
224     {
225       typedef __unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>  _Base;
227     public:
228       typedef typename _Base::size_type       size_type;
229       typedef typename _Base::hasher          hasher;
230       typedef typename _Base::key_equal       key_equal;
231       typedef typename _Base::allocator_type  allocator_type;
232       
233       explicit
234       unordered_multimap(size_type __n = 10,
235                          const hasher& __hf = hasher(),
236                          const key_equal& __eql = key_equal(),
237                          const allocator_type& __a = allocator_type())
238       : _Base(__n, __hf, __eql, __a)
239       { }
242       template<typename _InputIterator>
243         unordered_multimap(_InputIterator __f, _InputIterator __l, 
244                            typename _Base::size_type __n = 0,
245                            const hasher& __hf = hasher(), 
246                            const key_equal& __eql = key_equal(), 
247                            const allocator_type& __a = allocator_type())
248         : _Base(__f, __l, __n, __hf, __eql, __a)
249         { }
251 #ifdef _GLIBCXX_INCLUDE_AS_CXX0X
252       unordered_multimap(unordered_multimap&& __x)
253       : _Base(std::forward<_Base>(__x)) { }
255       unordered_multimap&
256       operator=(unordered_multimap&& __x)
257       {
258         // NB: DR 675.
259         this->clear();
260         this->swap(__x); 
261         return *this;   
262       }
263 #endif
264     };
266   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
267     inline void
268     swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
269          unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
270     { __x.swap(__y); }
272   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
273     inline void
274     swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
275          unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
276     { __x.swap(__y); }
278 #ifdef _GLIBCXX_INCLUDE_AS_CXX0X
279   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
280     inline void
281     swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&& __x,
282          unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
283     { __x.swap(__y); }
285   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
286     inline void
287     swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
288          unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&& __y)
289     { __x.swap(__y); }
291   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
292     inline void
293     swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&& __x,
294          unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
295     { __x.swap(__y); }
297   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
298     inline void
299     swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
300          unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&& __y)
301     { __x.swap(__y); }
302 #endif
304 _GLIBCXX_END_NAMESPACE_TR1