42#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
138template <
class T,
class U>
151 class ConvertibleToBool {
155 operator bool()
const {
return result_; }
164template <
class T,
class U>
202#if defined (_MSC_VER) && _MSC_VER <= 1300
213<
class ForwardIterator1,
class ForwardIterator2,
class T,
class PredTag>
215 const char *seq1,
const char *seq2,
217 ForwardIterator1 it1, ForwardIterator2 it2,
218 const T* , PredTag pred_tag)
220 const char*
const fname =
"search";
221 static const char*
const it1name =
type_name (it1, (
T*)0);
222 static const char*
const it2name =
type_name (it2, (
T*)0);
223 static const char*
const predname =
224 pred_tag.pred_inx ?
"BinaryPredicate" :
"operator <()";
226 const std::size_t nseq1 = std::strlen (seq1);
227 const std::size_t nseq2 = std::strlen (seq2);
230 T*
const xseq1 = T::from_char (seq1, nseq1);
231 T*
const xseq2 = T::from_char (seq2, nseq2);
235 const ForwardIterator1 first1 =
236 make_iter (xseq1, xseq1, xseq1 + nseq1, it1);
237 const ForwardIterator1 last1 =
238 make_iter (xseq1 + nseq1, xseq1, xseq1 + nseq1, it1);
240 const ForwardIterator1 expected = _RWSTD_SIZE_MAX ==
off ?
246 const ForwardIterator2 first2 =
247 make_iter (xseq2, xseq2, xseq2 + nseq2, it2);
248 const ForwardIterator2 last2 =
249 make_iter (xseq2 + nseq2, xseq2, xseq2 + nseq2, it2);
251 T::n_total_op_eq_ = 0;
252 PredTag::Predicate::funcalls_ = 0;
254 typename PredTag::Predicate pred(0, 0);
256 const ForwardIterator1
result = pred_tag.pred_inx ?
257 std::search (first1, last1, first2, last2, pred)
258 : std::search (first1, last1, first2, last2);
265 "std::%s<%s, %s%{?}, %s%{;}> (\"%s\", ..., \"%s\") "
266 "found subsequence at %td, expected at %{?}end%{;}%zu%{;}",
267 fname, it1name, it2name, pred_tag.pred_inx, predname,
268 seq1, seq2,
result.cur_ - first1.cur_,
269 _RWSTD_SIZE_MAX ==
off,
off);
274 const std::size_t max_op_eq = nseq1 * nseq2;
275 const std::size_t op_called = pred_tag.pred_inx ?
276 PredTag::Predicate::funcalls_
280 "std::%s<%s, %s%{?}, %s%{;}> (\"%s\", ..., \"%s\") "
281 "called %s %zu times, expected no more than %zu",
282 fname, it1name, it2name, pred_tag.pred_inx, predname,
283 seq1, seq2, predname, op_called, max_op_eq);
290<
class ForwardIterator1,
class ForwardIterator2,
class T,
class PredTag>
292 const T* , PredTag pred_tag)
294 static const char*
const it1name =
type_name (it1, (
T*)0);
295 static const char*
const it2name =
type_name (it2, (
T*)0);
296 static const char*
const predname =
"EqualityPredicate";
298 if (pred_tag.pred_inx) {
300 "std::search (%s, %1$s, %s, %2$s, %s)",
301 it1name, it2name, predname);
305 "std::search (%s, %1$s, %s, %2$s)",
309#define TEST(seq1, seq2, off) \
310 test_search (__LINE__, seq1, seq2, std::size_t (off), \
311 it1, it2, (T*)0, pred_tag)
321 TEST (
"",
"abc", -1);
323 TEST (
"a",
"ab", -1);
326 TEST (
"ab",
"bb", -1);
328 TEST (
"abc",
"a", 0);
329 TEST (
"abc",
"b", 1);
330 TEST (
"abc",
"c", 2);
332 TEST (
"abc",
"ac", -1);
333 TEST (
"abc",
"ab", 0);
334 TEST (
"abc",
"bc", 1);
335 TEST (
"abc",
"cd", -1);
336 TEST (
"abc",
"abc", 0);
338 TEST (
"abcd",
"ab", 0);
339 TEST (
"abcd",
"bc", 1);
340 TEST (
"abcd",
"cd", 2);
341 TEST (
"abcd",
"abc", 0);
342 TEST (
"abcd",
"bcd", 1);
343 TEST (
"abcd",
"bce", -1);
345 TEST (
"abcde",
"", 0);
346 TEST (
"abcde",
"a", 0);
347 TEST (
"abcde",
"b", 1);
348 TEST (
"abcde",
"c", 2);
349 TEST (
"abcde",
"d", 3);
350 TEST (
"abcde",
"e", 4);
352 TEST (
"abcde",
"ab", 0);
353 TEST (
"abcde",
"bc", 1);
354 TEST (
"abcde",
"cd", 2);
355 TEST (
"abcde",
"de", 3);
356 TEST (
"abcde",
"ef", -1);
358 TEST (
"abcde",
"abc", 0);
359 TEST (
"abcde",
"bcd", 1);
360 TEST (
"abcde",
"cde", 2);
361 TEST (
"abcde",
"def", -1);
363 TEST (
"abcde",
"abcd", 0);
364 TEST (
"abcde",
"bcde", 1);
365 TEST (
"abcde",
"cdef", -1);
367 TEST (
"abcde",
"abcde", 0);
368 TEST (
"abcde",
"bcdef", -1);
370 TEST (
"abcabfg",
"ab", 0);
371 TEST (
"abcbcfg",
"bc", 1);
372 TEST (
"abcdecd",
"cd", 2);
373 TEST (
"abcdede",
"de", 3);
380template <
class ForwardIterator,
class T,
class Size,
class PredTag>
383 const T* , PredTag pred_tag)
385 const char*
const fname =
"search_n";
386 static const char*
const itname =
type_name (it, (
T*)0);
387 static const char*
const szname =
"Size";
388 static const char*
const tname =
"UserClass";
389 static const char*
const predname =
390 pred_tag.pred_inx ?
"BinaryPredicate" :
"operator <()";
392 const std::size_t nseq = std::strlen (seq);
395 T*
const xseq = T::from_char (seq, nseq);
402 make_iter (xseq + nseq, xseq, xseq + nseq, it);
413 T::n_total_op_eq_ = 0;
414 PredTag::Predicate::funcalls_ = 0;
416 typename PredTag::Predicate pred(0, 0);
427 "std::%s<%s, %s, %s%{?}, %s%{;}> (\"%s\", ..., %d, '%c') "
428 "found subsequence at %td, expected at %{?}end%{:}%zu%{;}",
429 fname, itname, szname, tname, pred_tag.pred_inx, predname,
431 _RWSTD_SIZE_MAX ==
off,
off);
437 const std::size_t max_op_eq = nseq *
cnt;
438 const std::size_t op_called = pred_tag.pred_inx ?
439 PredTag::Predicate::funcalls_
443 "std::%s<%s, %s, %s%{?}, %s%{;}> (\"%s\", ..., %d, '%c') "
444 "called %s %zu times, expected no more than %zu",
445 fname, itname, szname, tname, pred_tag.pred_inx, predname,
446 seq, int (
cnt),
val, predname, op_called, max_op_eq);
451template <
class ForwardIterator,
class T,
class Size,
class PredTag>
453 const Size* , PredTag pred_tag)
455 static const char*
const itname =
type_name (it, (
T*)0);
456 static const char*
const szname =
"Size";
457 static const char*
const tname =
"UserClass";
458 static const char*
const predname =
"EqualityPredicate";
460 if (pred_tag.pred_inx) {
462 "std::search_n (%s, %1$s, %s, const %s&, %s)",
463 itname, szname, tname, predname);
467 "std::search_n (%s, %1$s, %s, const %s&)",
468 itname, szname, tname);
472#define TEST(seq, n, val, off) \
473 test_search_n (__LINE__, seq, Size(n, 0), val, std::size_t (off), \
482 TEST (
"", 0,
'x', 0);
483 TEST (
"", 1,
'x', -1);
484 TEST (
"", 2,
'x', -1);
485 TEST (
"", -1,
'x', -1);
487 TEST (
"A", 0,
'B', 0);
488 TEST (
"A", 0,
'A', 0);
489 TEST (
"A", 1,
'B', -1);
490 TEST (
"A", 1,
'A', 0);
492 TEST (
"AB", 1,
'A', 0);
493 TEST (
"AB", 2,
'A', -1);
494 TEST (
"AB", 1,
'B', 1);
495 TEST (
"AB", 2,
'B', -1);
497 TEST (
"ABC", 0,
'A', 0);
498 TEST (
"ABC", 0,
'B', 0);
499 TEST (
"ABC", 0,
'C', 0);
500 TEST (
"ABC", 0,
'D', 0);
502 TEST (
"ABC", 1,
'A', 0);
503 TEST (
"ABC", 1,
'B', 1);
504 TEST (
"ABC", 1,
'C', 2);
505 TEST (
"ABC", 1,
'D', -1);
507 TEST (
"ABC", 2,
'A', -1);
508 TEST (
"ABC", 2,
'B', -1);
509 TEST (
"ABC", 2,
'C', -1);
510 TEST (
"ABC", 2,
'D', -1);
512 TEST (
"ABC", -1,
'A', -1);
513 TEST (
"ABC", -2,
'B', -1);
514 TEST (
"ABC", -3,
'C', -1);
515 TEST (
"ABC", -4,
'D', -1);
517 TEST (
"ABAD", 1,
'A', 0);
518 TEST (
"ABCB", 1,
'B', 1);
519 TEST (
"ABCC", 1,
'C', 2);
521 TEST (
"ABAACAAAD", 2,
'A', 2);
522 TEST (
"ABCBBDBBB", 2,
'B', 3);
524 TEST (
"ABAACAADE", 3,
'A', -1);
525 TEST (
"ABCBBDBBE", 3,
'B', -1);
526 TEST (
"ABAACAAAD", 3,
'A', 5);
527 TEST (
"ABCBBDBBB", 3,
'B', 6);
540template <
class ForwardIterator,
class T,
class PredTag>
544 rw_note (0, __FILE__, __LINE__,
"ForwardIterator test disabled");
551 rw_note (0, __FILE__, __LINE__,
"BidirectionalIterator test disabled");
558 rw_note (0, __FILE__, __LINE__,
"RandomAccessIterator test disabled");
567template <
class T,
class PredTag>
571 "template <class %s, class %1$s%{?}, class %s%{;}> "
572 "std::search (%1$s, %1$s, %1$s, %1$s%{?}, %3$s%{;})",
573 "ForwardIterator", pred_tag.pred_inx,
"BinaryPredicate",
577 rw_note (0, __FILE__, __LINE__,
"ForwardIterator test disabled");
584 rw_note (0, __FILE__, __LINE__,
"BidirectionalIterator test disabled");
591 rw_note (0, __FILE__, __LINE__,
"RandomAccessIterator test disabled");
600template <
class T,
class Size,
class PredTag>
604 "template <class %s, class %s, class %s%{?}, class %s%{;}> "
605 "std::search_n (%1$s, %1$s, %2$s, %s%{?}, %4$s%{;})",
606 "ForwardIterator",
"Size",
"T",
607 pred_tag.pred_inx,
"BinaryPredicate",
"const T&",
611 rw_note (0, __FILE__, __LINE__,
"ForwardIterator test disabled");
618 rw_note (0, __FILE__, __LINE__,
"BidirectionalIterator test disabled");
625 rw_note (0, __FILE__, __LINE__,
"RandomAccessIterator test disabled");
643 rw_note (0, __FILE__, __LINE__,
"std::search predicate test disabled");
661 rw_note (0, __FILE__, __LINE__,
662 "std::search_n predicate test disabled");
675 rw_note (0, __FILE__, __LINE__,
"std::search test disabled");
682 rw_note (0, __FILE__, __LINE__,
"std::search_n test disabled");
693int main (
int argc,
char *argv[])
695 return rw_test (argc, argv, __FILE__,
700 "|-no-ForwardIterator# "
701 "|-no-BidirectionalIterator# "
702 "|-no-RandomAccessIterator# "
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
#define TEST(seq1, seq2, off)
void test_search_n(int line, const char *seq, Size cnt, const char val, std::size_t off, ForwardIterator it, const T *, PredTag pred_tag)
void test_search(int line, const char *seq1, const char *seq2, std::size_t off, ForwardIterator1 it1, ForwardIterator2 it2, const T *, PredTag pred_tag)
#define _RWSTD_UNUSED(arg)
#define _RWSTD_NAMESPACE(name)
ConvertibleToBool(bool res)
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 *,...)
ConvertibleToBool operator()(const T &x, const U &y)
EqualityPredicate(T *, U *)
static std::size_t funcalls_
bool operator()(const T &, const T &)
static std::size_t funcalls_
EqualityPredicate< T, T > Predicate