42#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
86 void operator= (
Less&);
103 const Less*)
const = 0;
106template <
class InputIterator1,
class InputIterator2,
class OutputIterator>
119 const Less *ppred)
const {
121 const InputIterator1 first1 (xsrc1, xsrc1, xsrc1_end);
122 const InputIterator1 last1 (xsrc1_end, xsrc1, xsrc1_end);
123 const InputIterator2 first2 (xsrc2, xsrc2, xsrc2_end);
124 const InputIterator2 last2 (xsrc2_end, xsrc2, xsrc2_end);
129 std::set_intersection (first1, last1, first2,
131 : std::set_intersection (first1, last1, first2,
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_intersection";
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 xsrc2_end, 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);
231 "line %d: %s<%s, %s, %s%{?}, %s%{;}> (\"%s\", \"%s\", ...) "
232 " ==> \"%{X=*.*}\" got %zu elements from first sequence and "
233 "%zu from second, expected %zu from first and 0 from second",
234 __LINE__, fname, it1name, it2name, outname,
predicate, funname,
235 src1, src2, cwidth,
int (ndst), -1, xdst,
n1,
n2, ndst);
238 const std::size_t n_exp_ops =
239 nsrc1 + nsrc2 > 0 ? 2 * (nsrc1 + nsrc2) - 1 : 0;
242 "line %d: %s<%s, %s, %s%{?}, %s%{;}> (\"%s\", \"%s\", ...) "
243 "complexity: got %zu, expected no more than %zu",
244 __LINE__, fname, it1name, it2name, outname,
predicate, funname,
245 src1, src2, n_ops_lt, n_exp_ops);
257 const char*
const it1name = alg.
iter_names [0];
258 const char*
const it2name = alg.
iter_names [1];
259 const char*
const outname = alg.
iter_names [2];
260 const char*
const fname =
"set_intersection";
261 const char*
const funname =
predicate ?
"Less" : 0;
264 "%s std::%s(%s, %3$s, %s, %4$s, %1$s%{?}, %s%{;})",
265 outname, fname, it1name, it2name,
predicate, funname);
267#define TEST(src1, src2, res) \
268 test_set_intersection (__LINE__, src1, sizeof src1 - 1, \
269 src2, sizeof src2 - 1, \
270 res, sizeof res - 1, \
274 TEST (
"abcde",
"",
"");
277 TEST (
"",
"abcde",
"");
282 TEST (
"aa",
"aa",
"aa");
283 TEST (
"ab",
"ab",
"ab");
285 TEST (
"aa",
"ab",
"a");
286 TEST (
"ab",
"bb",
"b");
287 TEST (
"aa",
"bb",
"");
288 TEST (
"ac",
"bb",
"");
290 TEST (
"ace",
"bdf",
"");
291 TEST (
"acf",
"bdf",
"f");
292 TEST (
"ade",
"bdf",
"d");
293 TEST (
"bce",
"bdf",
"b");
295 TEST (
"aacee",
"aacee",
"aacee");
296 TEST (
"aacee",
"aaace",
"aace");
297 TEST (
"aacee",
"aaaae",
"aae");
298 TEST (
"aacee",
"aaaaa",
"aa");
299 TEST (
"aaaae",
"aacee",
"aae");
300 TEST (
"aaaaa",
"aacee",
"aa");
301 TEST (
"aacee",
"aaabd",
"aa");
302 TEST (
"aaabd",
"aacee",
"aa");
303 TEST (
"aacee",
"aabee",
"aaee");
317template <
class InputIterator1,
class InputIterator2,
class OutputIterator>
319 const InputIterator2&,
330template <
class InputIterator1,
class InputIterator2>
332 const InputIterator2 &it2,
349template <
class InputIterator1>
373 "template <class %s, class %s, class %s%{?}, class %s%{;}> %3$s "
374 "set_intersection(%1$s, %1$s, %2$s, %2$s, %3$s%{?}, %s%{;})",
375 "InputIterator1",
"InputIterator2",
"OutputIterator",
379 rw_note (0, 0, 0,
"OutputIterator test disabled");
382 rw_note (0, 0, 0,
"InputIterator test disabled");
387 rw_note (0, 0, 0,
"ForwardIterator test disabled");
392 rw_note (0, 0, 0,
"BidirectionalIterator test disabled");
398 rw_note (0, 0, 0,
"RandomAccessIterator test disabled");
410 rw_note (0, 0, 0,
"predicate test disabled");
415 for (
int i = 0;
i != niters; ++
i) {
424int main (
int argc,
char *argv[])
426 return rw_test (argc, argv, __FILE__,
427 "lib.set.intersection",
431 "|-no-InputIterator# "
432 "|-no-OutputIterator# "
433 "|-no-ForwardIterator# "
434 "|-no-BidirectionalIterator# "
435 "|-no-RandomAccessIterator#",
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
void gen_set_intersection_test(const InputIterator1 &, const InputIterator2 &, const OutputIterator &, bool predicate)
void test_set_intersection(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 SetIntersectionBase &alg)
#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 ~SetIntersectionBase()
const char * iter_names[3]
virtual UserClass * set_intersection(const UserClass *, const UserClass *, const UserClass *, const UserClass *, UserClass *, UserClass *, const Less *) const =0
virtual UserClass * set_intersection(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)