41#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
64template <
class T,
class ForwardIterator1,
class ForwardIterator2>
76 const std::size_t nseq = std::strlen (seq);
79 T*
const tseq = T::from_char (seq, nseq + 1);
84 for ( ;
i < nseq; ++
i) {
86 const ForwardIterator1 it1 =
89 const ForwardIterator2 it2 =
92 a_val = (*it1).data_.val_;
93 b_val = (*it2).data_.val_;
95 it_swap ? std::iter_swap (it1, it2) : std::swap(*it1, *it2);
98 success = a_val == (*it2).data_.val_ && b_val == (*it1).data_.val_;
104 "%s<%s%{?}, %s%{;}>(%#c, %#c): got: { %#c, %#c } "
105 "expected: { %5$#c, %4$#c } at step %zu",
106 fname, it1name, it_swap, it2name, a_val, b_val,
107 tseq->data_.val_, (tseq +
i)->data_.val_,
i);
112template <
class T,
class ForwardIterator1,
class ForwardIterator2>
114 const T*,
bool it_swap)
116 const char*
const it1name = it_swap ?
type_name (it1, (
T*)0) :
"UserClass";
117 const char*
const it2name = it_swap ?
type_name (it2, (
T*)0) :
"UserClass";
118 const char*
const fname = it_swap ?
"iter_swap" :
"swap";
120 rw_info (0, 0, 0,
"std::%s (%s, %s)", fname, it1name, it2name);
124 test_iter_swap (__LINE__, seq, it1, it2, (T*)0, it_swap, \
125 it1name, it2name, fname)
141template <
class T,
class ForwardIterator1,
class ForwardIterator2>
145 ForwardIterator1 it1,
146 ForwardIterator2 it2,
151 const std::size_t nseq = std::strlen (seq1);
154 T*
const tseq1 = T::from_char (seq1, nseq + 1);
155 T*
const tseq2 = T::from_char (seq2, nseq + 1);
157 const ForwardIterator1 first1 =
158 make_iter (tseq1, tseq1, tseq1 + nseq, it1);
159 const ForwardIterator1 last1 =
160 make_iter (tseq1 + nseq, tseq1, tseq1 + nseq, it1);
161 const ForwardIterator2 first2 =
162 make_iter (tseq2, tseq2, tseq2 + nseq, it2);
163 const ForwardIterator2 last2 =
164 make_iter (tseq2 + nseq, tseq2, tseq2 + nseq, it2);
172 std::size_t last_n_op_assign = T::n_total_op_assign_;
176 std::size_t assigns_per_swap = T::n_total_op_assign_ - last_n_op_assign;
178 last_n_op_assign = T::n_total_op_assign_;
181 const ForwardIterator2
res = std::swap_ranges(first1, last1, first2);
188 bool success =
res.cur_ == last2.cur_;
190 "swap_ranges<%s, %s>(\"%s\", \"%s\") == first + %td, "
192 it1name, it2name, seq1, seq2,
res.cur_ - tseq2,
197 for ( ;
i < nseq; ++
i) {
198 success = (tseq1 +
i)->data_.val_ == seq2[
i]
199 && (tseq2 +
i)->data_.val_ == seq1[
i];
205 "swap_ranges<%s, %s>(\"%s\", \"%s\") mismatch at pos %zu "
206 "got { %#c, %#c }, expected { %#c, %#c }",
207 it1name, it2name, seq1, seq2,
i, (tseq1 +
i)->data_.val_,
208 (tseq2 +
i)->data_.val_, seq2[
i], seq1[
i]);
211 std::size_t swaps_per_swap_ranges =
212 (T::n_total_op_assign_ - last_n_op_assign) / assigns_per_swap;
214 "swap_ranges<%s, %s>(\"%s\", \"%s\") complexity: "
215 "%zu, expected %zu swaps",
216 it1name, it2name, seq1, seq2, swaps_per_swap_ranges, nseq);
224template <
class T,
class ForwardIterator1,
class ForwardIterator2>
226 ForwardIterator2 it2,
229 static const char*
const it1name =
type_name (it1, (
T*)0);
230 static const char*
const it2name =
type_name (it2, (
T*)0);
233 "std::swap_ranges (%s, %1$s, %s)", it1name, it2name);
236#define TEST(seq1, seq2) \
237 test_swap_ranges (__LINE__, seq1, seq2, it1, it2, (T*)0, \
244 TEST(
"abcd",
"zyxw");
245 TEST(
"abcde",
"zyxwv");
246 TEST(
"abcdef",
"zyxwvu");
247 TEST(
"abcdefg",
"zyxwvut");
248 TEST(
"abcdefgh",
"zyxwvuts");
249 TEST(
"abcdefghi",
"zyxwvutsr");
250 TEST(
"abcdefghij",
"zyxwvutsrq");
251 TEST(
"abcdefghijk",
"zyxwvutsrqp");
252 TEST(
"abcdefghijkl",
"zyxwvutsrqpo");
253 TEST(
"abcdefghijklm",
"zyxwvutsrqpon");
265template <
class T,
class ForwardIterator1>
266void test_swap (ForwardIterator1 it1,
const T*,
bool test_ranges)
269 rw_note (0, __FILE__, __LINE__,
"ForwardIterator test disabled");
279 rw_note (0, __FILE__, __LINE__,
"BidirectionalIterator test disabled");
289 rw_note (0, __FILE__, __LINE__,
"RandomAccessIterator test disabled");
305 rw_note (0, __FILE__, __LINE__,
"ForwardIterator test disabled");
312 rw_note (0, __FILE__, __LINE__,
"BidirectionalIterator test disabled");
319 rw_note (0, __FILE__, __LINE__,
"RandomAccessIterator test disabled");
332 rw_note (0, __FILE__, __LINE__,
"std::swap test disabled");
335 rw_info (0, 0, 0,
"template <class T> void swap (T&, T&)");
342 rw_note (0, __FILE__, __LINE__,
"std::swap_ranges test disabled");
346 "template <class %s, class %s> %2$s "
347 "swap_ranges (%1$s, %1$s, %2$s)",
348 "ForwardIterator1",
"ForwardIterator2");
354 rw_note (0, __FILE__, __LINE__,
"std::iter_swap test disabled");
358 "template <class %s, class %s> void iter_swap (%1$s, %2$s)",
359 "ForwardIterator1",
"ForwardIterator2");
369int main (
int argc,
char *argv[])
371 return rw_test (argc, argv, __FILE__,
377 "|-no-ForwardIterator# "
378 "|-no-BidirectionalIterator# "
379 "|-no-RandomAccessIterator",
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
int rw_opt_no_swap_ranges
void test_iter_swap(int line, const char *seq, ForwardIterator1, ForwardIterator2, const T *, bool it_swap, const char *it1name, const char *it2name, const char *fname)
void test_swap_ranges(int line, const char *seq1, const char *seq2, ForwardIterator1 it1, ForwardIterator2 it2, const T *, const char *it1name, const char *it2name)
#define _RWSTD_UNUSED(arg)
#define _RWSTD_NAMESPACE(name)
T * make_iter(T *cur, const T *, const T *, T *)
_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 *,...)