40#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
84 void operator= (
Less&);
102 const Less*)
const = 0;
105template <
class InputIterator1,
class InputIterator2,
class OutputIterator>
118 const Less *ppred)
const {
120 const InputIterator1 first1 (xsrc1, xsrc1, xsrc1_end);
121 const InputIterator1 last1 (xsrc1_end, xsrc1, xsrc1_end);
122 const InputIterator2 first2 (xsrc2, xsrc2, xsrc2_end);
123 const InputIterator2 last2 (xsrc2_end, xsrc2, xsrc2_end);
128 std::set_union (first1, last1, first2, last2,
result, *ppred)
129 : std::set_union (first1, last1, first2, last2,
result);
151 const char*
const it1name = alg.
iter_names [0];
152 const char*
const it2name = alg.
iter_names [1];
153 const char*
const outname = alg.
iter_names [2];
154 const char*
const fname =
"set_union";
155 const char*
const funname =
predicate ?
"Less" : 0;
167 const int max1_id = nsrc1 > 0 ? xsrc1 [nsrc1 - 1].
id_ : -1;
169 UserClass*
const xsrc1_end = xsrc1 + nsrc1;
170 UserClass*
const xsrc2_end = xsrc2 + nsrc2;
175 const Less pred (0, 0);
179 alg.
set_union (xsrc1, xsrc1_end, xsrc2, xsrc2_end,
180 xdst, xdst_end, ppred);
183 bool success = xdst_res == xdst_end;
185 "line %d: %s<%s, %s, %s%{?}, %s%{;}> (\"%s\", \"%s\", ...) "
186 "got res + %td, expected res + %zu",
187 __LINE__, fname, it1name, it2name, outname,
predicate,
188 funname, src1, src2, xdst_res - xdst, ndst);
198 const std::size_t n_ops_lt = ppred ?
205 for ( ;
i < ndst;
i++) {
213 i =
i < ndst ?
i : ndst - 1;
215 static const int cwidth =
sizeof (*xdst);
218 "line %d: %s<%s, %s, %s%{?}, %s%{;}> (\"%s\", \"%s\", ...) "
219 " ==> \"%{X=*.*}\", expected \"%s\"",
220 __LINE__, fname, it1name, it2name, outname,
predicate,
221 funname, src1, src2, cwidth,
int (ndst),
i, xdst,
res);
225 success =
n1 == nsrc1;
227 "line %d: %s<%s, %s, %s%{?}, %s%{;}> (\"%s\", \"%s\", ...) "
228 " ==> \"%{X=*.*}\" got %zu elements from first sequence and "
229 "%zu from second, expected %zu from first and %zu from second",
230 __LINE__, fname, it1name, it2name, outname,
predicate, funname,
231 src1, src2, cwidth,
int (ndst), -1, xdst,
232 n1,
n2, nsrc1, ndst - nsrc1);
235 const std::size_t n_exp_ops =
236 nsrc1 + nsrc2 > 0 ? 2 * (nsrc1 + nsrc2) - 1 : 0;
239 "line %d: %s<%s, %s, %s%{?}, %s%{;}> (\"%s\", \"%s\", ...) "
240 "complexity: got %zu, expected no more than %zu",
241 __LINE__, fname, it1name, it2name, outname,
predicate, funname,
242 src1, src2, n_ops_lt, n_exp_ops);
254 const char*
const it1name = alg.
iter_names [0];
255 const char*
const it2name = alg.
iter_names [1];
256 const char*
const outname = alg.
iter_names [2];
257 const char*
const fname =
"set_union";
258 const char*
const funname =
predicate ?
"Less" : 0;
261 "%s std::%s(%s, %3$s, %s, %4$s, %1$s%{?}, %s%{;})",
262 outname, fname, it1name, it2name,
predicate, funname);
264#define TEST(src1, src2, res) \
265 test_set_union (__LINE__, src1, sizeof src1 - 1, \
266 src2, sizeof src2 - 1, \
267 res, sizeof res - 1, \
271 TEST (
"abcde",
"",
"abcde");
274 TEST (
"",
"abcde",
"abcde");
276 TEST (
"a",
"b",
"ab");
277 TEST (
"b",
"a",
"ab");
279 TEST (
"aa",
"aa",
"aa");
280 TEST (
"ab",
"ab",
"ab");
282 TEST (
"aa",
"ab",
"aab");
283 TEST (
"aa",
"bb",
"aabb");
284 TEST (
"ab",
"bb",
"abb");
285 TEST (
"ac",
"bb",
"abbc");
287 TEST (
"ace",
"bdf",
"abcdef");
288 TEST (
"acf",
"bdf",
"abcdf");
289 TEST (
"ade",
"bdf",
"abdef");
290 TEST (
"bce",
"bdf",
"bcdef");
292 TEST (
"abcde",
"fghij",
"abcdefghij");
293 TEST (
"aacde",
"ffhij",
"aacdeffhij");
294 TEST (
"abbde",
"fggij",
"abbdefggij");
295 TEST (
"abcce",
"fghhj",
"abccefghhj");
296 TEST (
"abcdd",
"fghii",
"abcddfghii");
298 TEST (
"aacee",
"aacee",
"aacee");
299 TEST (
"aacee",
"aaace",
"aaacee");
300 TEST (
"aacee",
"aaaae",
"aaaacee");
301 TEST (
"aacee",
"aaaaa",
"aaaaacee");
302 TEST (
"aacee",
"aaaab",
"aaaabcee");
303 TEST (
"aacee",
"aaabd",
"aaabcdee");
304 TEST (
"aacee",
"aabee",
"aabcee");
318template <
class InputIterator1,
class InputIterator2,
class OutputIterator>
320 const InputIterator2&,
331template <
class InputIterator1,
class InputIterator2>
333 const InputIterator2 &it2,
348template <
class InputIterator1>
368 "template <class %s, class %s, class %s%{?}, class %s%{;}> "
369 "%3$s set_union(%1$s, %1$s, %2$s, %2$s, %3$s%{?}, %s%{;})",
370 "InputIterator1",
"InputIterator2",
"OutputIterator",
374 rw_note (0, 0, 0,
"OutputIterator test disabled");
377 rw_note (0, 0, 0,
"InputIterator test disabled");
382 rw_note (0, 0, 0,
"ForwardIterator test disabled");
387 rw_note (0, 0, 0,
"BidirectionalIterator test disabled");
392 rw_note (0, 0, 0,
"RandomAccessIterator test disabled");
403 rw_note (0, 0, 0,
"predicate test disabled");
408 for (
int i = 0;
i != niters; ++
i) {
417int main (
int argc,
char *argv[])
419 return rw_test (argc, argv, __FILE__,
424 "|-no-InputIterator# "
425 "|-no-OutputIterator# "
426 "|-no-ForwardIterator# "
427 "|-no-BidirectionalIterator# "
428 "|-no-RandomAccessIterator#",
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
#define TEST(src1, src2, res)
void gen_set_union_test(const InputIterator1 &, const InputIterator2 &, const OutputIterator &, bool predicate)
int rw_opt_no_output_iter
void test_set_union(int line, const char *src1, std::size_t nsrc1, const char *src2, std::size_t nsrc2, const char *res, std::size_t ndst, bool predicate, const SetUnionBase &alg)
#define _RWSTD_UNUSED(arg)
#define _RWSTD_NAMESPACE(name)
_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 *,...)
conv_to_bool operator()(const T &x, const T &y)
static std::size_t funcalls_
const char * iter_names[3]
virtual UserClass * set_union(const UserClass *, const UserClass *, const UserClass *, const UserClass *, UserClass *, UserClass *, const Less *) const =0
virtual UserClass * set_union(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)