diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index f5c99a7f4bf..115679e5e4d 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,62 @@ +2010-08-13 Paolo Carlini + + * include/bits/hashtable.h (_Hashtable<>::operator=(const + _Hashtable&)): Move inline. + (operator=(_Hashtable&&)): Define. + * include/bits/unordered_map.h (unordered_map(unordered_map&&), + unordered_map(const unordered_map&), unordered_multimap + (unordered_multimap&&), unordered_multimap(const unordered_multimap&), + __unordered_map(__unordered_map&&), __unordered_map(const + __unordered_map&), __unordered_multimap(__unordered_multimap&&), + __unordered_multimap(const __unordered_multimap&)): Do not define, + leave implicit. + * include/bits/unordered_set.h (unordered_set(unordered_set&&), + unordered_set(const unordered_set&), unordered_multiset + (unordered_multiset&&), unordered_multiset(const unordered_multiset&), + __unordered_set(__unordered_set&&), __unordered_set(const + __unordered_set&), __unordered_multiset(__unordered_multiset&&), + __unordered_multiset(const __unordered_multiset&)): Likewise. + + * include/bits/unordered_map.h (__unordered_map(initializer_list<>), + __unordered_map<>::operator=(initializer_list<>), + __unordered_multimap(initializer_list<>), __unordered_multimap<>:: + operator=(initializer_list<>)): Add. + * include/bits/unordered_set.h (__unordered_set(initializer_list<>), + __unordered_set<>::operator=(initializer_list<>), + __unordered_multiset(initializer_list<>), __unordered_multiset<>:: + operator=(initializer_list<>)): Likewise. + + * include/bits/unordered_map.h (__unordered_map(_InputIterator, + _InputIterator, size_type __n), unordered_map(_InputIterator, + _InputIterator, size_type __n), unordered_map(initializer_list<>, + size_type __n), unordered_multimap(initializer_list<>, size_type __n)): + Fix __n default to 0. + * include/bits/unordered_set.h (__unordered_set(_InputIterator, + _InputIterator, size_type __n), unordered_set(_InputIterator, + _InputIterator, size_type __n), unordered_set(initializer_list<>, + size_type __n), unordered_multiset(initializer_list<>, size_type __n)): + Likewise. + * include/debug/unordered_map (unordered_map(_InputIterator, + _InputIterator, size_type __n), unordered_map(initializer_list<>, + size_type __n), unordered_map(_InputIterator, _InputIterator, + size_type __n), unordered_multimap(initializer_list<>, size_type __n)): + Likewise. + * include/debug/unordered_set (unordered_set(_InputIterator, + _InputIterator, size_type __n), unordered_set(initializer_list<>, + size_type __n), unordered_set(_InputIterator, _InputIterator, + size_type __n), unordered_multiset(initializer_list<>, size_type __n)): + Likewise. + * include/profile/unordered_map (unordered_map(_InputIterator, + _InputIterator, size_type __n), unordered_map(initializer_list<>, + size_type __n), unordered_map(_InputIterator, _InputIterator, + size_type __n), unordered_multimap(initializer_list<>, size_type __n)): + Likewise. + * include/profile/unordered_set (unordered_set(_InputIterator, + _InputIterator, size_type __n), unordered_set(initializer_list<>, + size_type __n), unordered_set(_InputIterator, _InputIterator, + size_type __n), unordered_multiset(initializer_list<>, size_type __n)): + Likewise. + 2010-08-13 Paolo Carlini PR libstdc++/45281 diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h index a9876e169af..e62e156e523 100644 --- a/libstdc++-v3/include/bits/hashtable.h +++ b/libstdc++-v3/include/bits/hashtable.h @@ -212,7 +212,22 @@ namespace std _Hashtable(_Hashtable&&); _Hashtable& - operator=(const _Hashtable&); + operator=(const _Hashtable& __ht) + { + _Hashtable __tmp(__ht); + this->swap(__tmp); + return *this; + } + + _Hashtable& + operator=(_Hashtable&& __ht) + { + // NB: DR 1204. + // NB: DR 675. + this->clear(); + this->swap(__ht); + return *this; + } ~_Hashtable(); @@ -663,21 +678,6 @@ namespace std __ht._M_rehash_policy = _RehashPolicy(); } - template - _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, - _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>& - _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, - _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>:: - operator=(const _Hashtable& __ht) - { - _Hashtable __tmp(__ht); - this->swap(__tmp); - return *this; - } - template __unordered_map(_InputIterator __f, _InputIterator __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) @@ -82,10 +83,24 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) __eql, std::_Select1st >(), __a) { } - __unordered_map(const __unordered_map& __x) = default; + __unordered_map(initializer_list __l, + size_type __n = 0, + const hasher& __hf = hasher(), + const key_equal& __eql = key_equal(), + const allocator_type& __a = allocator_type()) + : _Base(__l.begin(), __l.end(), __n, __hf, + __detail::_Mod_range_hashing(), + __detail::_Default_ranged_hash(), + __eql, std::_Select1st >(), __a) + { } - __unordered_map(__unordered_map&& __x) - : _Base(std::move(__x)) { } + __unordered_map& + operator=(initializer_list __l) + { + this->clear(); + this->insert(__l.begin(), __l.end()); + return *this; + } }; template __unordered_multimap(_InputIterator __f, _InputIterator __l, - typename _Base::size_type __n = 0, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) @@ -139,10 +155,24 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) __eql, std::_Select1st >(), __a) { } - __unordered_multimap(const __unordered_multimap& __x) = default; + __unordered_multimap(initializer_list __l, + size_type __n = 0, + const hasher& __hf = hasher(), + const key_equal& __eql = key_equal(), + const allocator_type& __a = allocator_type()) + : _Base(__l.begin(), __l.end(), __n, __hf, + __detail::_Mod_range_hashing(), + __detail::_Default_ranged_hash(), + __eql, std::_Select1st >(), __a) + { } - __unordered_multimap(__unordered_multimap&& __x) - : _Base(std::move(__x)) { } + __unordered_multimap& + operator=(initializer_list __l) + { + this->clear(); + this->insert(__l.begin(), __l.end()); + return *this; + } }; template unordered_map(_InputIterator __f, _InputIterator __l, - size_type __n = 10, + 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) { } - unordered_map(const unordered_map& __x) = default; - - unordered_map(unordered_map&& __x) - : _Base(std::move(__x)) { } - unordered_map(initializer_list __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) - : _Base(__l.begin(), __l.end(), __n, __hf, __eql, __a) + : _Base(__l.begin(), __l.end(), __n, __hf, __eql, __a) { } - unordered_map& - operator=(const unordered_map& __x) = default; - - unordered_map& - operator=(unordered_map&& __x) - { - // NB: DR 1204. - // NB: DR 675. - this->clear(); - this->swap(__x); - return *this; - } - unordered_map& operator=(initializer_list __l) { @@ -327,42 +339,23 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) : _Base(__n, __hf, __eql, __a) { } - template unordered_multimap(_InputIterator __f, _InputIterator __l, - typename _Base::size_type __n = 0, + 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) { } - unordered_multimap(const unordered_multimap& __x) = default; - - unordered_multimap(unordered_multimap&& __x) - : _Base(std::move(__x)) { } - unordered_multimap(initializer_list __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) - : _Base(__l.begin(), __l.end(), __n, __hf, __eql, __a) + : _Base(__l.begin(), __l.end(), __n, __hf, __eql, __a) { } - unordered_multimap& - operator=(const unordered_multimap& __x) = default; - - unordered_multimap& - operator=(unordered_multimap&& __x) - { - // NB: DR 1204. - // NB: DR 675. - this->clear(); - this->swap(__x); - return *this; - } - unordered_multimap& operator=(initializer_list __l) { diff --git a/libstdc++-v3/include/bits/unordered_set.h b/libstdc++-v3/include/bits/unordered_set.h index f056be57ec0..260ad796c1a 100644 --- a/libstdc++-v3/include/bits/unordered_set.h +++ b/libstdc++-v3/include/bits/unordered_set.h @@ -56,6 +56,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) _Base; public: + typedef typename _Base::value_type value_type; typedef typename _Base::size_type size_type; typedef typename _Base::hasher hasher; typedef typename _Base::key_equal key_equal; @@ -68,24 +69,38 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) const allocator_type& __a = allocator_type()) : _Base(__n, __hf, __detail::_Mod_range_hashing(), __detail::_Default_ranged_hash(), __eql, - std::_Identity<_Value>(), __a) + std::_Identity(), __a) { } template __unordered_set(_InputIterator __f, _InputIterator __l, - size_type __n = 10, + 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, __detail::_Mod_range_hashing(), __detail::_Default_ranged_hash(), __eql, - std::_Identity<_Value>(), __a) + std::_Identity(), __a) { } - __unordered_set(const __unordered_set& __x) = default; + __unordered_set(initializer_list __l, + size_type __n = 0, + const hasher& __hf = hasher(), + const key_equal& __eql = key_equal(), + const allocator_type& __a = allocator_type()) + : _Base(__l.begin(), __l.end(), __n, __hf, + __detail::_Mod_range_hashing(), + __detail::_Default_ranged_hash(), __eql, + std::_Identity(), __a) + { } - __unordered_set(__unordered_set&& __x) - : _Base(std::move(__x)) { } + __unordered_set& + operator=(initializer_list __l) + { + this->clear(); + this->insert(__l.begin(), __l.end()); + return *this; + } }; template(), __a) + std::_Identity(), __a) { } template __unordered_multiset(_InputIterator __f, _InputIterator __l, - typename _Base::size_type __n = 0, + 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, __detail::_Mod_range_hashing(), __detail::_Default_ranged_hash(), __eql, - std::_Identity<_Value>(), __a) + std::_Identity(), __a) { } - __unordered_multiset(const __unordered_multiset& __x) = default; + __unordered_multiset(initializer_list __l, + size_type __n = 0, + const hasher& __hf = hasher(), + const key_equal& __eql = key_equal(), + const allocator_type& __a = allocator_type()) + : _Base(__l.begin(), __l.end(), __n, __hf, + __detail::_Mod_range_hashing(), + __detail::_Default_ranged_hash(), __eql, + std::_Identity(), __a) + { } - __unordered_multiset(__unordered_multiset&& __x) - : _Base(std::move(__x)) { } + __unordered_multiset& + operator=(initializer_list __l) + { + this->clear(); + this->insert(__l.begin(), __l.end()); + return *this; + } }; template unordered_set(_InputIterator __f, _InputIterator __l, - size_type __n = 10, + 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) { } - unordered_set(const unordered_set& __x) = default; - - unordered_set(unordered_set&& __x) - : _Base(std::move(__x)) { } - unordered_set(initializer_list __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) - : _Base(__l.begin(), __l.end(), __n, __hf, __eql, __a) + : _Base(__l.begin(), __l.end(), __n, __hf, __eql, __a) { } - unordered_set& - operator=(const unordered_set& __x) = default; - - unordered_set& - operator=(unordered_set&& __x) - { - // NB: DR 1204. - // NB: DR 675. - this->clear(); - this->swap(__x); - return *this; - } - unordered_set& operator=(initializer_list __l) { @@ -320,39 +332,21 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) template unordered_multiset(_InputIterator __f, _InputIterator __l, - typename _Base::size_type __n = 0, + 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) { } - unordered_multiset(const unordered_multiset& __x) = default; - - unordered_multiset(unordered_multiset&& __x) - : _Base(std::move(__x)) { } - unordered_multiset(initializer_list __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) - : _Base(__l.begin(), __l.end(), __n, __hf, __eql, __a) + : _Base(__l.begin(), __l.end(), __n, __hf, __eql, __a) { } - unordered_multiset& - operator=(const unordered_multiset& __x) = default; - - unordered_multiset& - operator=(unordered_multiset&& __x) - { - // NB: DR 1204. - // NB: DR 675. - this->clear(); - this->swap(__x); - return *this; - } - unordered_multiset& operator=(initializer_list __l) { diff --git a/libstdc++-v3/include/debug/unordered_map b/libstdc++-v3/include/debug/unordered_map index 805e42ee75e..04d311dc408 100644 --- a/libstdc++-v3/include/debug/unordered_map +++ b/libstdc++-v3/include/debug/unordered_map @@ -79,7 +79,7 @@ namespace __debug template unordered_map(_InputIterator __f, _InputIterator __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) @@ -96,7 +96,7 @@ namespace __debug : _Base(std::move(__x)), _Safe_base() { } unordered_map(initializer_list __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) @@ -338,7 +338,7 @@ namespace __debug template unordered_multimap(_InputIterator __f, _InputIterator __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) @@ -355,7 +355,7 @@ namespace __debug : _Base(std::move(__x)), _Safe_base() { } unordered_multimap(initializer_list __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) diff --git a/libstdc++-v3/include/debug/unordered_set b/libstdc++-v3/include/debug/unordered_set index 80ca806f5aa..13f869813e5 100644 --- a/libstdc++-v3/include/debug/unordered_set +++ b/libstdc++-v3/include/debug/unordered_set @@ -79,7 +79,7 @@ namespace __debug template unordered_set(_InputIterator __f, _InputIterator __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) @@ -96,7 +96,7 @@ namespace __debug : _Base(std::move(__x)), _Safe_base() { } unordered_set(initializer_list __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) @@ -334,7 +334,7 @@ namespace __debug template unordered_multiset(_InputIterator __f, _InputIterator __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) @@ -351,7 +351,7 @@ namespace __debug : _Base(std::move(__x)), _Safe_base() { } unordered_multiset(initializer_list __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) diff --git a/libstdc++-v3/include/profile/unordered_map b/libstdc++-v3/include/profile/unordered_map index 203ae97ef8d..2dec1f2a268 100644 --- a/libstdc++-v3/include/profile/unordered_map +++ b/libstdc++-v3/include/profile/unordered_map @@ -86,10 +86,10 @@ namespace __profile template unordered_map(_InputIterator __f, _InputIterator __l, - size_type __n = 10, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) + 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()); @@ -111,7 +111,7 @@ namespace __profile } unordered_map(initializer_list __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) @@ -314,19 +314,19 @@ namespace __profile explicit unordered_multimap(size_type __n = 10, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) + 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()); } template unordered_multimap(_InputIterator __f, _InputIterator __l, - size_type __n = 10, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) + 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()); @@ -345,7 +345,7 @@ namespace __profile } unordered_multimap(initializer_list __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) diff --git a/libstdc++-v3/include/profile/unordered_set b/libstdc++-v3/include/profile/unordered_set index 1a8836a7772..2dade092024 100644 --- a/libstdc++-v3/include/profile/unordered_set +++ b/libstdc++-v3/include/profile/unordered_set @@ -85,10 +85,10 @@ namespace __profile template unordered_set(_InputIterator __f, _InputIterator __l, - size_type __n = 10, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) + 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()); @@ -110,7 +110,7 @@ namespace __profile } unordered_set(initializer_list __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type()) @@ -302,9 +302,9 @@ namespace __profile explicit unordered_multiset(size_type __n = 10, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) + 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()); @@ -312,10 +312,10 @@ namespace __profile template unordered_multiset(_InputIterator __f, _InputIterator __l, - size_type __n = 10, - const hasher& __hf = hasher(), - const key_equal& __eql = key_equal(), - const allocator_type& __a = allocator_type()) + 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()); @@ -334,7 +334,7 @@ namespace __profile } unordered_multiset(initializer_list __l, - size_type __n = 10, + size_type __n = 0, const hasher& __hf = hasher(), const key_equal& __eql = key_equal(), const allocator_type& __a = allocator_type())