42static int rw_opt_no_int_spec;
43static int rw_opt_no_short_spec;
44static int rw_opt_no_types;
45static int rw_opt_no_signatures;
46static int rw_opt_no_ctors;
80 Difference
d (it - it);
125template <
class Vector,
class T,
class Allocator>
128#define TEST_TYPE(T, vectorT) { \
129 T *t = (typename Vector::vectorT*)0; \
133#define TEST_REFERENCE(T, vectorT) { \
134 typename Vector::value_type v; \
142 TEST_TYPE (
typename Allocator::pointer, pointer);
143 TEST_TYPE (
typename Allocator::const_pointer, const_pointer);
145#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
147 typedef std::reverse_iterator<typename Vector::iterator>
149 typedef std::reverse_iterator<typename Vector::const_iterator>
150 ConstReverseIterator;
154 typedef std::reverse_iterator<
typename Vector::iterator,
155 std::random_access_iterator_tag,
T >
158 typedef std::reverse_iterator<
typename Vector::const_iterator,
159 std::random_access_iterator_tag,
T,
const T&,
const T*>
160 ConstReverseIterator;
164 TEST_TYPE (ReverseIterator, reverse_iterator);
165 TEST_TYPE (ConstReverseIterator, const_reverse_iterator);
183 TEST_REFERENCE (
typename Allocator::const_reference, const_reference);
189template <
class Vector,
class T,
class Allocator>
194#define MEMFUN(result, name, arg_list) do { \
195 result (Vector::*pf) arg_list = &Vector::name; \
196 _RWSTD_UNUSED (pf); \
202 typedef typename Vector::size_type SizeType;
203 typedef typename Vector::value_type ValueType;
204 typedef typename Vector::iterator
Iterator;
207 MEMFUN (
typename Vector::iterator, begin, ());
208 MEMFUN (
typename Vector::const_iterator, begin, ()
const);
209 MEMFUN (
typename Vector::iterator,
end, ());
210 MEMFUN (
typename Vector::const_iterator,
end, ()
const);
213 MEMFUN (
typename Vector::reverse_iterator, rbegin, ());
214 MEMFUN (
typename Vector::const_reverse_iterator, rbegin, ()
const);
215 MEMFUN (
typename Vector::reverse_iterator, rend, ());
216 MEMFUN (
typename Vector::const_reverse_iterator, rend, ()
const);
220 MEMFUN (SizeType, max_size, ()
const);
221 MEMFUN (
void, resize, (SizeType, ValueType));
222 MEMFUN (SizeType, capacity, ()
const);
223 MEMFUN (
bool, empty, ()
const);
224 MEMFUN (
void, reserve, (SizeType));
227 MEMFUN (
const T&,
operator[], (SizeType)
const);
228 MEMFUN (
T&,
operator[], (SizeType));
229 MEMFUN (
const T&, at, (SizeType)
const);
231 MEMFUN (
const T&, front, ()
const);
233 MEMFUN (
const T&, back, ()
const);
237 MEMFUN (
void, push_back, (
const T&));
238 MEMFUN (
void, pop_back, ());
244#if !defined (_MSC_VER) || _MSC_VER >= 1300
255#if !defined (_MSC_VER) || _MSC_VER > 1300
257#define FUN(result, name, arg_list) do { \
258 result (*pf) arg_list = &name; \
259 _RWSTD_UNUSED (pf); \
281 b = std::operator== (*pcv, *pcv);
282 b = std::operator< (*pcv, *pcv);
283 b = std::operator!= (*pcv, *pcv);
284 b = std::operator> (*pcv, *pcv);
285 b = std::operator>= (*pcv, *pcv);
286 b = std::operator<= (*pcv, *pcv);
287 std::swap (*pv, *pv);
300 typedef std::vector<UserClass, std::allocator<UserClass> >
Vector;
305 "std::vector<UserClass>::vector(size_type, "
306 "const_reference, const allocator_type&)");
308 rw_info (0, 0, 0,
"std::vector<UserClass>::vector(const vector&)");
319 "vector<UserClass>::vector(size_type, const_reference); "
320 "leaked %zu objects of value_type",
331 && v0.begin () +
i == v0.end ()
332 && v0.rbegin () +
i == v0.rend (),
334 "vector<UserClass>::vector(size_type, const_reference)");
339 "vector<UserClass>::vector(size_type, const_reference); "
340 "called default/copy ctor and operator=() %zu, %zu, "
341 "and %zu times, respectively, 0, %zu, 0 expected",
349 &&
v1.begin () +
i ==
v1.end ()
350 &&
v1.rbegin () +
i ==
v1.rend (),
352 "vector<UserClass>::vector(const vector&)");
358 "vector<UserClass>::vector(size_type, const_reference); "
359 "called default/copy ctor and operator=() %zu, %zu, "
360 "and %zu times, respectively, 0, %zu, 0 expected",
375 "%zu. vector<UserClass>::operator=(const vector&)",
379 "%zu. vector<UserClass>::operator=(const vector&)",
383#ifndef _RWSTD_NO_EXCEPTIONS
416#if !defined (__HP_aCC) || _RWSTD_HP_aCC_MINOR > 3800
432 "logic error: failed to throw");
435 "vector<UserClass>::vector(size_type, const_reference) "
436 "leaked %zu value(s) of %zu after an exception",
456#if !defined (__HP_aCC) || _RWSTD_HP_aCC_MINOR > 3800
473 "logic error: failed to throw");
476 "vector<UserClass>::vector(const vector&) leaked "
477 "%zu value(s) of %zu after an exception",
485 const Vector::size_type v1_size =
v1.size ();
486 const Vector::size_type v1_cap =
v1.capacity ();
517 "logic error: failed to throw");
521 "vector<UserClass>::vector(const vector&) leaked "
522 "%zu value(s) of %zu after an exception",
527 rw_assert (
v1.size () == v1_size &&
v1.capacity () == v1_cap,
528 0, __LINE__,
"vector<UserClass>::operator="
529 "(const vector&) changed size of *this from "
530 "%zu to %zu after exception",
541template <
class Vector,
class T,
class Alloc>
547 "std::vector<UserClass>::vector(const allocator_type&)");
554 && v0.empty () && v0.begin () == v0.end ()
555 && v0.rbegin () == v0.rend (), 0, __LINE__,
556 (
"vector<UserClass>::vector()"));
559 &&
v1.empty () &&
v1.begin () ==
v1.end ()
560 &&
v1.rbegin () ==
v1.rend (), 0, __LINE__,
561 "vector<UserClass>::vector()");
567 "std::vector<UserClass>::vector(size_type, "
568 "const_reference, const allocator_type&)");
578 && v0.begin () +
i == v0.end ()
579 && v0.rbegin () +
i == v0.rend (),
581 "vector<UserClass>::vector"
582 "(size_type, const_reference)");
585 &&
v1.begin () +
i ==
v1.end ()
586 &&
v1.rbegin () +
i ==
v1.rend (),
588 "vector<UserClass>::vector(size_type, "
589 "const_reference, const allocator_type&)");
592 for (
typename Vector::size_type
j = 0;
j !=
i; ++
j) {
593 if (!(success = v0 [
j] ==
val))
595 if (!(success =
v1 [
j] ==
val))
600 "vector<UserClass>::vector(size_type, const_reference); "
601 "all elements initialized");
605#if !defined (_MSC_VER) || _MSC_VER >= 1300
610 "template <class InputIterator> std::vector<UserClass>::vector"
611 "(InputIterator, InputIterator)");
621 alloc.construct (vals +
i,
typename Alloc::value_type (
i));
637 || (!((
i && !v0.empty ()) || (!
i && v0.empty ())))
639 || (!((
i && !
v1.empty ()) || (!
i &&
v1.empty ()))))
644 "size () == %zu, got %zu",
i, v0.size ());
646 rw_assert ((
i && !v0.empty ()) || (!
i && v0.empty ()),
647 0, __LINE__,
"size () == %zu, empty () == %d",
648 v0.size (), v0.empty ());
651 "size () == %zu, got %zu",
i,
v1.size ());
654 0, __LINE__,
"size () == %zu, empty () == %d",
655 v1.size (),
v1.empty ());
659 "template <class InputIterator> "
660 "std::vector<UserClass>::vector"
661 "(InputIterator, InputIterator)");
679 static int int_noted = 0;
680 static int short_noted = 0;
681 static int types_noted = 0;
682 static int sign_noted = 0;
683 static int ctors_noted = 0;
685#ifndef _RWSTD_NO_EXCEPTIONS
698#define VECTOR(T) std::vector<T, std::allocator<T> >
700#define TEST(what, T) \
703 rwt_check_leaks (0, 0); \
704 test_ ##what ((VECTOR (T)*)0, (T*)0, std::allocator<T>()); \
706 std::size_t nbytes; \
707 const std::size_t nblocks = rwt_check_leaks (&nbytes, 0); \
708 rw_assert (!nblocks && !nbytes, 0, __LINE__, \
709 #what " test leaked %lu bytes in %lu blocks", \
713 if (rw_opt_no_int_spec) {
714 rw_note (int_noted++, 0, __LINE__,
715 "int specializations test disabled.");
719 if (rw_opt_no_types) {
720 rw_note (types_noted++, 0, __LINE__,
"Types test disabled.");
726 if (rw_opt_no_signatures) {
727 rw_note (sign_noted++, 0, __LINE__,
"Signatures test disabled.");
730 TEST (signatures,
int);
733 if (rw_opt_no_ctors) {
734 rw_note (ctors_noted++, 0, __LINE__,
"Ctors test disabled.");
743#define VECTOR(T, A) std::vector<T, A<T> >
746#define TEST(what,T,A) test_ ##what ((VECTOR (T, A)*)0, (T*)0, A<T>())
748 if (rw_opt_no_short_spec) {
749 rw_note (short_noted++, 0, __LINE__,
750 "short specializations test disabled.");
753 if (rw_opt_no_types) {
754 rw_note (types_noted++, 0, __LINE__,
"Types test disabled.");
757 TEST (types,
short, std::allocator);
760 if (rw_opt_no_signatures) {
761 rw_note (sign_noted++, 0, __LINE__,
"Signatures test disabled.");
764 TEST (signatures,
short, std::allocator);
767 if (rw_opt_no_ctors) {
768 rw_note (ctors_noted++, 0, __LINE__,
"Ctors test disabled.");
771 TEST (ctors,
short, std::allocator);
775 if (rw_opt_no_ctors) {
776 rw_note (ctors_noted++, 0, __LINE__,
"Ctors test disabled.");
787int main (
int argc,
char** argv)
789 return rw_test (argc, argv, __FILE__,
794 "|-no-int_specializations# "
795 "|-no-short_specializations# "
801 &rw_opt_no_short_spec,
803 &rw_opt_no_signatures,
#define RandomAccessIterator
std::vector< UserClass, std::allocator< UserClass > > Vector
void test_signatures(Vector *, T *, Allocator)
void test_types(Vector *, T *, Allocator)
#define TEST_REFERENCE(T, vectorT)
#define FUN(result, name, arg_list)
#define MEMFUN(result, name, arg_list)
#define TEST_TYPE(T, vectorT)
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
#define _RWSTD_UNUSED(arg)
#define _RWSTD_ERROR_LOGIC_ERROR
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_info(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_note(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)
static _RWSTD_SIZE_T n_total_op_assign_
static bool is_total(_RWSTD_SIZE_T count, _RWSTD_SIZE_T n_def_ctor, _RWSTD_SIZE_T n_copy_ctor, _RWSTD_SIZE_T n_op_assign, _RWSTD_SIZE_T n_op_eq, _RWSTD_SIZE_T n_op_lt)
static _RWSTD_SIZE_T copy_ctor_throw_count_
static _RWSTD_SIZE_T count_
static void reset_totals()
static _RWSTD_SIZE_T n_total_def_ctor_
static _RWSTD_SIZE_T n_total_copy_ctor_