40#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
80 static std::size_t funcalls_;
97 void operator= (
Less&);
107 const char* iter_names [3];
128template <
class InputIterator1,
class InputIterator2,
class OutputIterator>
141 const Less *ppred)
const {
143 const InputIterator1 first1 (xsrc1, xsrc1, xsrc1_end);
144 const InputIterator1 last1 (xsrc1_end, xsrc1, xsrc1_end);
145 const InputIterator2 first2 (xsrc2, xsrc2, xsrc2_end);
146 const InputIterator2 last2 (xsrc2_end, xsrc2, xsrc2_end);
151 std::merge (first1, last1, first2, last2,
result, *ppred)
152 : std::merge (first1, last1, first2, last2,
result);
162template <
class B
idirectionalIterator>
174 const Less *ppred)
const {
181 std::inplace_merge (first, mid,
last, *ppred);
183 std::inplace_merge (first, mid,
last);
193 const std::size_t midinx,
197 const char*
const it1name = alg.
iter_names [0];
198 const char*
const it2name = alg.
iter_names [1];
199 const char*
const outname = alg.
iter_names [2];
200 const char*
const predname =
predicate ?
"Less" : 0;
201 const bool inplace = 0 == it2name;
202 const char*
const algname = inplace ?
"inplace_merge" :
"merge";
204 const std::size_t nsrc1 = std::strlen (src1);
205 const std::size_t nsrc2 = std::strlen (src2);
210 const std::size_t ndst = nsrc1 + nsrc2;
213 UserClass*
const xsrc1_end = xsrc1 + nsrc1;
214 UserClass*
const xsrc2_end = xsrc2 + nsrc2;
215 UserClass*
const xsrc_mid = xsrc1 + midinx;
220 const Less pred (0, 0);
229 xdst_res = alg.
merge (xsrc1, xsrc1_end,
230 xsrc2, xsrc2_end, xdst, xdst_end, ppred);
233 const std::size_t n_ops_lt = ppred ?
240 success = xdst_res == xdst_end;
242 "line %d: %s<%s, %s, %s%{?}, %s%{;}> (\"%s\", \"%s\", ...)"
243 " == first + %zu, got first + %td",
244 __LINE__, algname, it1name, it2name, outname,
predicate,
245 predname, src1, src2, ndst, xdst_res - xdst);
248 static const int cwidth =
sizeof (*xdst);
253 "line %d: %s<%s%{?}, %s, %s%{;}%{?}, %s%{;}> "
254 "(\"%s\", %{?}\"%s\"%{;}%{?}%zu%{;}, ...) ==> \"%{X=*.*}\" "
256 __LINE__, algname, it1name, !inplace, it2name, outname,
257 predicate, predname, src1, !inplace, src2, inplace, midinx,
258 cwidth,
int (ndst), -1, xdst);
262 for ( ;
i < ndst;
i++) {
263 if (xdst [
i - 1].data_.val_ == xdst [
i].
data_.
val_) {
271 i =
i < ndst ?
i : ndst - 1;
274 "line %d: %s<%s%{?}, %s, %s%{;}%{?}, %s%{;}> "
275 "(\"%s\", %{?}\"%s\"%{;}%{?}%zu%{;}, ...) ==> \"%{X=*.*}\" "
276 "not stable at %zu: got ids %d != %d for values %#c == %#c",
277 __LINE__, algname, it1name, !inplace, it2name, outname,
278 predicate, predname, src1, !inplace, src2, inplace, midinx,
279 cwidth,
int (ndst),
i, xdst,
i, xdst [
i - 1].origin_,
280 xdst [
i].origin_, xdst [
i - 1].data_.val_, xdst [
i].
data_.
val_);
283 success = n_ops_lt <= ndst - 1;
285 "line %d: %s<%s%{?}, %s, %s%{;}%{?}, %s%{;}> "
286 "(\"%s\", %{?}\"%s\"%{;}%{?}%zu%{;}, ...) ==> \"%{X=*.*}\" "
287 "complexity: got %zu, expected <= %zu",
288 __LINE__, algname, it1name, !inplace, it2name, outname,
289 predicate, predname, src1, !inplace, src2, inplace, midinx,
290 cwidth,
int (ndst), -1, xdst, n_ops_lt, ndst - 1);
303 const char*
const it1name = alg.
iter_names [0];
304 const char*
const it2name = alg.
iter_names [1];
305 const char*
const outname = alg.
iter_names [2];
306 const char*
const predname =
predicate ?
"Less" : 0;
307 const char*
const algname = it2name ?
"merge" :
"inplace_merge";
310 "%s std::%s(%s, %3$s, %s, %4$s, %1$s%{?}, %s%{;})",
311 outname, algname, it1name, it2name,
predicate, predname);
313#define TEST(src1, src2) \
314 test_merge (__LINE__, src1, src2, 0, predicate, alg)
324 TEST (
"acegi",
"bdfhj");
325 TEST (
"aaegi",
"bdfjj");
326 TEST (
"accgi",
"bdhhj");
327 TEST (
"aceei",
"bffhj");
328 TEST (
"acegg",
"ddfhj");
329 TEST (
"aceii",
"bbfhj");
331 TEST (
"bdfhj",
"acegi");
332 TEST (
"bdfjj",
"aaegi");
333 TEST (
"bdhhj",
"accgi");
334 TEST (
"bffhj",
"aceei");
335 TEST (
"ddfhj",
"acegg");
336 TEST (
"bbfhj",
"aceii");
338 TEST (
"abcde",
"abcde");
339 TEST (
"aacde",
"aacde");
340 TEST (
"abbde",
"abbde");
341 TEST (
"abcce",
"abcce");
342 TEST (
"abcdd",
"abcdd");
343 TEST (
"abcee",
"abcee");
345 TEST (
"aaegi",
"bdfjj");
346 TEST (
"accgi",
"bdhhj");
347 TEST (
"aceei",
"bffhj");
348 TEST (
"acegg",
"ddfhj");
349 TEST (
"aceii",
"bbfhj");
351 TEST (
"a",
"abcdefghij");
352 TEST (
"ac",
"abcdefghi");
353 TEST (
"ace",
"abcdefgh");
354 TEST (
"aceg",
"abcdefg");
356 TEST (
"j",
"abcdefghjj");
357 TEST (
"gj",
"abcdeggjj");
358 TEST (
"egj",
"abeeggjj");
360 TEST (
"abcdefghij",
"a");
361 TEST (
"abcdefghi",
"ac");
362 TEST (
"abcdefgh",
"ace");
363 TEST (
"abcdefg",
"aceg");
365 TEST (
"abcdefghjj",
"j");
366 TEST (
"abcdeggjj",
"gj");
367 TEST (
"abeeggjj",
"egj");
369 TEST (
"aaaaa",
"aaaaa");
370 TEST (
"bbbbb",
"bbbbb");
377 const char*
const itname = alg.
iter_names [0];
378 const char*
const predname =
predicate ?
"Less" : 0;
379 const char*
const algname = alg.
iter_names [1] ?
380 "merge" :
"inplace_merge";
382 rw_info (0, 0, 0,
"std::%s(%s, %2$s, %2$s%{?}, %s%{;})",
386#define TEST(src, mid) \
387 test_merge (__LINE__, src, "", mid, predicate, alg)
398 TEST (
"abcdefghij", 5);
399 TEST (
"aacdeffhij", 5);
400 TEST (
"abbdefggij", 5);
401 TEST (
"abccefghhj", 5);
402 TEST (
"abcddfghii", 5);
403 TEST (
"abceefghjj", 5);
405 TEST (
"abcdeabcde", 5);
406 TEST (
"aacdeaacde", 5);
407 TEST (
"abbdeabbde", 5);
408 TEST (
"abcceabcce", 5);
409 TEST (
"abcddabcdd", 5);
410 TEST (
"abceeabcee", 5);
412 TEST (
"aabcdefghi", 1);
413 TEST (
"aaacdefghi", 1);
414 TEST (
"babcdefghi", 1);
415 TEST (
"babbdefghi", 1);
417 TEST (
"abcdefghia", 9);
418 TEST (
"aacdefghia", 9);
419 TEST (
"abcdefghib", 9);
420 TEST (
"abbdefghib", 9);
436template <
class InputIterator1,
class InputIterator2,
class OutputIterator>
438 const InputIterator2&,
447template <
class InputIterator1,
class InputIterator2>
449 const InputIterator2 &it2,
463template <
class InputIterator1>
482 rw_note (0, 0, 0,
"InputIterator test disabled");
487 rw_note (0, 0, 0,
"ForwardIterator test disabled");
492 rw_note (0, 0, 0,
"BidirectionalIterator test disabled");
497 rw_note (0, 0, 0,
"RandomAccessIterator test disabled");
504template <
class B
idirectionalIterator>
517 rw_note (0, 0, 0,
"predicate test disabled");
523 rw_note (0, 0, 0,
"merge test disabled");
525 for (
int i = 0;
i != niters; ++
i) {
532 rw_note (0, 0, 0,
"inplace_merge test disabled");
535 for (
int i = 0;
i != niters; ++
i) {
538 rw_note (0, 0, 0,
"BidirectionalIterator test disabled");
543 rw_note (0, 0, 0,
"RandomAccessIterator test disabled");
556int main (
int argc,
char *argv[])
558 return rw_test (argc, argv, __FILE__,
563 "|-no-inplace_merge# "
565 "|-no-InputIterator# "
566 "|-no-OutputIterator# "
567 "|-no-ForwardIterator# "
568 "|-no-BidirectionalIterator# "
569 "|-no-RandomAccessIterator#",
#define BidirectionalIterator
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
void test_merge(int line, const char *src1, const char *src2, const std::size_t midinx, bool predicate, const MergeBase &alg)
void gen_merge_test(const InputIterator1 &, const InputIterator2 &, const OutputIterator &, bool predicate)
int rw_opt_no_inplace_merge
void gen_inplace_merge_test(const BidirectionalIterator &, bool predicate)
int rw_opt_no_output_iter
void test_inplace_merge(const MergeBase &alg, bool predicate)
#define _RWSTD_UNUSED(arg)
#define _RWSTD_NAMESPACE(name)
bool is_sorted_lt(InputIterator first, InputIterator last)
_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 *,...)
virtual void inplace_merge(UserClass *xsrc, UserClass *xsrc_mid, UserClass *xsrc_end, const Less *ppred) const
static std::size_t funcalls_
virtual UserClass * merge(const UserClass *, const UserClass *, const UserClass *, const UserClass *, UserClass *, UserClass *, const Less *) const
virtual void inplace_merge(UserClass *, UserClass *, UserClass *, const Less *) const
const char * iter_names[3]
virtual UserClass * merge(const UserClass *xsrc1, const UserClass *xsrc1_end, const UserClass *xsrc2, const UserClass *xsrc2_end, UserClass *xdst, UserClass *xdst_end, const Less *ppred) const
static UserClass from_char(char c)
static _RWSTD_SIZE_T n_total_op_lt_
static conv_to_bool make(bool val)