40#define Erase(sig) ListIds::erase_ ## sig
42static const char*
const exceptions[] = {
43 "unknown exception",
"exception"
54#define TEST(str, off, size, res) { \
55 __LINE__, off, size, -1, -1, -1, str, sizeof str - 1, \
56 0, 0, res, sizeof res - 1, 0 }
69 TEST (
"<U0>", 0, 1,
"" ),
70 TEST (
"<U0>", 0, 0,
"<U0>" ),
71 TEST (
"<U0>", 1, 1,
"<U0>" ),
72 TEST (
"<U0>@2", 1, 1,
"<U0>" ),
73 TEST (
"<U0>@2", 0, 1,
"<U0>" ),
75 TEST (
"a", 0, 1,
"" ),
76 TEST (
"a", 0, 0,
"a" ),
77 TEST (
"a", 1, 1,
"a" ),
79 TEST (
"abc", 0, 3,
"" ),
80 TEST (
"abc", 0, 2,
"c" ),
81 TEST (
"abc", 1, 2,
"a" ),
82 TEST (
"abc", 1, 1,
"ac" ),
83 TEST (
"abc", 2, 1,
"ab" ),
84 TEST (
"abc", 3, 0,
"abc" ),
86 TEST (
"t<U0> s", 0, 3,
"s" ),
87 TEST (
"t<U0> s", 0, 4,
"" ),
88 TEST (
"t<U0> s", 0, 1,
"<U0> s" ),
89 TEST (
"t<U0> s", 1, 3,
"t" ),
90 TEST (
"t<U0> s", 1, 2,
"ts" ),
91 TEST (
"t<U0> s", 2, 2,
"t<U0>" ),
92 TEST (
"t<U0> s", 2, 1,
"t<U0>s" ),
93 TEST (
"t<U0> s", 3, 2,
"t<U0> " ),
94 TEST (
"t<U0> s", 4, 0,
"t<U0> s" ),
96 TEST (
"a<U0>@3b", 2, 0,
"a<U0>@3b" ),
97 TEST (
"a<U0>@3b", 2, 3,
"a<U0>" ),
98 TEST (
"a<U0>@3b", 2, 2,
"a<U0>b" ),
99 TEST (
"a<U0>@3b", 1, 4,
"a" ),
100 TEST (
"a<U0>@3b", 0, 5,
"" ),
101 TEST (
"a<U0>@3b", 0, 2,
"<U0>@2b" ),
102 TEST (
"a<U0>b<U0>@2c", 0, 6,
"" ),
103 TEST (
"a<U0>b<U0>@2c", 4, 2,
"a<U0>b<U0>" ),
104 TEST (
"a<U0>b<U0>@2c", 4, 1,
"a<U0>b<U0>c" ),
105 TEST (
"<U0>ab<U0>@2c", 2, 5,
"<U0>a" ),
106 TEST (
"<U0>ab<U0>@2c", 0, 4,
"<U0>c" ),
107 TEST (
"ab<U0>c<U0>@2", 5, 1,
"ab<U0>c<U0>" ),
108 TEST (
"a", 0, 3,
"" ),
109 TEST (
"t<U0> s", 0, 9,
"" ),
110 TEST (
"ab<U0>c<U0>@2", 0, 10,
"" ),
111 TEST (
"x@4096", 0, 4105,
"" ),
112 TEST (
"a", 3, 1,
"a" ),
113 TEST (
"t<U0> s", 5, 1,
"t<U0> s" ),
114 TEST (
"ab<U0>c<U0>@2", 10, 1,
"ab<U0>c<U0>@2" ),
115 TEST (
"x@4096", 4106, 1,
"x@4096" ),
116 TEST (
"x@4096", 0, 4096,
"" ),
117 TEST (
"x@4096", 1, 4095,
"x" ),
118 TEST (
"x@4096", 4, 4092,
"xxxx" ),
119 TEST (
"x@4096", 4, 4090,
"xxxxxx" ),
120 TEST (
"x@4096", 4096, 4096,
"x@4096" ),
121 TEST (
"x@2048y@2048", 1, 4094,
"xy" ),
123 TEST (
"last test", 4, 1,
"lasttest" )
132iter_test_cases [] = {
135#define TEST(str, off, res) { \
136 __LINE__, off, -1, -1, -1, -1, str, sizeof str - 1, \
137 0, 0, res, sizeof res - 1, 0 }
146 TEST (
"<U0>", 0,
""),
147 TEST (
"<U0>@2", 0,
"<U0>"),
148 TEST (
"<U0>@2", 1,
"<U0>"),
150 TEST (
"abc", 0,
"bc"),
151 TEST (
"abc", 1,
"ac"),
152 TEST (
"abc", 2,
"ab"),
154 TEST (
"t<U0> s", 0,
"<U0> s"),
155 TEST (
"t<U0> s", 1,
"t s"),
156 TEST (
"t<U0> s", 2,
"t<U0>s"),
157 TEST (
"t<U0> s", 3,
"t<U0> "),
159 TEST (
"a<U0>@3b", 4,
"a<U0>@3"),
160 TEST (
"a<U0>@3b", 2,
"a<U0>@2b"),
161 TEST (
"a<U0>@3b", 1,
"a<U0>@2b"),
162 TEST (
"a<U0>@3b", 0,
"<U0>@3b"),
163 TEST (
"a<U0>b<U0>@2c", 4,
"a<U0>b<U0>c"),
164 TEST (
"<U0>ab<U0>@2c", 0,
"ab<U0>@2c"),
165 TEST (
"<U0>ab<U0>@2c", 2,
"<U0>a<U0>@2c"),
166 TEST (
"ab<U0>c<U0>@2", 5,
"ab<U0>c<U0>"),
168 TEST (
"x@4096y", 4096,
"x@4096"),
169 TEST (
"x@4096", 4088,
"x@4095"),
170 TEST (
"ax@4096", 0,
"x@4096"),
171 TEST (
"x@4096", 9,
"x@4095"),
173 TEST (
"last test", 4,
"lasttest")
181pop_front_test_cases [] = {
184#define TEST(str, res) { \
185 __LINE__, -1, -1, -1, -1, -1, str, sizeof str - 1, \
186 0, 0, res, sizeof res - 1, 0 }
197 TEST (
"<U0>@2",
"<U0>" ),
200 TEST (
"t<U0> s",
"<U0> s" ),
201 TEST (
"a<U0>@3b",
"<U0>@3b" ),
202 TEST (
"a<U0>b<U0>@2c",
"<U0>b<U0>@2c" ),
203 TEST (
"<U0>ab<U0>@2c",
"ab<U0>@2c" ),
204 TEST (
"ab<U0>c<U0>@2",
"b<U0>c<U0>@2" ),
205 TEST (
"x@4096",
"x@4095" ),
207 TEST (
" last test",
"last test" )
215pop_back_test_cases [] = {
218#define TEST(str, res) { \
219 __LINE__, -1, -1, -1, -1, -1, str, sizeof str - 1, \
220 0, 0, res, sizeof res - 1, 0 }
231 TEST (
"<U0>@2",
"<U0>" ),
234 TEST (
"t<U0> s",
"t<U0> " ),
235 TEST (
"a<U0>@3b",
"a<U0>@3" ),
236 TEST (
"a<U0>b<U0>@2c",
"a<U0>b<U0>@2" ),
237 TEST (
"<U0>ab<U0>@2c",
"<U0>ab<U0>@2" ),
238 TEST (
"ab<U0>c<U0>@2",
"ab<U0>c<U0>" ),
239 TEST (
"x@4096",
"x@4095" ),
241 TEST (
"last test ",
"last test" )
246template <
class InputIterator,
class Distance>
256template<
class InputIterator>
260 std::size_t
dist = 0;
262 for (; first !=
last; ++first)
268template <
class T,
class Allocator>
272 typedef std::list <T, Allocator> List;
273 typedef typename List::iterator ListIter;
274 typedef typename List::const_iterator ListCIter;
285 const std::size_t size1 = tdata.
strlen_;
286 const std::size_t off1 =
287 std::size_t (tcase.
off) < size1 ? std::size_t (tcase.
off) : size1;
288 const std::size_t ext1 =
289 off1 + tcase.
size < size1 ? tcase.
size : size1 - off1;
292 ListIter it_first (lst.begin ());
295#ifndef _RWSTD_NO_EXCEPTIONS
298 const char* expected = 0;
322 std::size_t delcnt = 0;
324 switch (
func.which_) {
327 res_iter = lst.erase (it_first);
331 case Erase (iter_iter): {
332 ListIter it_last (it_first);
334 res_iter = lst.erase (it_first, it_last);
339 case ListIds::pop_front_void:
344 case ListIds::pop_back_void:
350 RW_ASSERT (!
"test logic error: unknown erase overload");
362 "line %d. %{$FUNCALL} called default/copy ctor, "
363 "operator=() and dtor %zu, %zu, %zu, and %zu times, "
364 "respectively, 0, 0, 0, %zu expected",
372 if (ListIds::pop_front_void !=
func.which_
373 && ListIds::pop_back_void !=
func.which_) {
377 "line %d. %{$FUNCALL} returned invalid iterator, "
378 "difference with begin is %zu",
381 if (std::size_t (tcase.
off) >= tdata.
reslen_) {
383 "line %d. %{$FUNCALL} != end()", __LINE__);
389 const T* pres_iter = &*res_iter;
393 tdata.
res_ [tcase.
off].data_.val_ == pres_iter->data_.val_;
396 "line %d. %{$FUNCALL} == %{#c}, got %{#c}",
397 __LINE__, char (tdata.
res_ [tcase.
off].data_.val_),
398 char (pres_iter->data_.val_));
403 static const int cwidth =
sizeof (
T);
405 const std::size_t got_size = lst.size ();
406 char*
const got =
new char [got_size + 1];
408 std::size_t
index = 0;
409 for (ListCIter it = lst.begin (),
410 end = lst.end (); it !=
end; ++it) {
411 got [
index++] = char (it->data_.val_);
414 got [got_size] =
'\0';
418 "line %d. %{$FUNCALL} expected \"%{X=*}\" with length "
419 "%zu, got %{/*.*Gs} with length %zu",
421 tdata.
reslen_, 1, int (got_size), got, got_size);
423 if (tdata.
reslen_ == got_size) {
427 const T* pmatch = T::mismatch (tdata.
res_, got, got_size);
430 "line %d. %{$FUNCALL} expected \"%{X=*}\", "
431 "got %{/*.*Gs}, difference at offset %zu",
433 1, int (got_size), got, pmatch - tdata.
res_);
439#ifndef _RWSTD_NO_EXCEPTIONS
444 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
445 "unexpectedly%{;} caught std::%s(%#s)",
446 __LINE__, 0 != expected, expected,
caught, ex.what ());
451 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
452 "unexpectedly%{;} caught %s",
453 __LINE__, 0 != expected, expected,
caught);
461 std::size_t (-1), std::size_t (-1));
468int main (
int argc,
char** argv)
475 Erase (sig), sig ## _test_cases, \
476 sizeof sig ## _test_cases / sizeof *sig ## _test_cases \
484 ListIds::sig ## _void, sig ## _test_cases, \
485 sizeof sig ## _test_cases / sizeof *sig ## _test_cases \
492 const std::size_t test_count =
sizeof tests /
sizeof *tests;
497 test_erase_func_array, tests, test_count);
#define iter_iter_test_cases
#define TEST(str, off, size, res)
std::size_t _rw_distance(InputIterator first, InputIterator last)
void _rw_advance(InputIterator &it, Distance dist)
const ContainerFunc & func_
const ContainerTestCase & tcase_
_TEST_EXPORT void rw_check_leaks(const SharedAlloc *=0, int=0, _RWSTD_SIZE_T=0, _RWSTD_SIZE_T=_RWSTD_SIZE_MAX)
_TEST_EXPORT int rw_run_cont_test(int, char **, const char *, const char *, ContainerIds::ContainerId, ContainerTestFunc *, const ContainerTest *, _RWSTD_SIZE_T)
#define DEFINE_CONTAINER_TEST_FUNCTIONS(fname)
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)
_TEST_EXPORT _RWSTD_SIZE_T rwt_check_leaks(_RWSTD_SIZE_T *, const rwt_free_store *)
static _RWSTD_SIZE_T n_total_dtor_
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 count_
static void reset_totals()
static _RWSTD_SIZE_T n_total_def_ctor_
static _RWSTD_SIZE_T n_total_copy_ctor_