aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite/23_containers/deque_ctor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/testsuite/23_containers/deque_ctor.cc')
-rw-r--r--libstdc++-v3/testsuite/23_containers/deque_ctor.cc539
1 files changed, 0 insertions, 539 deletions
diff --git a/libstdc++-v3/testsuite/23_containers/deque_ctor.cc b/libstdc++-v3/testsuite/23_containers/deque_ctor.cc
deleted file mode 100644
index 50a813368bb..00000000000
--- a/libstdc++-v3/testsuite/23_containers/deque_ctor.cc
+++ /dev/null
@@ -1,539 +0,0 @@
-// 2001-12-27 pme
-//
-// Copyright (C) 2001, 2002, 2003 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 2, 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 COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// 23.2.1.1 deque constructors, copy, and assignment
-
-#include <deque>
-#include <iterator>
-#include <sstream>
-#include <testsuite_allocator.h>
-#include <testsuite_hooks.h>
-
-using __gnu_cxx_test::copy_tracker;
-using __gnu_cxx_test::allocation_tracker;
-using __gnu_cxx_test::tracker_alloc;
-using __gnu_cxx_test::copy_constructor;
-using __gnu_cxx_test::assignment_operator;
-using __gnu_cxx_test::counter;
-using __gnu_cxx_test::destructor;
-
-typedef std::deque<counter> gdeque;
-
-bool test = true;
-
-// see http://gcc.gnu.org/ml/libstdc++/2001-11/msg00139.html
-void
-test01()
-{
- assert_count (0);
- {
- gdeque d(10);
- assert_count (10);
- }
- assert_count (0);
-}
-
-
-// 23.2.1 required types
-//
-// A missing required type will cause a compile failure.
-//
-void
-requiredTypesCheck()
-{
- typedef int T;
- typedef std::deque<T> X;
-
- typedef X::reference reference;
- typedef X::const_reference const_reference;
- typedef X::iterator iterator;
- typedef X::const_iterator const_iterator;
- typedef X::size_type size_type;
- typedef X::difference_type difference_type;
- typedef X::value_type value_type;
- typedef X::allocator_type allocator_type;
- typedef X::pointer pointer;
- typedef X::const_pointer const_pointer;
- typedef X::reverse_iterator reverse_iterator;
- typedef X::const_reverse_iterator const_reverse_iterator;
-}
-
-
-// @fn defaultConstructorCheck
-// Explicitly checks the default deque constructor and destructor for both
-// trivial and non-trivial types. In addition, the size() and empty()
-// member functions are explicitly checked here since it should be their
-// first use. Checking those functions means checking the begin() and
-// end() and their const brethren functions as well.
-//
-// @verbatim
-// 23.2.1.1 default ctor/dtor
-// effects:
-// 23.2.1.1 constructs an empty deque using the specified allocator
-// postconditions:
-// 23.1 table 65 u.size() == 0
-// throws:
-// complexity:
-// 23.1 table 65 constant
-//
-// 23.2.1.2 bool empty() const
-// semantics:
-// 23.1 table 65 a.size() == 0
-// 23.1 (7) a.begin() == a.end()
-// throws:
-// complexity:
-// 23.1 table 65 constant
-//
-// 23.2.1.2 size_type size() const
-// semantics:
-// 23.1 table 65 a.end() - a.begin()
-// throws:
-// complexity:
-// 23.1 table 65(A) should be constant
-//
-// 23.2.1 iterator begin()
-// const_iterator begin() const
-// iterator end()
-// const_iterator end() const
-// throws:
-// 23.1 (10) pt. 4 does not throw
-// complexity:
-// 23.1 table 65 constant
-// @endverbatim
-void
-defaultConstructorCheckPOD()
-{
- // setup
- typedef int T;
- typedef std::deque<T> X;
-
- // run test
- X u;
-
- // assert postconditions
- VERIFY(u.empty());
- VERIFY(0 == u.size());
- VERIFY(u.begin() == u.end());
- VERIFY(0 == std::distance(u.begin(), u.end()));
-
- // teardown
-}
-
-
-void
-defaultConstructorCheck()
-{
- // setup
- typedef copy_tracker T;
- typedef std::deque<T> X;
-
- copy_tracker::reset();
-
- // run test
- const X u;
-
- // assert postconditions
- VERIFY(u.empty());
- VERIFY(0 == u.size());
- VERIFY(u.begin() == u.end());
- VERIFY(0 == std::distance(u.begin(), u.end()));
-
- // teardown
-}
-
-
-// @fn copyConstructorCheck()
-// Explicitly checks the deque copy constructor. Continues verificaton of
-// ancillary member functions documented under defaultConstructorCheck().
-//
-// This check also tests the push_back() member function.
-//
-// @verbatim
-// 23.2.1 copy constructor
-// effects:
-// postconditions:
-// 22.1.1 table 65 a == X(a)
-// u == a
-// throws:
-// complexity:
-// 22.1.1 table 65 linear
-// @endverbatim
-void
-copyConstructorCheck()
-{
- // setup
- typedef copy_tracker T;
- typedef std::deque<T> X;
-
- const int copyBaseSize = 17; // arbitrary
-
- X a;
- for (int i = 0; i < copyBaseSize; ++i)
- a.push_back(i);
- copy_tracker::reset();
-
- // assert preconditions
- VERIFY(!a.empty());
- VERIFY(copyBaseSize == a.size());
- VERIFY(a.begin() != a.end());
- VERIFY(copyBaseSize == std::distance(a.begin(), a.end()));
-
- // run test
- X u = a;
-
- // assert postconditions
- VERIFY(u == a);
- VERIFY(copyBaseSize == copy_constructor::count());
-
- // teardown
-}
-
-
-// @fn fillConstructorCheck()
-// This test explicitly verifies the basic fill constructor. Like the default
-// constructor, later tests depend on the fill constructor working correctly.
-// That means this explicit test should preceed the later tests so the error
-// message given on assertion failure can be more helpful n tracking the
-// problem.
-//
-// 23.2.1.1 fill constructor
-// complexity:
-// 23.2.1.1 linear in N
-void
-fillConstructorCheck()
-{
- // setup
- typedef copy_tracker T;
- typedef std::deque<T> X;
-
- const X::size_type n(23);
- const X::value_type t(111);
-
- copy_tracker::reset();
-
- // run test
- X a(n, t);
-
- // assert postconditions
- VERIFY(n == a.size());
- VERIFY(n == copy_constructor::count());
-
- // teardown
-}
-
-
-// @fn fillConstructorCheck2()
-// Explicit check for fill constructors masqueraded as range constructors as
-// elucidated in clause 23.1.1 paragraph 9 of the standard.
-//
-// 23.1.1 (9) fill constructor looking like a range constructor
-void
-fillConstructorCheck2()
-{
- typedef copy_tracker T;
- typedef std::deque<T> X;
-
- const int f = 23;
- const int l = 111;
-
- copy_tracker::reset();
-
- X a(f, l);
-
- VERIFY(f == a.size());
- VERIFY(f == copy_constructor::count());
-}
-
-
-// @fn rangeConstructorCheckForwardIterator()
-// This test copies from one deque to another to force the copy
-// constructor for T to be used because the compiler will kindly
-// elide copies if the default constructor can be used with
-// type conversions. Trust me.
-//
-// 23.2.1.1 range constructor, forward iterators
-void
-rangeConstructorCheckForwardIterator()
-{
- // setup
- typedef copy_tracker T;
- typedef std::deque<T> X;
-
- const X::size_type n(726);
- const X::value_type t(307);
- X source(n, t);
- X::iterator i = source.begin();
- X::iterator j = source.end();
- X::size_type rangeSize = std::distance(i, j);
-
- copy_tracker::reset();
-
- // test
- X a(i, j);
-
- // assert postconditions
- VERIFY(rangeSize == a.size());
- VERIFY(copy_constructor::count() <= rangeSize);
-}
-
-
-// @fn rangeConstructorCheckInputIterator()
-// An explicit check for range construction on an input iterator
-// range, which the standard expounds upon as having a different
-// complexity than forward iterators.
-//
-// 23.2.1.1 range constructor, input iterators
-void
-rangeConstructorCheckInputIterator()
-{
- typedef copy_tracker T;
- typedef std::deque<T> X;
-
- std::istringstream ibuf("1234567890123456789");
- const X::size_type rangeSize = ibuf.str().size();
- std::istream_iterator<char> i(ibuf);
- std::istream_iterator<char> j;
-
- copy_tracker::reset();
-
- X a(i, j);
-
- VERIFY(rangeSize == a.size());
- VERIFY(copy_constructor::count() <= (2 * rangeSize));
-}
-
-
-// 23.2.1 copy assignment
-void
-copyAssignmentCheck()
-{
- typedef copy_tracker T;
- typedef std::deque<T> X;
-
- const X::size_type n(18);
- const X::value_type t(1023);
- X a(n, t);
- X r;
-
- copy_tracker::reset();
-
- r = a;
-
- VERIFY(r == a);
- VERIFY(n == copy_constructor::count());
-}
-
-
-// 23.2.1.1 fill assignment
-//
-// The complexity check must check dtors+copyAssign and
-// copyCtor+copyAssign because that's the way the SGI implementation
-// works. Dunno if it's true standard compliant (which specifies fill
-// assignment in terms of erase and insert only), but it should work
-// as (most) users expect and is more efficient.
-void
-fillAssignmentCheck()
-{
- typedef copy_tracker T;
- typedef std::deque<T> X;
-
- const X::size_type starting_size(10);
- const X::value_type starting_value(66);
- const X::size_type n(23);
- const X::value_type t(111);
-
- X a(starting_size, starting_value);
- copy_tracker::reset();
-
- // preconditions
- VERIFY(starting_size == a.size());
-
- // test
- a.assign(n, t);
-
- // postconditions
- VERIFY(n == a.size());
- VERIFY(n == (copy_constructor::count() + assignment_operator::count()));
- VERIFY(starting_size == (destructor::count() + assignment_operator::count()));
-}
-
-
-// @verbatim
-// 23.2.1 range assignment
-// 23.2.1.1 deque constructors, copy, and assignment
-// effects:
-// Constructs a deque equal to the range [first, last), using the
-// specified allocator.
-//
-// template<typename InputIterator>
-// assign(InputIterator first, InputIterator last);
-//
-// is equivalent to
-//
-// erase(begin(), end());
-// insert(begin(), first, last);
-//
-// postconditions:
-// throws:
-// complexity:
-// forward iterators: N calls to the copy constructor, 0 reallocations
-// input iterators: 2N calls to the copy constructor, log(N) reallocations
-// @endverbatim
-void
-rangeAssignmentCheck()
-{
- typedef copy_tracker T;
- typedef std::deque<T> X;
-
- const X::size_type source_size(726);
- const X::value_type source_value(307);
- const X::size_type starting_size(10);
- const X::value_type starting_value(66);
-
- X source(source_size, source_value);
- X::iterator i = source.begin();
- X::iterator j = source.end();
- X::size_type rangeSize = std::distance(i, j);
-
- X a(starting_size, starting_value);
- VERIFY(starting_size == a.size());
-
- copy_tracker::reset();
-
- a.assign(i, j);
-
- VERIFY(source == a);
- VERIFY(rangeSize == (copy_constructor::count() + assignment_operator::count()));
- VERIFY(starting_size == (destructor::count() + assignment_operator::count()));
-}
-
-
-// 23.1 (10) range assignment
-// 23.2.1.3 with exception
-void
-rangeAssignmentCheckWithException()
-{
- // setup
- typedef copy_tracker T;
- typedef std::deque<T> X;
-
- // test
- // What does "no effects" mean?
-}
-
-
-// 23.1.1 (9) fill assignment looking like a range assignment
-void
-fillAssignmentCheck2()
-{
- // setup
- typedef copy_tracker T;
- typedef std::deque<T> X;
-
- // test
- // What does "no effects" mean?
-}
-
-// Verify that the default deque constructor offers the basic exception
-// guarantee.
-void
-test_default_ctor_exception_safety()
-{
- // setup
- typedef copy_tracker T;
- typedef std::deque<T, tracker_alloc<T> > X;
-
- T::reset();
- copy_constructor::throw_on(3);
- allocation_tracker::resetCounts();
-
- // test
- try
- {
- X a(7);
- VERIFY(("no exception thrown", false));
- }
- catch (...)
- {
- }
-
- // assert postconditions
- VERIFY(allocation_tracker::allocationTotal() == allocation_tracker::deallocationTotal());
-
- // teardown
-}
-
-// Verify that the copy constructor offers the basic exception guarantee.
-void
-test_copy_ctor_exception_safety()
-{
- // setup
- typedef copy_tracker T;
- typedef std::deque<T, tracker_alloc<T> > X;
-
- allocation_tracker::resetCounts();
- {
- X a(7);
- T::reset();
- copy_constructor::throw_on(3);
-
-
- // test
- try
- {
- X u(a);
- VERIFY(("no exception thrown", false));
- }
- catch (...)
- {
- }
- }
-
- // assert postconditions
- VERIFY(allocation_tracker::allocationTotal() == allocation_tracker::deallocationTotal());
-
- // teardown
-}
-
-
-int main()
-{
- // basic functionality and standard conformance checks
- requiredTypesCheck();
- defaultConstructorCheckPOD();
- defaultConstructorCheck();
- test_default_ctor_exception_safety();
- copyConstructorCheck();
- test_copy_ctor_exception_safety();
- fillConstructorCheck();
- fillConstructorCheck2();
- rangeConstructorCheckInputIterator();
- rangeConstructorCheckForwardIterator();
- copyAssignmentCheck();
- fillAssignmentCheck();
- fillAssignmentCheck2();
- rangeAssignmentCheck();
- rangeAssignmentCheckWithException();
-
- // specific bug fix checks
- test01();
-
- return !test;
-}