aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely.gcc@gmail.com>2011-11-09 01:26:04 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2011-11-09 01:26:04 +0000
commit425006751bbedc2928d0bddac0de2e5953075ac9 (patch)
tree6d0324a396a0e77c139accb20f546a28c978cc4d
parentffe1468659b160f34f296a3879a0894e45e644ba (diff)
downloadgcc-425006751bbedc2928d0bddac0de2e5953075ac9.zip
gcc-425006751bbedc2928d0bddac0de2e5953075ac9.tar.gz
gcc-425006751bbedc2928d0bddac0de2e5953075ac9.tar.bz2
stl_vector.h (vector::_Alloc_traits): Make private.
* include/bits/stl_vector.h (vector::_Alloc_traits): Make private. * include/debug/vector: Add allocator-extended constructors, ensure move assignment and swap have same allocator propagation semantics and exceptions specification as base class. * include/profile/vector: Likewise. (vector::push_back(_Tp&&)): Forward argument as rvalue. * testsuite/23_containers/vector/debug/alloc_prop.cc: New. * doc/xml/manual/status_cxx2011.xml: Clarify status of container requirements with respect to allocators. (status.iso.200x): Add anchor for old ID to preserve existing links. From-SVN: r181189
-rw-r--r--libstdc++-v3/ChangeLog13
-rw-r--r--libstdc++-v3/doc/xml/manual/status_cxx2011.xml7
-rw-r--r--libstdc++-v3/include/bits/stl_vector.h2
-rw-r--r--libstdc++-v3/include/debug/vector29
-rw-r--r--libstdc++-v3/include/profile/vector32
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/debug/alloc_prop.cc89
6 files changed, 158 insertions, 14 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 24cc7b6..b8b6e35 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,16 @@
+2011-11-09 Jonathan Wakely <jwakely.gcc@gmail.com>
+
+ * include/bits/stl_vector.h (vector::_Alloc_traits): Make private.
+ * include/debug/vector: Add allocator-extended constructors, ensure
+ move assignment and swap have same allocator propagation semantics
+ and exceptions specification as base class.
+ * include/profile/vector: Likewise.
+ (vector::push_back(_Tp&&)): Forward argument as rvalue.
+ * testsuite/23_containers/vector/debug/alloc_prop.cc: New.
+ * doc/xml/manual/status_cxx2011.xml: Clarify status of container
+ requirements with respect to allocators.
+ (status.iso.200x): Add anchor for old ID to preserve existing links.
+
2011-11-08 Jonathan Wakely <jwakely.gcc@gmail.com>
* include/bits/shared_ptr_base.h (_Sp_counted_ptr): Make 'final'.
diff --git a/libstdc++-v3/doc/xml/manual/status_cxx2011.xml b/libstdc++-v3/doc/xml/manual/status_cxx2011.xml
index 2715b2a..51785fc 100644
--- a/libstdc++-v3/doc/xml/manual/status_cxx2011.xml
+++ b/libstdc++-v3/doc/xml/manual/status_cxx2011.xml
@@ -14,6 +14,7 @@
</info>
<para>
+<anchor xml:id="status.iso.200x" /> <!-- preserve links to old section ID -->
This table is based on the table of contents of ISO/IEC
JTC1 SC22 WG21 Doc No: N3290 Date: 2011-04-11
Final Draft International Standard, Standard for Programming Language C++
@@ -1373,10 +1374,12 @@ particular release.
<entry/>
</row>
<row>
+ <?dbhtml bgcolor="#B0B0B0" ?>
<entry>23.2.1</entry>
<entry>General container requirements</entry>
- <entry>Y</entry>
- <entry/>
+ <entry>Partial</entry>
+ <entry>Only <code>vector</code> meets the requirements
+ relating to allocator use and propagation.</entry>
</row>
<row>
<entry>23.2.2</entry>
diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h
index 9b7b698..ec21807 100644
--- a/libstdc++-v3/include/bits/stl_vector.h
+++ b/libstdc++-v3/include/bits/stl_vector.h
@@ -214,11 +214,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
typedef _Vector_base<_Tp, _Alloc> _Base;
typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
+ typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits;
public:
typedef _Tp value_type;
typedef typename _Base::pointer pointer;
- typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits;
typedef typename _Alloc_traits::const_pointer const_pointer;
typedef typename _Alloc_traits::reference reference;
typedef typename _Alloc_traits::const_reference const_reference;
diff --git a/libstdc++-v3/include/debug/vector b/libstdc++-v3/include/debug/vector
index 0f252a0..82662b4 100644
--- a/libstdc++-v3/include/debug/vector
+++ b/libstdc++-v3/include/debug/vector
@@ -52,6 +52,10 @@ namespace __debug
typedef typename _Base::const_iterator _Base_const_iterator;
typedef __gnu_debug::_Equal_to<_Base_const_iterator> _Equal;
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ typedef __gnu_cxx::__alloc_traits<_Allocator> _Alloc_traits;
+#endif
+
public:
typedef typename _Base::reference reference;
typedef typename _Base::const_reference const_reference;
@@ -116,6 +120,17 @@ namespace __debug
__x._M_guaranteed_capacity = 0;
}
+ vector(const vector& __x, const allocator_type& __a)
+ : _Base(__x, __a), _M_guaranteed_capacity(__x.size()) { }
+
+ vector(vector&& __x, const allocator_type& __a)
+ : _Base(std::move(__x), __a),
+ _M_guaranteed_capacity(this->size())
+ {
+ __x._M_invalidate_all();
+ __x._M_guaranteed_capacity = 0;
+ }
+
vector(initializer_list<value_type> __l,
const allocator_type& __a = allocator_type())
: _Base(__l, __a),
@@ -135,12 +150,13 @@ namespace __debug
#ifdef __GXX_EXPERIMENTAL_CXX0X__
vector&
- operator=(vector&& __x)
+ operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
{
- // NB: DR 1204.
- // NB: DR 675.
- clear();
- swap(__x);
+ _Base::operator=(std::move(__x));
+ this->_M_invalidate_all();
+ _M_update_guaranteed_capacity();
+ __x._M_invalidate_all();
+ __x._M_guaranteed_capacity = 0;
return *this;
}
@@ -513,6 +529,9 @@ namespace __debug
void
swap(vector& __x)
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ noexcept(_Alloc_traits::_S_nothrow_swap())
+#endif
{
_Base::swap(__x);
this->_M_swap(__x);
diff --git a/libstdc++-v3/include/profile/vector b/libstdc++-v3/include/profile/vector
index 7a33e88..86aefd6 100644
--- a/libstdc++-v3/include/profile/vector
+++ b/libstdc++-v3/include/profile/vector
@@ -50,6 +50,10 @@ namespace __profile
{
typedef _GLIBCXX_STD_C::vector<_Tp, _Allocator> _Base;
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ typedef __gnu_cxx::__alloc_traits<_Allocator> _Alloc_traits;
+#endif
+
public:
typedef typename _Base::reference reference;
typedef typename _Base::const_reference const_reference;
@@ -143,6 +147,20 @@ namespace __profile
__profcxx_vector_construct2(this);
}
+ vector(const _Base& __x, const _Allocator& __a)
+ : _Base(__x)
+ {
+ __profcxx_vector_construct(this, this->capacity());
+ __profcxx_vector_construct2(this);
+ }
+
+ vector(vector&& __x, const _Allocator& __a) noexcept
+ : _Base(std::move(__x), __a)
+ {
+ __profcxx_vector_construct(this, this->capacity());
+ __profcxx_vector_construct2(this);
+ }
+
vector(initializer_list<value_type> __l,
const allocator_type& __a = allocator_type())
: _Base(__l, __a) { }
@@ -163,12 +181,11 @@ namespace __profile
#ifdef __GXX_EXPERIMENTAL_CXX0X__
vector&
- operator=(vector&& __x)
+ operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
{
- // NB: DR 1204.
- // NB: DR 675.
- this->clear();
- this->swap(__x);
+ __profcxx_vector_destruct(this, this->capacity(), this->size());
+ __profcxx_vector_destruct2(this);
+ static_cast<_Base&>(*this) = std::move(__x);
return *this;
}
@@ -329,7 +346,7 @@ namespace __profile
push_back(_Tp&& __x)
{
size_type __old_size = this->capacity();
- _Base::push_back(__x);
+ _Base::push_back(std::move(__x));
_M_profile_resize(this, __old_size, this->capacity());
}
@@ -373,6 +390,9 @@ namespace __profile
void
swap(vector& __x)
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ noexcept(_Alloc_traits::_S_nothrow_swap())
+#endif
{
_Base::swap(__x);
}
diff --git a/libstdc++-v3/testsuite/23_containers/vector/debug/alloc_prop.cc b/libstdc++-v3/testsuite/23_containers/vector/debug/alloc_prop.cc
new file mode 100644
index 0000000..fffc466
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/debug/alloc_prop.cc
@@ -0,0 +1,89 @@
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+//
+// { dg-do compile }
+// { dg-options "-std=gnu++11" }
+
+#include <debug/vector>
+#include <type_traits>
+#include <testsuite_allocator.h>
+
+template<typename T, typename A>
+ void
+ test()
+ {
+ typedef std::vector<T, A> base;
+ typedef __gnu_debug::vector<T, A> debug;
+
+ using std::is_nothrow_default_constructible;
+ using std::is_nothrow_copy_constructible;
+ using std::is_nothrow_move_constructible;
+ using std::is_nothrow_copy_assignable;
+ using std::is_nothrow_move_assignable;
+
+ static_assert(
+ is_nothrow_default_constructible<base>::value
+ == is_nothrow_default_constructible<debug>::value,
+ "nothrow default constructible");
+
+ static_assert(
+ is_nothrow_copy_constructible<base>::value
+ == is_nothrow_copy_constructible<debug>::value,
+ "nothrow copy constructible");
+
+ static_assert(
+ is_nothrow_move_constructible<base>::value
+ == is_nothrow_move_constructible<debug>::value,
+ "nothrow move constructible");
+
+ static_assert(
+ is_nothrow_copy_assignable<base>::value
+ == is_nothrow_copy_assignable<debug>::value,
+ "nothrow move assignable");
+
+ static_assert(
+ is_nothrow_move_assignable<base>::value
+ == is_nothrow_move_assignable<debug>::value,
+ "nothrow move assignable");
+ }
+
+struct X
+{
+ X() { }
+ ~X() { }
+ X(const X&) { }
+ X(X&&) { }
+ X& operator=(const X&) { }
+ X& operator=(X&&) { }
+};
+
+int main()
+{
+ using __gnu_test::propagating_allocator;
+ using __gnu_test::SimpleAllocator;
+
+ test<int, std::allocator<int>>();
+ test<int, SimpleAllocator<int>>();
+ test<int, propagating_allocator<int, true>>();
+ test<int, propagating_allocator<int, false>>();
+ test<X, std::allocator<X>>();
+ test<X, SimpleAllocator<X>>();
+ test<X, propagating_allocator<X, true>>();
+ test<X, propagating_allocator<X, false>>();
+
+ return 0;
+}