set.h (set): Implement C++11 allocator-aware container requirements.

2014-01-13  François Dumont  <fdumont@gcc.gnu.org>

	* 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.

From-SVN: r206588
This commit is contained in:
François Dumont 2014-01-13 20:07:22 +00:00
parent ed100f5d64
commit 51835a800d
5 changed files with 209 additions and 28 deletions

View File

@ -1,3 +1,30 @@
2014-01-13 François Dumont <fdumont@gcc.gnu.org>
* 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 <jwakely@redhat.com>
PR libstdc++/59698

View File

@ -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<typename
_Base::allocator_type> _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<value_type> __l, const allocator_type& __a)
: _Base(__l, __a) { }
template<typename _InputIterator>
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<value_type> __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);
}

View File

@ -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<typename
_Base::allocator_type> _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<value_type> __l, const allocator_type& __a)
: _Base(__l, __a)
{ }
template<typename _InputIterator>
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<value_type> __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);
}

View File

@ -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<typename
_Base::allocator_type> _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<value_type> __l, const allocator_type& __a)
: _Base(__l, __a)
{ }
template<typename _InputIterator>
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<value_type> __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);
}

View File

@ -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<typename
_Base::allocator_type> _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<value_type> __l, const allocator_type& __a)
: _Base(__l, __a)
{ }
template<typename _InputIterator>
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<value_type> __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);
}