+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
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;
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 { }
map&
operator=(const map& __x)
{
- *static_cast<_Base*>(this) = __x;
+ _M_base() = __x;
this->_M_invalidate_all();
return *this;
}
#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
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);
}
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;
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 { }
multimap&
operator=(const multimap& __x)
{
- *static_cast<_Base*>(this) = __x;
+ _M_base() = __x;
this->_M_invalidate_all();
return *this;
}
#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
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);
}
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;
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 { }
multiset&
operator=(const multiset& __x)
{
- *static_cast<_Base*>(this) = __x;
+ _M_base() = __x;
this->_M_invalidate_all();
return *this;
}
#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
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);
}
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;
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 { }
set&
operator=(const set& __x)
{
- *static_cast<_Base*>(this) = __x;
+ _M_base() = __x;
this->_M_invalidate_all();
return *this;
}
#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
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);
}