fix ChangeLog entry
[official-gcc.git] / libstdc++-v3 / include / profile / unordered_set
blob4c2a7ff19679c199e1e536bd2c84f95d2eaa5431
1 // Profiling unordered_set/unordered_multiset implementation -*- C++ -*-
3 // Copyright (C) 2009-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.
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 // 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.
20 // You should have received a copy of the GNU General Public License along
21 // with this library; see the file COPYING3.  If not see
22 // <http://www.gnu.org/licenses/>.
24 /** @file profile/unordered_set
25  *  This file is a GNU profile extension to the Standard C++ Library.
26  */
28 #ifndef _GLIBCXX_PROFILE_UNORDERED_SET
29 #define _GLIBCXX_PROFILE_UNORDERED_SET 1
31 #if __cplusplus < 201103L
32 # include <bits/c++0x_warning.h>
33 #else
34 # include <unordered_set>
36 #include <profile/base.h>
37 #include <profile/unordered_base.h>
39 #define _GLIBCXX_BASE unordered_set<_Key, _Hash, _Pred, _Alloc>
40 #define _GLIBCXX_STD_BASE _GLIBCXX_STD_C::_GLIBCXX_BASE
42 namespace std _GLIBCXX_VISIBILITY(default)
44 namespace __profile
46   /** @brief Unordered_set wrapper with performance instrumentation.  */
47   template<typename _Key,
48            typename _Hash = std::hash<_Key>,
49            typename _Pred = std::equal_to<_Key>,
50            typename _Alloc =  std::allocator<_Key> >
51     class unordered_set
52     : public _GLIBCXX_STD_BASE,
53       public _Unordered_profile<unordered_set<_Key, _Hash, _Pred, _Alloc>,
54                                 true>
55     {
56       typedef _GLIBCXX_STD_BASE _Base;
58       _Base&
59       _M_base() noexcept       { return *this; }
61       const _Base&
62       _M_base() const noexcept { return *this; }
64     public:
65       typedef typename _Base::size_type         size_type;
66       typedef typename _Base::hasher            hasher;
67       typedef typename _Base::key_equal         key_equal;
68       typedef typename _Base::allocator_type    allocator_type;
69       typedef typename _Base::key_type          key_type;
70       typedef typename _Base::value_type        value_type;
71       typedef typename _Base::difference_type   difference_type;
72       typedef typename _Base::reference         reference;
73       typedef typename _Base::const_reference   const_reference;
75       typedef typename _Base::iterator          iterator;
76       typedef typename _Base::const_iterator    const_iterator;
78       unordered_set() = default;
80       explicit
81       unordered_set(size_type __n,
82                     const hasher& __hf = hasher(),
83                     const key_equal& __eql = key_equal(),
84                     const allocator_type& __a = allocator_type())
85         : _Base(__n, __hf, __eql, __a)
86       { }
88       template<typename _InputIterator>
89         unordered_set(_InputIterator __f, _InputIterator __l,
90                       size_type __n = 0,
91                       const hasher& __hf = hasher(),
92                       const key_equal& __eql = key_equal(),
93                       const allocator_type& __a = allocator_type())
94           : _Base(__f, __l, __n, __hf, __eql, __a)
95       { }
97       unordered_set(const unordered_set&) = default;
99       unordered_set(const _Base& __x)
100         : _Base(__x)
101       { }
103       unordered_set(unordered_set&&) = default;
105       explicit
106       unordered_set(const allocator_type& __a)
107         : _Base(__a)
108       { }
110       unordered_set(const unordered_set& __uset,
111                     const allocator_type& __a)
112         : _Base(__uset._M_base(), __a)
113       { }
115       unordered_set(unordered_set&& __uset,
116                     const allocator_type& __a)
117         : _Base(std::move(__uset._M_base()), __a)
118       { }
120       unordered_set(initializer_list<value_type> __l,
121                     size_type __n = 0,
122                     const hasher& __hf = hasher(),
123                     const key_equal& __eql = key_equal(),
124                     const allocator_type& __a = allocator_type())
125       : _Base(__l, __n, __hf, __eql, __a)
126       { }
128       unordered_set(size_type __n, const allocator_type& __a)
129         : unordered_set(__n, hasher(), key_equal(), __a)
130       { }
132       unordered_set(size_type __n, const hasher& __hf,
133                     const allocator_type& __a)
134         : unordered_set(__n, __hf, key_equal(), __a)
135       { }
137       template<typename _InputIterator>
138         unordered_set(_InputIterator __first, _InputIterator __last,
139                       size_type __n,
140                       const allocator_type& __a)
141           : unordered_set(__first, __last, __n, hasher(), key_equal(), __a)
142         { }
144       template<typename _InputIterator>
145         unordered_set(_InputIterator __first, _InputIterator __last,
146                       size_type __n, const hasher& __hf,
147                       const allocator_type& __a)
148           : unordered_set(__first, __last, __n, __hf, key_equal(), __a)
149         { }
151       unordered_set(initializer_list<value_type> __l,
152                     size_type __n,
153                     const allocator_type& __a)
154         : unordered_set(__l, __n, hasher(), key_equal(), __a)
155       { }
157       unordered_set(initializer_list<value_type> __l,
158                     size_type __n, const hasher& __hf,
159                     const allocator_type& __a)
160         : unordered_set(__l, __n, __hf, key_equal(), __a)
161       { }
163       unordered_set&
164       operator=(const unordered_set&) = default;
166       unordered_set&
167       operator=(unordered_set&&) = default;
169       unordered_set&
170       operator=(initializer_list<value_type> __l)
171       {
172         this->_M_profile_destruct();
173         _M_base() = __l;
174         this->_M_profile_construct();
175         return *this;
176       }
178       void
179       swap(unordered_set& __x)
180       noexcept( noexcept(__x._M_base().swap(__x)) )
181       {
182         _Base::swap(__x);
183         this->_M_swap(__x);
184       }
186       void
187       clear() noexcept
188       {
189         this->_M_profile_destruct();
190         _Base::clear();
191         this->_M_profile_construct();
192       }
194       template<typename... _Args>
195         std::pair<iterator, bool>
196         emplace(_Args&&... __args)
197         {
198           size_type __old_size = _Base::bucket_count();
199           std::pair<iterator, bool> __res
200             = _Base::emplace(std::forward<_Args>(__args)...);
201           this->_M_profile_resize(__old_size);
202           return __res;
203         }
205       template<typename... _Args>
206         iterator
207         emplace_hint(const_iterator __it, _Args&&... __args)
208         {
209           size_type __old_size = _Base::bucket_count();
210           iterator __res
211             = _Base::emplace_hint(__it, std::forward<_Args>(__args)...);
212           this->_M_profile_resize(__old_size);
213           return __res;
214         }
216       void
217       insert(std::initializer_list<value_type> __l)
218       {
219         size_type __old_size = _Base::bucket_count();
220         _Base::insert(__l);
221         this->_M_profile_resize(__old_size);
222       }
224       std::pair<iterator, bool>
225       insert(const value_type& __obj)
226       {
227         size_type __old_size = _Base::bucket_count();
228         std::pair<iterator, bool> __res = _Base::insert(__obj);
229         this->_M_profile_resize(__old_size);
230         return __res;
231       }
233       iterator
234       insert(const_iterator __iter, const value_type& __v)
235       {
236         size_type __old_size = _Base::bucket_count();
237         iterator __res = _Base::insert(__iter, __v);
238         this->_M_profile_resize(__old_size);
239         return __res;
240       }
242       std::pair<iterator, bool>
243       insert(value_type&& __obj)
244       {
245         size_type __old_size = _Base::bucket_count();
246         std::pair<iterator, bool> __res = _Base::insert(std::move(__obj));
247         this->_M_profile_resize(__old_size);
248         return __res;
249       }
251       iterator
252       insert(const_iterator __iter, value_type&& __v)
253       {
254         size_type __old_size = _Base::bucket_count();
255         iterator __res = _Base::insert(__iter, std::move(__v));
256         this->_M_profile_resize(__old_size);
257         return __res;
258       }
260       template<typename _InputIter>
261         void
262         insert(_InputIter __first, _InputIter __last)
263         {
264           size_type __old_size = _Base::bucket_count();
265           _Base::insert(__first, __last);
266           this->_M_profile_resize(__old_size);
267         }
269       void
270       rehash(size_type __n)
271       {
272         size_type __old_size = _Base::bucket_count();
273         _Base::rehash(__n);
274         this->_M_profile_resize(__old_size);
275       }
276   };
278   template<typename _Key, typename _Hash, typename _Pred, typename _Alloc>
279     inline void
280     swap(unordered_set<_Key, _Hash, _Pred, _Alloc>& __x,
281          unordered_set<_Key, _Hash, _Pred, _Alloc>& __y)
282     noexcept(noexcept(__x.swap(__y)))
283     { __x.swap(__y); }
285   template<typename _Key, typename _Hash, typename _Pred, typename _Alloc>
286     inline bool
287     operator==(const unordered_set<_Key, _Hash, _Pred, _Alloc>& __x,
288                const unordered_set<_Key, _Hash, _Pred, _Alloc>& __y)
289     { return static_cast<const _GLIBCXX_STD_BASE&>(__x) == __y; }
291   template<typename _Key, typename _Hash, typename _Pred, typename _Alloc>
292     inline bool
293     operator!=(const unordered_set<_Key, _Hash, _Pred, _Alloc>& __x,
294                const unordered_set<_Key, _Hash, _Pred, _Alloc>& __y)
295     { return !(__x == __y); }
297 #undef _GLIBCXX_BASE
298 #undef _GLIBCXX_STD_BASE
299 #define _GLIBCXX_STD_BASE _GLIBCXX_STD_C::_GLIBCXX_BASE
300 #define _GLIBCXX_BASE unordered_multiset<_Value, _Hash, _Pred, _Alloc>
302   /** @brief Unordered_multiset wrapper with performance instrumentation.  */
303   template<typename _Value,
304            typename _Hash = std::hash<_Value>,
305            typename _Pred = std::equal_to<_Value>,
306            typename _Alloc =  std::allocator<_Value> >
307     class unordered_multiset
308     : public _GLIBCXX_STD_BASE,
309       public _Unordered_profile<unordered_multiset<_Value,
310                                                    _Hash, _Pred, _Alloc>,
311                                 false>
312     {
313       typedef _GLIBCXX_STD_BASE _Base;
315       _Base&
316       _M_base() noexcept       { return *this; }
318       const _Base&
319       _M_base() const noexcept { return *this; }
321     public:
322       typedef typename _Base::size_type       size_type;
323       typedef typename _Base::hasher      hasher;
324       typedef typename _Base::key_equal       key_equal;
325       typedef typename _Base::allocator_type  allocator_type;
326       typedef typename _Base::key_type  key_type;
327       typedef typename _Base::value_type      value_type;
328       typedef typename _Base::difference_type difference_type;
329       typedef typename _Base::reference       reference;
330       typedef typename _Base::const_reference const_reference;
332       typedef typename _Base::iterator iterator;
333       typedef typename _Base::const_iterator const_iterator;
335       unordered_multiset() = default;
337       explicit
338       unordered_multiset(size_type __n,
339                          const hasher& __hf = hasher(),
340                          const key_equal& __eql = key_equal(),
341                          const allocator_type& __a = allocator_type())
342         : _Base(__n, __hf, __eql, __a)
343       { }
345       template<typename _InputIterator>
346         unordered_multiset(_InputIterator __f, _InputIterator __l,
347                            size_type __n = 0,
348                            const hasher& __hf = hasher(),
349                            const key_equal& __eql = key_equal(),
350                            const allocator_type& __a = allocator_type())
351           : _Base(__f, __l, __n, __hf, __eql, __a)
352       { }
354       unordered_multiset(const unordered_multiset&) = default;
356       unordered_multiset(const _Base& __x)
357         : _Base(__x)
358       { }
360       unordered_multiset(unordered_multiset&&) = default;
362       explicit
363       unordered_multiset(const allocator_type& __a)
364         : _Base(__a)
365       { }
367       unordered_multiset(const unordered_multiset& __umset,
368                          const allocator_type& __a)
369         : _Base(__umset._M_base(), __a)
370       { }
372       unordered_multiset(unordered_multiset&& __umset,
373                          const allocator_type& __a)
374         : _Base(std::move(__umset._M_base()), __a)
375       { }
377       unordered_multiset(initializer_list<value_type> __l,
378                          size_type __n = 0,
379                          const hasher& __hf = hasher(),
380                          const key_equal& __eql = key_equal(),
381                          const allocator_type& __a = allocator_type())
382         : _Base(__l, __n, __hf, __eql, __a)
383       { }
385       unordered_multiset(size_type __n, const allocator_type& __a)
386         : unordered_multiset(__n, hasher(), key_equal(), __a)
387       { }
389       unordered_multiset(size_type __n, const hasher& __hf,
390                          const allocator_type& __a)
391         : unordered_multiset(__n, __hf, key_equal(), __a)
392       { }
394       template<typename _InputIterator>
395         unordered_multiset(_InputIterator __first, _InputIterator __last,
396                            size_type __n,
397                            const allocator_type& __a)
398           : unordered_multiset(__first, __last, __n, hasher(), key_equal(), __a)
399         { }
401       template<typename _InputIterator>
402         unordered_multiset(_InputIterator __first, _InputIterator __last,
403                            size_type __n, const hasher& __hf,
404                            const allocator_type& __a)
405           : unordered_multiset(__first, __last, __n, __hf, key_equal(), __a)
406         { }
408       unordered_multiset(initializer_list<value_type> __l,
409                          size_type __n,
410                          const allocator_type& __a)
411         : unordered_multiset(__l, __n, hasher(), key_equal(), __a)
412       { }
414       unordered_multiset(initializer_list<value_type> __l,
415                          size_type __n, const hasher& __hf,
416                          const allocator_type& __a)
417         : unordered_multiset(__l, __n, __hf, key_equal(), __a)
418       { }
420       unordered_multiset&
421       operator=(const unordered_multiset&) = default;
423       unordered_multiset&
424       operator=(unordered_multiset&&) = default;
426       unordered_multiset&
427       operator=(initializer_list<value_type> __l)
428       {
429         this->_M_profile_destruct();
430         _M_base() = __l;
431         this->_M_profile_construct();
432         return *this;
433       }
435       void
436       swap(unordered_multiset& __x)
437       noexcept( noexcept(__x._M_base().swap(__x)) )
438       {
439         _Base::swap(__x);
440         this->_M_swap(__x);
441       }
443       void
444       clear() noexcept
445       {
446         this->_M_profile_destruct();
447         _Base::clear();
448         this->_M_profile_construct();
449       }
451       template<typename... _Args>
452         iterator
453         emplace(_Args&&... __args)
454         {
455           size_type __old_size = _Base::bucket_count();
456           iterator __res = _Base::emplace(std::forward<_Args>(__args)...);
457           this->_M_profile_resize(__old_size);
458           return __res;
459         }
461       template<typename... _Args>
462         iterator
463         emplace_hint(const_iterator __it, _Args&&... __args)
464         {
465           size_type __old_size = _Base::bucket_count();
466           iterator __res
467             = _Base::emplace_hint(__it, std::forward<_Args>(__args)...);
468           this->_M_profile_resize(__old_size);
469           return __res;
470         }
472       void
473       insert(std::initializer_list<value_type> __l)
474       {
475         size_type __old_size = _Base::bucket_count();
476         _Base::insert(__l);
477         this->_M_profile_resize(__old_size);
478       }
480       iterator
481       insert(const value_type& __obj)
482       {
483         size_type __old_size = _Base::bucket_count();
484         iterator __res = _Base::insert(__obj);
485         this->_M_profile_resize(__old_size);
486         return __res;
487       }
489       iterator
490       insert(const_iterator __iter, const value_type& __v)
491       {
492         size_type __old_size = _Base::bucket_count();
493         iterator __res = _Base::insert(__iter, __v);
494         this->_M_profile_resize(__old_size);
495         return __res;
496       }
498       iterator
499       insert(value_type&& __obj)
500       {
501         size_type __old_size = _Base::bucket_count();
502         iterator __res = _Base::insert(std::move(__obj));
503         this->_M_profile_resize(__old_size);
504         return __res;
505       }
507       iterator
508       insert(const_iterator __iter, value_type&& __v)
509       {
510         size_type __old_size = _Base::bucket_count();
511         iterator __res = _Base::insert(__iter, std::move(__v));
512         this->_M_profile_resize(__old_size);
513         return __res;
514       }
516       template<typename _InputIter>
517         void
518         insert(_InputIter __first, _InputIter __last)
519         {
520           size_type __old_size = _Base::bucket_count();
521           _Base::insert(__first, __last);
522           this->_M_profile_resize(__old_size);
523         }
525       void
526       rehash(size_type __n)
527       {
528         size_type __old_size = _Base::bucket_count();
529         _Base::rehash(__n);
530         this->_M_profile_resize(__old_size);
531       }
532    };
534   template<typename _Value, typename _Hash, typename _Pred, typename _Alloc>
535     inline void
536     swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
537          unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
538     noexcept(noexcept(__x.swap(__y)))
539     { __x.swap(__y); }
541   template<typename _Value, typename _Hash, typename _Pred, typename _Alloc>
542     inline bool
543     operator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
544                const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
545     { return static_cast<const _GLIBCXX_STD_BASE&>(__x) == __y; }
547   template<typename _Value, typename _Hash, typename _Pred, typename _Alloc>
548     inline bool
549     operator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
550                const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
551     { return !(__x == __y); }
553 } // namespace __profile
554 } // namespace std
556 #undef _GLIBCXX_BASE
557 #undef _GLIBCXX_STD_BASE
559 #endif // C++11
561 #endif