diff options
| author | fdumont <fdumont@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-05-07 20:26:15 +0000 |
|---|---|---|
| committer | fdumont <fdumont@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-05-07 20:26:15 +0000 |
| commit | c50ff294f77295d98662af55db383e38dfce5a55 (patch) | |
| tree | 92c9652b0d5109aa6374cb73a679a0241e262cd0 /libstdc++-v3/include/profile/unordered_map | |
| parent | 5c2d214df49bbdccbb8fc6dbf31593c7e3a385b7 (diff) | |
| download | ppe42-gcc-c50ff294f77295d98662af55db383e38dfce5a55.tar.gz ppe42-gcc-c50ff294f77295d98662af55db383e38dfce5a55.zip | |
2013-05-07 François Dumont <fdumont@gcc.gnu.org>
* include/profile/unordered_base.h: New.
* include/Makefile.am: Add new profile header.
* include/Makefile.in: Regenerate.
* include/profile/impl/profiler.h
(__profcxx_inefficient_hash_is_on): New macro.
* include/profile/unordered_map (std::profile::unordered_map<>):
Use new _Unordered_profile base class. Use default implementations
for special functions.
(std::profile::unordered_multimap<>): Likewise.
* include/profile/unordered_set (std::profile::unordered_set<>):
Likewise.
(std::profile::unordered_multiset<>): Likewise.
* testsuite/23_containers/unordered_multiset/55043.cc: Fix
MoveOnly equality operator signature.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@198698 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/profile/unordered_map')
| -rw-r--r-- | libstdc++-v3/include/profile/unordered_map | 261 |
1 files changed, 88 insertions, 173 deletions
diff --git a/libstdc++-v3/include/profile/unordered_map b/libstdc++-v3/include/profile/unordered_map index f594ab8752c..ac5fecc60fa 100644 --- a/libstdc++-v3/include/profile/unordered_map +++ b/libstdc++-v3/include/profile/unordered_map @@ -34,6 +34,7 @@ # include <unordered_map> #include <profile/base.h> +#include <profile/unordered_base.h> #define _GLIBCXX_BASE unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc> #define _GLIBCXX_STD_BASE _GLIBCXX_STD_C::_GLIBCXX_BASE @@ -48,10 +49,18 @@ namespace __profile typename _Pred = std::equal_to<_Key>, typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > > class unordered_map - : public _GLIBCXX_STD_BASE + : public _GLIBCXX_STD_BASE, + public _Unordered_profile<unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>, + true> { typedef typename _GLIBCXX_STD_BASE _Base; + _Base& + _M_base() noexcept { return *this; } + + const _Base& + _M_base() const noexcept { return *this; } + public: typedef typename _Base::size_type size_type; typedef typename _Base::hasher hasher; @@ -72,11 +81,8 @@ namespace __profile const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) - : _Base(__n, __hf, __eql, __a) - { - __profcxx_hashtable_construct(this, _Base::bucket_count()); - __profcxx_hashtable_construct2(this); - } + : _Base(__n, __hf, __eql, __a) + { } template<typename _InputIterator> unordered_map(_InputIterator __f, _InputIterator __l, @@ -84,85 +90,60 @@ namespace __profile const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) - : _Base(__f, __l, __n, __hf, __eql, __a) - { - __profcxx_hashtable_construct(this, _Base::bucket_count()); - __profcxx_hashtable_construct2(this); - } + : _Base(__f, __l, __n, __hf, __eql, __a) + { } - unordered_map(const unordered_map& __x) - : _Base(__x) - { - __profcxx_hashtable_construct(this, _Base::bucket_count()); - __profcxx_hashtable_construct2(this); - } + unordered_map(const unordered_map&) = default; unordered_map(const _Base& __x) - : _Base(__x) - { - __profcxx_hashtable_construct(this, _Base::bucket_count()); - __profcxx_hashtable_construct2(this); - } + : _Base(__x) + { } - unordered_map(unordered_map&& __x) - : _Base(std::move(__x)) - { - __profcxx_hashtable_construct(this, _Base::bucket_count()); - __profcxx_hashtable_construct2(this); - } + unordered_map(unordered_map&&) = default; + + explicit + unordered_map(const allocator_type& __a) + : _Base(__a) + { } + + unordered_map(const unordered_map& __umap, + const allocator_type& __a) + : _Base(__umap, __a) + { } + + unordered_map(unordered_map&& __umap, + const allocator_type& __a) + : _Base(std::move(__umap._M_base()), __a) + { } unordered_map(initializer_list<value_type> __l, size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) - : _Base(__l, __n, __hf, __eql, __a) { } + : _Base(__l, __n, __hf, __eql, __a) + { } unordered_map& - operator=(const unordered_map& __x) - { - *static_cast<_Base*>(this) = __x; - return *this; - } + operator=(const unordered_map&) = default; unordered_map& - operator=(unordered_map&& __x) - { - // NB: DR 1204. - // NB: DR 675. - this->clear(); - this->swap(__x); - return *this; - } + operator=(unordered_map&&) = default; unordered_map& operator=(initializer_list<value_type> __l) { - this->clear(); - this->insert(__l); + _M_base() = __l; return *this; } - ~unordered_map() noexcept - { - __profcxx_hashtable_destruct(this, _Base::bucket_count(), - _Base::size()); - _M_profile_destruct(); - } - - _Base& - _M_base() noexcept { return *this; } - - const _Base& - _M_base() const noexcept { return *this; } - void clear() noexcept { __profcxx_hashtable_destruct(this, _Base::bucket_count(), _Base::size()); - _M_profile_destruct(); - _Base::clear(); + this->_M_profile_destruct(); + _Base::clear(); } template<typename... _Args> @@ -247,14 +228,6 @@ namespace __profile _M_profile_resize(__old_size); } - void - insert(const value_type* __first, const value_type* __last) - { - size_type __old_size = _Base::bucket_count(); - _Base::insert(__first, __last); - _M_profile_resize(__old_size); - } - // operator[] mapped_type& operator[](const _Key& __k) @@ -276,7 +249,8 @@ namespace __profile void swap(unordered_map& __x) - { _Base::swap(__x); } + noexcept( noexcept(__x._M_base().swap(__x)) ) + { _Base::swap(__x._M_base()); } void rehash(size_type __n) { @@ -293,29 +267,6 @@ namespace __profile if (__old_size != __new_size) __profcxx_hashtable_resize(this, __old_size, __new_size); } - - void - _M_profile_destruct() - { - size_type __hops = 0, __lc = 0, __chain = 0; - iterator __it = this->begin(); - while (__it != this->end()) - { - size_type __bkt = this->bucket(__it->first); - auto __lit = this->begin(__bkt); - auto __lend = this->end(__bkt); - for (++__it, ++__lit; __lit != __lend; ++__it, ++__lit) - ++__chain; - if (__chain) - { - ++__chain; - __lc = __lc > __chain ? __lc : __chain; - __hops += __chain * (__chain - 1) / 2; - __chain = 0; - } - } - __profcxx_hashtable_destruct2(this, __lc, _Base::size(), __hops); - } }; template<typename _Key, typename _Tp, typename _Hash, @@ -350,10 +301,19 @@ namespace __profile typename _Pred = std::equal_to<_Key>, typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > > class unordered_multimap - : public _GLIBCXX_STD_BASE + : public _GLIBCXX_STD_BASE, + public _Unordered_profile<unordered_multimap<_Key, _Tp, + _Hash, _Pred, _Alloc>, + false> { typedef typename _GLIBCXX_STD_BASE _Base; + _Base& + _M_base() noexcept { return *this; } + + const _Base& + _M_base() const noexcept { return *this; } + public: typedef typename _Base::size_type size_type; typedef typename _Base::hasher hasher; @@ -373,85 +333,69 @@ namespace __profile const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) - : _Base(__n, __hf, __eql, __a) - { - __profcxx_hashtable_construct(this, _Base::bucket_count()); - } + : _Base(__n, __hf, __eql, __a) + { } + template<typename _InputIterator> unordered_multimap(_InputIterator __f, _InputIterator __l, size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) - : _Base(__f, __l, __n, __hf, __eql, __a) - { - __profcxx_hashtable_construct(this, _Base::bucket_count()); - } + : _Base(__f, __l, __n, __hf, __eql, __a) + { } - unordered_multimap(const unordered_multimap& __x) - : _Base(__x) - { - __profcxx_hashtable_construct(this, _Base::bucket_count()); - } + unordered_multimap(const unordered_multimap&) = default; unordered_multimap(const _Base& __x) - : _Base(__x) - { - __profcxx_hashtable_construct(this, _Base::bucket_count()); - } + : _Base(__x) + { } - unordered_multimap(unordered_multimap&& __x) - : _Base(std::move(__x)) - { - __profcxx_hashtable_construct(this, _Base::bucket_count()); - } + unordered_multimap(unordered_multimap&&) = default; + + explicit + unordered_multimap(const allocator_type& __a) + : _Base(__a) + { } + + unordered_multimap(const unordered_multimap& __ummap, + const allocator_type& __a) + : _Base(__ummap._M_base(), __a) + { } + + unordered_multimap(unordered_multimap&& __ummap, + const allocator_type& __a) + : _Base(std::move(__ummap._M_base()), __a) + { } unordered_multimap(initializer_list<value_type> __l, size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) - : _Base(__l, __n, __hf, __eql, __a) { } + : _Base(__l, __n, __hf, __eql, __a) + { } unordered_multimap& - operator=(const unordered_multimap& __x) - { - *static_cast<_Base*>(this) = __x; - return *this; - } + operator=(const unordered_multimap&) = default; unordered_multimap& - operator=(unordered_multimap&& __x) - { - // NB: DR 1204. - // NB: DR 675. - this->clear(); - this->swap(__x); - return *this; - } + operator=(unordered_multimap&&) = default; unordered_multimap& operator=(initializer_list<value_type> __l) { - this->clear(); - this->insert(__l); + _M_base() = __l; return *this; } - ~unordered_multimap() noexcept - { - __profcxx_hashtable_destruct(this, _Base::bucket_count(), - _Base::size()); - _M_profile_destruct(); - } - void clear() noexcept { - __profcxx_hashtable_destruct(this, _Base::bucket_count(), + __profcxx_hashtable_destruct(this, _Base::bucket_count(), _Base::size()); - _M_profile_destruct(); - _Base::clear(); + this->_M_profile_destruct(); + _Base::clear(); } template<typename... _Args> @@ -536,18 +480,12 @@ namespace __profile } void - insert(const value_type* __first, const value_type* __last) - { - size_type __old_size = _Base::bucket_count(); - _Base::insert(__first, __last); - _M_profile_resize(__old_size); - } - - void swap(unordered_multimap& __x) - { _Base::swap(__x); } + noexcept( noexcept(__x._M_base().swap(__x)) ) + { _Base::swap(__x._M_base()); } - void rehash(size_type __n) + void + rehash(size_type __n) { size_type __old_size = _Base::bucket_count(); _Base::rehash(__n); @@ -562,29 +500,6 @@ namespace __profile if (__old_size != __new_size) __profcxx_hashtable_resize(this, __old_size, __new_size); } - - void - _M_profile_destruct() - { - size_type __hops = 0, __lc = 0, __chain = 0; - iterator __it = this->begin(); - while (__it != this->end()) - { - size_type __bkt = this->bucket(__it->first); - auto __lit = this->begin(__bkt); - auto __lend = this->end(__bkt); - for (++__it, ++__lit; __lit != __lend; ++__it, ++__lit) - ++__chain; - if (__chain) - { - ++__chain; - __lc = __lc > __chain ? __lc : __chain; - __hops += __chain * (__chain - 1) / 2; - __chain = 0; - } - } - __profcxx_hashtable_destruct2(this, __lc, _Base::size(), __hops); - } }; template<typename _Key, typename _Tp, typename _Hash, |

