42#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
86 void operator= (
Less&);
104 const Less*)
const = 0;
107template <
class InputIterator1,
class InputIterator2,
class OutputIterator>
120 const Less *ppred)
const {
122 const InputIterator1 first1 (xsrc1, xsrc1, xsrc1_end);
123 const InputIterator1 last1 (xsrc1_end, xsrc1, xsrc1_end);
124 const InputIterator2 first2 (xsrc2, xsrc2, xsrc2_end);
125 const InputIterator2 last2 (xsrc2_end, xsrc2, xsrc2_end);
130 std::set_difference (first1, last1, first2, last2,
result, *ppred)
131 : std::set_difference (first1, last1, first2, last2,
result);
154 const char*
const it1name = alg.
iter_names [0];
155 const char*
const it2name = alg.
iter_names [1];
156 const char*
const outname = alg.
iter_names [2];
157 const char*
const fname =
"set_difference";
158 const char*
const funname =
predicate ?
"Less" : 0;
171 const int max1_id = nsrc1 > 0 ? xsrc1[nsrc1 - 1].
id_ : -1;
173 UserClass*
const xsrc1_end = xsrc1 + nsrc1;
174 UserClass*
const xsrc2_end = xsrc2 + nsrc2;
179 const Less pred (0, 0);
184 xdst, xdst_end, ppred);
187 bool success = xdst_res == xdst_end;
189 "line %d: %s<%s, %s, %s%{?}, %s%{;}> (\"%s\", \"%s\", ...) "
190 "got res + %td, expected res + %zu",
191 __LINE__, fname, it1name, it2name, outname,
predicate,
192 funname, src1, src2, xdst_res - xdst, ndst);
202 const std::size_t n_ops_lt = ppred ?
209 for ( ;
i < ndst; ++
i) {
217 i =
i < ndst ?
i : ndst - 1;
219 static const int cwidth =
sizeof (*xdst);
222 "line %d: %s<%s, %s, %s%{?}, %s%{;}> (\"%s\", \"%s\", ...) "
223 " ==> \"%{X=*.*}\", expected \"%s\"",
224 __LINE__, fname, it1name, it2name, outname,
predicate,
225 funname, src1, src2, cwidth,
int (ndst),
i, xdst,
res);
228 success =
n1 == ndst;
230 "line %d: %s<%s, %s, %s%{?}, %s%{;}> (\"%s\", \"%s\", ...) "
231 " ==> \"%{X=*.*}\" got %zu elements from first sequence and "
232 "%zu from second, expected %zu from first and 0 from second",
233 __LINE__, fname, it1name, it2name, outname,
predicate, funname,
234 src1, src2, cwidth,
int (ndst), -1, xdst,
n1,
n2, ndst);
238 for (
i = 1;
i < ndst;
i++) {
246 i =
i < ndst ?
i : ndst - 1;
249 "line %d: %s<%s, %s, %s%{?}, %s%{;}> (\"%s\", \"%s\", ...)"
250 " ==> \"%{X=*.*}\" not stable : elements %#c==%#c have "
252 __LINE__, fname, it1name, it2name, outname,
predicate,
253 funname, src1, src2, cwidth,
int (ndst),
i, xdst,
259 const std::size_t n_exp_ops =
260 nsrc1 + nsrc2 > 0 ? 2 * (nsrc1 + nsrc2) - 1 : 0;
263 "line %d: %s<%s, %s, %s%{?}, %s%{;}> (\"%s\", \"%s\", ...) "
264 "complexity: got %zu, expected no more than %zu",
265 __LINE__, fname, it1name, it2name, outname,
predicate, funname,
266 src1, src2, n_ops_lt, n_exp_ops);
278 const char*
const it1name = alg.
iter_names [0];
279 const char*
const it2name = alg.
iter_names [1];
280 const char*
const outname = alg.
iter_names [2];
281 const char*
const fname =
"set_difference";
282 const char*
const funname =
predicate ?
"Less" : 0;
285 "%s std::%s(%s, %3$s, %s, %4$s, %1$s%{?}, %s%{;})",
286 outname, fname, it1name, it2name,
predicate, funname);
288#define TEST(src1, src2, res) \
289 test_set_difference (__LINE__, src1, sizeof src1 - 1, \
290 src2, sizeof src2 - 1, res, sizeof res - 1, \
299 TEST (
"abcde",
"",
"abcde");
301 TEST (
"",
"abcde",
"");
302 TEST (
"a",
"b",
"a");
303 TEST (
"b",
"a",
"b");
304 TEST (
"aa",
"aa",
"");
305 TEST (
"ab",
"ab",
"");
306 TEST (
"aa",
"ab",
"a");
307 TEST (
"aa",
"bb",
"aa");
308 TEST (
"ab",
"bb",
"a");
309 TEST (
"ac",
"bb",
"ac");
310 TEST (
"ace",
"bdf",
"ace");
311 TEST (
"acf",
"bdf",
"ac");
312 TEST (
"ade",
"bdf",
"ae");
313 TEST (
"bce",
"bdf",
"ce");
314 TEST (
"aacee",
"aacee",
"");
315 TEST (
"aacee",
"aaace",
"e");
316 TEST (
"aacee",
"aaaae",
"ce");
317 TEST (
"aacee",
"aaaaa",
"cee");
318 TEST (
"aacee",
"aaabd",
"cee");
319 TEST (
"aacee",
"aabee",
"c");
320 TEST (
"aaaaa",
"aaaaa",
"");
321 TEST (
"aaaaa",
"aaaa",
"a");
322 TEST (
"aaaaa",
"aaa",
"aa");
323 TEST (
"aaaaa",
"aa",
"aaa");
324 TEST (
"aaaaa",
"a",
"aaaa");
325 TEST (
"acegi",
"bdfhj",
"acegi");
326 TEST (
"bdfhj",
"acegi",
"bdfhj");
340template <
class InputIterator1,
class InputIterator2,
class OutputIterator>
342 const InputIterator2&,
353template <
class InputIterator1,
class InputIterator2>
355 const InputIterator2 &it2,
372template <
class InputIterator1>
395 "template <class %s, class %s, class %s%{?}, class %s%{;}> %3$s "
396 "set_difference (%1$s, %1$s, %2$s, %2$s, %3$s%{?}, %s%{;})",
397 "InputIterator1",
"InputIterator2",
"OutputIterator",
401 rw_note (0, 0, 0,
"OutputIterator test disabled");
404 rw_note (0, 0, 0,
"InputIterator test disabled");
409 rw_note (0, 0, 0,
"ForwardIterator test disabled");
414 rw_note (0, 0, 0,
"BidirectionalIterator test disabled");
419 rw_note (0, 0, 0,
"RandomAccessIterator test disabled");
431 rw_note (0, 0, 0,
"predicate test disabled");
436 for (
int i = 0;
i != niters; ++
i) {
445int main (
int argc,
char *argv[])
447 return rw_test (argc, argv, __FILE__,
448 "lib.set.difference",
451 "|-no-InputIterator# "
452 "|-no-OutputIterator# "
453 "|-no-ForwardIterator# "
454 "|-no-BidirectionalIterator# "
455 "|-no-RandomAccessIterator#",
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
void test_set_difference(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 SetDifferenceBase &alg)
void gen_set_difference_test(const InputIterator1 &, const InputIterator2 &, const OutputIterator &, bool predicate)
#define TEST(src1, src2, res)
int rw_opt_no_output_iter
#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_
virtual ~SetDifferenceBase()
virtual UserClass * set_difference(const UserClass *, const UserClass *, const UserClass *, const UserClass *, UserClass *, UserClass *, const Less *) const =0
const char * iter_names[3]
virtual UserClass * set_difference(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)