summaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite/23_containers/vector/cons/4.cc
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /libstdc++-v3/testsuite/23_containers/vector/cons/4.cc
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'libstdc++-v3/testsuite/23_containers/vector/cons/4.cc')
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/cons/4.cc584
1 files changed, 584 insertions, 0 deletions
diff --git a/libstdc++-v3/testsuite/23_containers/vector/cons/4.cc b/libstdc++-v3/testsuite/23_containers/vector/cons/4.cc
new file mode 100644
index 000000000..27d496ac9
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/cons/4.cc
@@ -0,0 +1,584 @@
+// 1999-06-29 bkoz
+
+// Copyright (C) 1999-2001, 2002, 2003, 2009 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/>.
+
+// 23.2.4.1 vector constructors, copy, and assignment
+
+#include <vector>
+#include <string>
+#include <testsuite_allocator.h>
+#include <testsuite_hooks.h>
+
+using __gnu_test::copy_tracker;
+using __gnu_test::tracker_allocator_counter;
+using __gnu_test::tracker_allocator;
+using __gnu_test::copy_constructor;
+using __gnu_test::assignment_operator;
+
+// @fn test_default_ctor_exception_gurantee This test verifies that if
+// one of the vector's contained objects throws an exception from its
+// constructor while the vector is being constructed and filled with
+// default values, all memory is returned to the allocator whence it
+// came.
+void
+test_default_ctor_exception_gurantee()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ copy_tracker::reset();
+ copy_constructor::throw_on(3);
+ tracker_allocator_counter::reset();
+
+ // run test
+ try
+ {
+ T ref;
+ X a(7, ref);
+ VERIFY(false);
+ }
+ catch (...)
+ {
+ }
+
+ // assert postconditions
+ VERIFY( tracker_allocator_counter::get_allocation_count() == tracker_allocator_counter::get_deallocation_count() );
+
+ // teardown
+}
+
+// @fn test_copy_ctor_exception_gurantee This test verifies that if
+// one of the vector's contained objects throws an exception from its
+// constructor while the vector is being copy constructed, all memory
+// is returned to the allocator whence it came.
+void
+test_copy_ctor_exception_gurantee()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ tracker_allocator_counter::reset();
+ {
+ X a(7);
+ copy_tracker::reset();
+ copy_constructor::throw_on(3);
+
+ // run test
+ try
+ {
+ X u(a);
+ VERIFY(false);
+ }
+ catch (...)
+ {
+ }
+ }
+
+ // assert postconditions
+ VERIFY(tracker_allocator_counter::get_allocation_count() == tracker_allocator_counter::get_deallocation_count());
+
+ // teardown
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+}
+
+// operator=()
+//
+// case 1: lhs.size() > rhs.size()
+// case 2: lhs.size() < rhs.size() < lhs.capacity()
+// case 3: lhs.capacity() < rhs.size()
+//
+void
+test_assignment_operator_1()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ X r(9);
+ X a(r.size() - 2);
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+
+ // preconditions
+ VERIFY(r.size() > a.size());
+
+ // run test
+ r = a;
+
+ // assert postconditions
+ VERIFY(r == a);
+ VERIFY(tracker_allocator_counter::get_allocation_count() == 0);
+
+ // teardown
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+}
+
+void
+test_assignment_operator_2()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ X r(1);
+ r.reserve(17);
+ X a(r.size() + 7);
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+
+ // preconditions
+ VERIFY(r.size() < a.size());
+ VERIFY(a.size() < r.capacity());
+
+ // run test
+ r = a;
+
+ // assert postconditions
+ VERIFY(r == a);
+ VERIFY(tracker_allocator_counter::get_allocation_count() == 0);
+
+ // teardown
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+}
+
+void
+test_assignment_operator_3()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ tracker_allocator_counter::reset();
+ {
+ X r(1);
+ X a(r.capacity() + 7);
+ copy_tracker::reset();
+
+ // preconditions
+ VERIFY(r.capacity() < a.size());
+
+ // run test
+ r = a;
+
+ // assert postconditions
+ VERIFY(r == a);
+ }
+ VERIFY(tracker_allocator_counter::get_allocation_count() == tracker_allocator_counter::get_deallocation_count());
+
+ // teardown
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+}
+
+void
+test_assignment_operator_3_exception_guarantee()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ tracker_allocator_counter::reset();
+ {
+ X r(1);
+ X a(r.capacity() + 7);
+ copy_tracker::reset();
+ copy_constructor::throw_on(3);
+
+ // preconditions
+ VERIFY(r.capacity() < a.size());
+
+ // run test
+ try
+ {
+ r = a;
+ VERIFY(false);
+ }
+ catch (...)
+ {
+ }
+ }
+
+ // assert postconditions
+ VERIFY(tracker_allocator_counter::get_allocation_count() == tracker_allocator_counter::get_deallocation_count());
+
+ // teardown
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+}
+
+// fill assign()
+//
+// case 1: [23.2.4.1 (3)] n <= size()
+// case 2: [23.2.4.1 (3)] size() < n <= capacity()
+// case 3: [23.2.4.1 (3)] n > capacity()
+// case 4: [23.2.4.1 (3)] n > capacity(), exception guarantees
+// case 5: [23.1.1 (9)] fill assign disguised as a range assign
+//
+void
+test_fill_assign_1()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ X a(7);
+ X::size_type old_size = a.size();
+ X::size_type new_size = old_size - 2;
+ const T t;
+
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+
+ // run test
+ a.assign(new_size, t);
+
+ // assert postconditions
+ VERIFY(a.size() == new_size);
+ VERIFY(tracker_allocator_counter::get_allocation_count() == 0);
+
+ // teardown
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+}
+
+void
+test_fill_assign_2()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ X a(7);
+ a.reserve(11);
+ X::size_type old_size = a.size();
+ X::size_type old_capacity = a.capacity();
+ X::size_type new_size = old_size + 2;
+ const T t;
+
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+
+ // assert preconditions
+ VERIFY(old_size < new_size);
+ VERIFY(new_size <= old_capacity);
+
+ // run test
+ a.assign(new_size, t);
+
+ // assert postconditions
+ VERIFY(a.size() == new_size);
+ VERIFY(tracker_allocator_counter::get_allocation_count() == 0);
+
+ // teardown
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+}
+
+void
+test_fill_assign_3()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ tracker_allocator_counter::reset();
+ {
+ X a(7);
+ X::size_type old_capacity = a.capacity();
+ X::size_type new_size = old_capacity + 4;
+ const T t;
+
+ copy_tracker::reset();
+
+ // assert preconditions
+ VERIFY(new_size > old_capacity);
+
+ // run test
+ a.assign(new_size, t);
+
+ // assert postconditions
+ VERIFY(a.size() == new_size);
+ }
+
+ VERIFY(tracker_allocator_counter::get_allocation_count() > 0);
+ VERIFY(tracker_allocator_counter::get_allocation_count() == tracker_allocator_counter::get_deallocation_count());
+
+ // teardown
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+}
+
+void
+test_fill_assign_3_exception_guarantee()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ tracker_allocator_counter::reset();
+ {
+ X a(7);
+ X::size_type old_size = a.size();
+ X::size_type old_capacity = a.capacity();
+ X::size_type new_size = old_capacity + 4;
+ const T t;
+
+ copy_tracker::reset();
+ copy_constructor::throw_on(3);
+
+ // assert preconditions
+ VERIFY(new_size > old_capacity);
+
+ // run test
+ try
+ {
+ a.assign(new_size, t);
+ VERIFY(false);
+ }
+ catch (...)
+ {
+ }
+
+ // assert postconditions
+ VERIFY(a.size() == old_size);
+ VERIFY(a.capacity() == old_capacity);
+ }
+
+ VERIFY(tracker_allocator_counter::get_allocation_count() > 0);
+ VERIFY(tracker_allocator_counter::get_allocation_count() == tracker_allocator_counter::get_deallocation_count());
+
+ // teardown
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+}
+
+void
+test_fill_assign_4()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ X a(7);
+ X::size_type old_size = a.size();
+ X::size_type new_size = old_size - 2;
+ X::size_type new_value = 117;
+
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+
+ // run test
+ a.assign(new_size, new_value);
+
+ // assert postconditions
+ VERIFY(a.size() == new_size);
+ VERIFY(tracker_allocator_counter::get_allocation_count() == 0);
+
+ // teardown
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+}
+
+// range assign()
+//
+// case 1: [23.2.4.1 (2)] input iterator
+// case 2: [23.2.4.1 (2)] forward iterator, distance(first, last) <= size()
+// case 3: [23.2.4.1 (2)]
+// forward iterator, size() < distance(first, last) <= capacity()
+// case 4: [23.2.4.1 (2)] forward iterator, distance(first, last) > capacity()
+// case 5: [23.2.4.1 (2)]
+// forward iterator, distance(first, last) > capacity(),
+// exception guarantees
+void
+test_range_assign_1()
+{
+ // @TODO
+}
+
+void
+test_range_assign_2()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ X a(7);
+ X b(3);
+
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+
+ // assert preconditions
+ VERIFY(b.size() < a.capacity());
+
+ // run test
+ a.assign(b.begin(), b.end());
+
+ // assert postconditions
+ VERIFY(a.size() == b.size());
+ VERIFY(a == b);
+ VERIFY(tracker_allocator_counter::get_allocation_count() == 0);
+
+ // teardown
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+}
+
+void
+test_range_assign_3()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ X a(7);
+ a.reserve(a.size() + 7);
+ X b(a.size() + 3);
+
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+
+ // assert preconditions
+ VERIFY(a.size() < b.size());
+ VERIFY(b.size() < a.capacity());
+
+ // run test
+ a.assign(b.begin(), b.end());
+
+ // assert postconditions
+ VERIFY(a.size() == b.size());
+ VERIFY(a == b);
+ VERIFY(tracker_allocator_counter::get_allocation_count() == 0);
+
+ // teardown
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+}
+
+void
+test_range_assign_4()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ tracker_allocator_counter::reset();
+ {
+ X a(7);
+ X b(a.capacity() + 7);
+
+ copy_tracker::reset();
+
+ // assert preconditions
+ VERIFY(b.size() > a.capacity());
+
+ // run test
+ a.assign(b.begin(), b.end());
+
+ // assert postconditions
+ VERIFY(a.size() == b.size());
+ VERIFY(a == b);
+ }
+ VERIFY(tracker_allocator_counter::get_allocation_count() > 0);
+ VERIFY(tracker_allocator_counter::get_allocation_count() == tracker_allocator_counter::get_deallocation_count());
+
+ // teardown
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+}
+
+void
+test_range_assign_4_exception_guarantee()
+{
+ // setup
+ bool test __attribute__((unused)) = true;
+ typedef copy_tracker T;
+ typedef std::vector<T, tracker_allocator<T> > X;
+
+ tracker_allocator_counter::reset();
+ {
+ X a(7);
+ X b(a.capacity() + 7);
+
+ copy_tracker::reset();
+ copy_constructor::throw_on(3);
+
+ // assert preconditions
+ VERIFY(b.size() > a.capacity());
+
+ // run test
+ try
+ {
+ a.assign(b.begin(), b.end());
+ VERIFY(false);
+ }
+ catch (...)
+ {
+ }
+ }
+
+ // assert postconditions
+ VERIFY(tracker_allocator_counter::get_allocation_count() > 0);
+ VERIFY(tracker_allocator_counter::get_allocation_count() == tracker_allocator_counter::get_deallocation_count());
+
+ // teardown
+ copy_tracker::reset();
+ tracker_allocator_counter::reset();
+}
+
+
+int main()
+{
+ test_default_ctor_exception_gurantee();
+ test_copy_ctor_exception_gurantee();
+ test_assignment_operator_1();
+ test_assignment_operator_2();
+ test_assignment_operator_3();
+ test_assignment_operator_3_exception_guarantee();
+ test_fill_assign_1();
+ test_fill_assign_2();
+ test_fill_assign_3();
+ test_fill_assign_3_exception_guarantee();
+ test_fill_assign_4();
+ test_range_assign_1();
+ test_range_assign_2();
+ test_range_assign_3();
+ test_range_assign_4();
+ test_range_assign_4_exception_guarantee();
+
+ return 0;
+}