From 85676e5081d8a35d3fde5c4abbf16be5040964d0 Mon Sep 17 00:00:00 2001 From: fdumont Date: Mon, 13 Jan 2014 20:07:22 +0000 Subject: [PATCH] =?utf8?q?2014-01-13=20=20Fran=C3=A7ois=20Dumont=20=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * include/debug/set.h (set): Implement C++11 allocator-aware container requirements. * include/debug/map.h (map): Likewise. * include/debug/multiset.h (multiset): Likewise. * include/debug/multimap.h (multimap): Likewise. * include/debug/set.h (set::operator=(set&&)): Add noexcept and fix implementation regarding management of safe iterators. * include/debug/map.h (map::operator=(map&&)): Likewise. * include/debug/multiset.h (multiset::operator=(multiset&&)): Likewise. * include/debug/multimap.h (multimap::operator=(multimap&&)): Likewise. * include/debug/set.h (set::operator=(std::initializer_list<>)): Rely on the same operator from normal mode. * include/debug/map.h (map::operator=(std::initializer_list<>)): Likewise. * include/debug/multiset.h (multiset::operator=(std::initializer_list<>)): Likewise. * include/debug/multimap.h (multimap::operator=(std::initializer_list<>)): Likewise. * include/debug/set.h (set::swap(set&)): Add noexcept specification, add allocator equality check. * include/debug/map.h (map::swap(map&)): Likewise. * include/debug/multiset.h (multiset::swap(multiset&)): Likewise. * include/debug/multimap.h (multimap::swap(multimap&)): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@206588 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 27 ++++++++++++++++++ libstdc++-v3/include/debug/map.h | 52 +++++++++++++++++++++++++++++----- libstdc++-v3/include/debug/multimap.h | 53 ++++++++++++++++++++++++++++++----- libstdc++-v3/include/debug/multiset.h | 53 ++++++++++++++++++++++++++++++----- libstdc++-v3/include/debug/set.h | 52 +++++++++++++++++++++++++++++----- 5 files changed, 209 insertions(+), 28 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 78d99829759..43c2900d0d7 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,30 @@ +2014-01-13 François Dumont + + * include/debug/set.h (set): Implement C++11 allocator-aware + container requirements. + * include/debug/map.h (map): Likewise. + * include/debug/multiset.h (multiset): Likewise. + * include/debug/multimap.h (multimap): Likewise. + * include/debug/set.h (set::operator=(set&&)): Add noexcept and + fix implementation regarding management of safe iterators. + * include/debug/map.h (map::operator=(map&&)): Likewise. + * include/debug/multiset.h (multiset::operator=(multiset&&)): Likewise. + * include/debug/multimap.h (multimap::operator=(multimap&&)): + Likewise. + * include/debug/set.h (set::operator=(std::initializer_list<>)): + Rely on the same operator from normal mode. + * include/debug/map.h (map::operator=(std::initializer_list<>)): + Likewise. + * include/debug/multiset.h + (multiset::operator=(std::initializer_list<>)): Likewise. + * include/debug/multimap.h + (multimap::operator=(std::initializer_list<>)): Likewise. + * include/debug/set.h (set::swap(set&)): Add noexcept + specification, add allocator equality check. + * include/debug/map.h (map::swap(map&)): Likewise. + * include/debug/multiset.h (multiset::swap(multiset&)): Likewise. + * include/debug/multimap.h (multimap::swap(multimap&)): Likewise. + 2014-01-10 Jonathan Wakely PR libstdc++/59698 diff --git a/libstdc++-v3/include/debug/map.h b/libstdc++-v3/include/debug/map.h index e9bf7c60dd5..2367d57452c 100644 --- a/libstdc++-v3/include/debug/map.h +++ b/libstdc++-v3/include/debug/map.h @@ -49,6 +49,11 @@ namespace __debug typedef typename _Base::const_iterator _Base_const_iterator; typedef typename _Base::iterator _Base_iterator; typedef __gnu_debug::_Equal_to<_Base_const_iterator> _Equal; + +#if __cplusplus >= 201103L + typedef __gnu_cxx::__alloc_traits _Alloc_traits; +#endif public: // types: typedef _Key key_type; @@ -101,6 +106,27 @@ namespace __debug const _Compare& __c = _Compare(), const allocator_type& __a = allocator_type()) : _Base(__l, __c, __a) { } + + explicit + map(const allocator_type& __a) + : _Base(__a) { } + + map(const map& __m, const allocator_type& __a) + : _Base(__m, __a) { } + + map(map&& __m, const allocator_type& __a) + : _Base(std::move(__m._M_base()), __a) { } + + map(initializer_list __l, const allocator_type& __a) + : _Base(__l, __a) { } + + template + map(_InputIterator __first, _InputIterator __last, + const allocator_type& __a) + : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first, + __last)), + __gnu_debug::__base(__last), __a) + { } #endif ~map() _GLIBCXX_NOEXCEPT { } @@ -108,7 +134,7 @@ namespace __debug map& operator=(const map& __x) { - *static_cast<_Base*>(this) = __x; + _M_base() = __x; this->_M_invalidate_all(); return *this; } @@ -116,20 +142,25 @@ namespace __debug #if __cplusplus >= 201103L map& operator=(map&& __x) + noexcept(_Alloc_traits::_S_nothrow_move()) { - // NB: DR 1204. - // NB: DR 675. __glibcxx_check_self_move_assign(__x); - clear(); - swap(__x); + bool xfer_memory = _Alloc_traits::_S_propagate_on_move_assign() + || __x.get_allocator() == this->get_allocator(); + _M_base() = std::move(__x._M_base()); + if (xfer_memory) + this->_M_swap(__x); + else + this->_M_invalidate_all(); + __x._M_invalidate_all(); return *this; } map& operator=(initializer_list __l) { - this->clear(); - this->insert(__l); + _M_base() = __l; + this->_M_invalidate_all(); return *this; } #endif @@ -360,7 +391,14 @@ namespace __debug void swap(map& __x) +#if __cplusplus >= 201103L + noexcept(_Alloc_traits::_S_nothrow_swap()) +#endif { +#if __cplusplus >= 201103L + if (!_Alloc_traits::_S_propagate_on_swap()) + __glibcxx_check_equal_allocs(__x); +#endif _Base::swap(__x); this->_M_swap(__x); } diff --git a/libstdc++-v3/include/debug/multimap.h b/libstdc++-v3/include/debug/multimap.h index 35c827bb949..0976573b7e1 100644 --- a/libstdc++-v3/include/debug/multimap.h +++ b/libstdc++-v3/include/debug/multimap.h @@ -50,6 +50,11 @@ namespace __debug typedef typename _Base::const_iterator _Base_const_iterator; typedef typename _Base::iterator _Base_iterator; typedef __gnu_debug::_Equal_to<_Base_const_iterator> _Equal; + +#if __cplusplus >= 201103L + typedef __gnu_cxx::__alloc_traits _Alloc_traits; +#endif public: // types: typedef _Key key_type; @@ -102,6 +107,28 @@ namespace __debug const _Compare& __c = _Compare(), const allocator_type& __a = allocator_type()) : _Base(__l, __c, __a) { } + + explicit + multimap(const allocator_type& __a) + : _Base(__a) { } + + multimap(const multimap& __m, const allocator_type& __a) + : _Base(__m, __a) { } + + multimap(multimap&& __m, const allocator_type& __a) + : _Base(std::move(__m._M_base()), __a) { } + + multimap(initializer_list __l, const allocator_type& __a) + : _Base(__l, __a) + { } + + template + multimap(_InputIterator __first, _InputIterator __last, + const allocator_type& __a) + : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first, + __last)), + __gnu_debug::__base(__last), __a) + { } #endif ~multimap() _GLIBCXX_NOEXCEPT { } @@ -109,7 +136,7 @@ namespace __debug multimap& operator=(const multimap& __x) { - *static_cast<_Base*>(this) = __x; + _M_base() = __x; this->_M_invalidate_all(); return *this; } @@ -117,20 +144,25 @@ namespace __debug #if __cplusplus >= 201103L multimap& operator=(multimap&& __x) + noexcept(_Alloc_traits::_S_nothrow_move()) { - // NB: DR 1204. - // NB: DR 675. __glibcxx_check_self_move_assign(__x); - clear(); - swap(__x); + bool xfer_memory = _Alloc_traits::_S_propagate_on_move_assign() + || __x.get_allocator() == this->get_allocator(); + _M_base() = std::move(__x._M_base()); + if (xfer_memory) + this->_M_swap(__x); + else + this->_M_invalidate_all(); + __x._M_invalidate_all(); return *this; } multimap& operator=(initializer_list __l) { - this->clear(); - this->insert(__l); + _M_base() = __l; + this->_M_invalidate_all(); return *this; } #endif @@ -343,7 +375,14 @@ namespace __debug void swap(multimap& __x) +#if __cplusplus >= 201103L + noexcept(_Alloc_traits::_S_nothrow_swap()) +#endif { +#if __cplusplus >= 201103L + if (!_Alloc_traits::_S_propagate_on_swap()) + __glibcxx_check_equal_allocs(__x); +#endif _Base::swap(__x); this->_M_swap(__x); } diff --git a/libstdc++-v3/include/debug/multiset.h b/libstdc++-v3/include/debug/multiset.h index 7aff7caad6f..5a39ef8887f 100644 --- a/libstdc++-v3/include/debug/multiset.h +++ b/libstdc++-v3/include/debug/multiset.h @@ -49,6 +49,11 @@ namespace __debug typedef typename _Base::const_iterator _Base_const_iterator; typedef typename _Base::iterator _Base_iterator; typedef __gnu_debug::_Equal_to<_Base_const_iterator> _Equal; + +#if __cplusplus >= 201103L + typedef __gnu_cxx::__alloc_traits _Alloc_traits; +#endif public: // types: typedef _Key key_type; @@ -101,6 +106,28 @@ namespace __debug const _Compare& __comp = _Compare(), const allocator_type& __a = allocator_type()) : _Base(__l, __comp, __a) { } + + explicit + multiset(const allocator_type& __a) + : _Base(__a) { } + + multiset(const multiset& __m, const allocator_type& __a) + : _Base(__m, __a) { } + + multiset(multiset&& __m, const allocator_type& __a) + : _Base(std::move(__m._M_base()), __a) { } + + multiset(initializer_list __l, const allocator_type& __a) + : _Base(__l, __a) + { } + + template + multiset(_InputIterator __first, _InputIterator __last, + const allocator_type& __a) + : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first, + __last)), + __gnu_debug::__base(__last), __a) + { } #endif ~multiset() _GLIBCXX_NOEXCEPT { } @@ -108,7 +135,7 @@ namespace __debug multiset& operator=(const multiset& __x) { - *static_cast<_Base*>(this) = __x; + _M_base() = __x; this->_M_invalidate_all(); return *this; } @@ -116,20 +143,25 @@ namespace __debug #if __cplusplus >= 201103L multiset& operator=(multiset&& __x) + noexcept(_Alloc_traits::_S_nothrow_move()) { - // NB: DR 1204. - // NB: DR 675. __glibcxx_check_self_move_assign(__x); - clear(); - swap(__x); + bool xfer_memory = _Alloc_traits::_S_propagate_on_move_assign() + || __x.get_allocator() == this->get_allocator(); + _M_base() = std::move(__x._M_base()); + if (xfer_memory) + this->_M_swap(__x); + else + this->_M_invalidate_all(); + __x._M_invalidate_all(); return *this; } multiset& operator=(initializer_list __l) { - this->clear(); - this->insert(__l); + _M_base() = __l; + this->_M_invalidate_all(); return *this; } #endif @@ -328,7 +360,14 @@ namespace __debug void swap(multiset& __x) +#if __cplusplus >= 201103L + noexcept(_Alloc_traits::_S_nothrow_swap()) +#endif { +#if __cplusplus >= 201103L + if (!_Alloc_traits::_S_propagate_on_swap()) + __glibcxx_check_equal_allocs(__x); +#endif _Base::swap(__x); this->_M_swap(__x); } diff --git a/libstdc++-v3/include/debug/set.h b/libstdc++-v3/include/debug/set.h index 5da8821930c..8c84f25298a 100644 --- a/libstdc++-v3/include/debug/set.h +++ b/libstdc++-v3/include/debug/set.h @@ -49,6 +49,10 @@ namespace __debug typedef typename _Base::const_iterator _Base_const_iterator; typedef typename _Base::iterator _Base_iterator; typedef __gnu_debug::_Equal_to<_Base_const_iterator> _Equal; +#if __cplusplus >= 201103L + typedef __gnu_cxx::__alloc_traits _Alloc_traits; +#endif public: // types: typedef _Key key_type; @@ -101,6 +105,28 @@ namespace __debug const _Compare& __comp = _Compare(), const allocator_type& __a = allocator_type()) : _Base(__l, __comp, __a) { } + + explicit + set(const allocator_type& __a) + : _Base(__a) { } + + set(const set& __x, const allocator_type& __a) + : _Base(__x, __a) { } + + set(set&& __x, const allocator_type& __a) + : _Base(std::move(__x._M_base()), __a) { } + + set(initializer_list __l, const allocator_type& __a) + : _Base(__l, __a) + { } + + template + set(_InputIterator __first, _InputIterator __last, + const allocator_type& __a) + : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first, + __last)), + __gnu_debug::__base(__last), __a) + { } #endif ~set() _GLIBCXX_NOEXCEPT { } @@ -108,7 +134,7 @@ namespace __debug set& operator=(const set& __x) { - *static_cast<_Base*>(this) = __x; + _M_base() = __x; this->_M_invalidate_all(); return *this; } @@ -116,20 +142,25 @@ namespace __debug #if __cplusplus >= 201103L set& operator=(set&& __x) + noexcept(_Alloc_traits::_S_nothrow_move()) { - // NB: DR 1204. - // NB: DR 675. __glibcxx_check_self_move_assign(__x); - clear(); - swap(__x); + bool xfer_memory = _Alloc_traits::_S_propagate_on_move_assign() + || __x.get_allocator() == this->get_allocator(); + _M_base() = std::move(__x._M_base()); + if (xfer_memory) + this->_M_swap(__x); + else + this->_M_invalidate_all(); + __x._M_invalidate_all(); return *this; } set& operator=(initializer_list __l) { - this->clear(); - this->insert(__l); + _M_base() = __l; + this->_M_invalidate_all(); return *this; } #endif @@ -337,7 +368,14 @@ namespace __debug void swap(set& __x) +#if __cplusplus >= 201103L + noexcept(_Alloc_traits::_S_nothrow_swap()) +#endif { +#if __cplusplus >= 201103L + if (!_Alloc_traits::_S_propagate_on_swap()) + __glibcxx_check_equal_allocs(__x); +#endif _Base::swap(__x); this->_M_swap(__x); } -- 2.11.4.GIT