40#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
59template <
class T,
class U>
72 class ConvertibleToBool {
76 operator bool()
const {
return result_; }
85template <
class T,
class U>
91static const char *tinit_begin;
95 typedef unsigned char UChar;
97 return UChar (*tinit_begin++);
102template <
class ForwardIterator1,
class ForwardIterator2,
108 ForwardIterator1 &dummy_iter1,
109 ForwardIterator2 &dummy_iter2,
113 static const char*
const it1name =
type_name (dummy_iter1, (
T*)0);
114 static const char*
const it2name =
type_name (dummy_iter2, (
T*)0);
115 static const char*
const pname = pred ?
"Predicate" :
"operator==";
117 const std::size_t
nsrc = std::strlen (src);
118 const std::size_t nfseq = std::strlen (fseq);
120 if (std::size_t (-1) == resoff)
127 T*
const tsrc =
new T [
nsrc];
129 T*
const src_begin = tsrc;
130 T*
const src_end = tsrc +
nsrc;
135 T*
const tfseq =
new T [nfseq];
137 T*
const fseq_begin = tfseq;
138 T*
const fseq_end = tfseq + nfseq;
141 const ForwardIterator1 first1 =
142 make_iter (src_begin, src_begin, src_end, dummy_iter1);
144 const ForwardIterator1 last1 =
145 make_iter (src_end, src_begin, src_end, dummy_iter1);
147 const ForwardIterator2 first2 =
148 make_iter (fseq_begin, fseq_begin, fseq_end, dummy_iter2);
150 const ForwardIterator2 last2 =
151 make_iter (fseq_end, fseq_begin, fseq_end, dummy_iter2);
154 std::size_t last_n_op_assign = T::n_total_op_assign_;
158 const ForwardIterator1
res = pred ?
159 std::find_first_of (first1, last1, first2, last2,
fun)
160 : std::find_first_of (first1, last1, first2, last2);
167 "line %d: find_first_of<%s, %s>(it = \"%s\", \"%s\")"
168 " == (it + %zu), got (it + %td)",
169 __LINE__, it1name, it2name, src, fseq,
170 resoff,
res.cur_ - first1.cur_)) {
176 const std::size_t npreds = pred ?
177 fun.
funcalls_ : T::n_total_op_assign_ - last_n_op_assign;
180 "line %d: find_first_of<%s, %s>(it = \"%s\", \"%s\")"
181 "%s invoked %zu times, expected no more than %td",
182 __LINE__, it1name, it2name, src, fseq, pname,
183 npreds, nfseq *
nsrc);
191template <
class ForwardIterator1,
class ForwardIterator2,
194 const ForwardIterator2 &dummy_iter2,
198 static const char*
const it1name =
type_name (dummy_iter1, (
T*)0);
199 static const char*
const it2name =
type_name (dummy_iter2, (
T*)0);
202 "%s std::find_first_of (%1$s, %1$s, %s, %2$s%{?}, %s%{;})",
203 it1name, it2name, 0 != pred,
"Predicate");
205#define TEST(src, fnd, off_res) \
206 do_test (__LINE__, src, fnd, std::size_t (off_res), \
207 dummy_iter1, dummy_iter2, (UserClass*)0, pred)
215 TEST (
"abcdefghijk",
"a", 0);
216 TEST (
"abcdefghijk",
"b", 1);
217 TEST (
"abcdefghijk",
"c", 2);
218 TEST (
"abcdefghijk",
"d", 3);
219 TEST (
"abcdefghijk",
"e", 4);
220 TEST (
"abcdefghijk",
"f", 5);
221 TEST (
"abcdefghijk",
"g", 6);
222 TEST (
"abcdefghijk",
"h", 7);
223 TEST (
"abcdefghijk",
"i", 8);
224 TEST (
"abcdefghijk",
"j", 9);
225 TEST (
"abcdefghijk",
"k", 10);
227 TEST (
"aabcdefghijk",
"a", 0);
228 TEST (
"abbcdefghijk",
"b", 1);
229 TEST (
"abccdefghijk",
"c", 2);
230 TEST (
"abcddefghijk",
"d", 3);
231 TEST (
"abcdeefghijk",
"e", 4);
232 TEST (
"abcdeffghijk",
"f", 5);
233 TEST (
"abcdefgghijk",
"g", 6);
234 TEST (
"abcdefghhijk",
"h", 7);
235 TEST (
"abcdefghijjk",
"i", 8);
236 TEST (
"abcdefghijjk",
"j", 9);
237 TEST (
"abcdefghijkk",
"k", 10);
239 TEST (
"bbcdefghijk",
"ab", 0);
240 TEST (
"accdefghijk",
"bc", 1);
241 TEST (
"abddefghijk",
"cd", 2);
242 TEST (
"abceefghijk",
"de", 3);
243 TEST (
"abcdffghijk",
"ef", 4);
244 TEST (
"abcdegghijk",
"fg", 5);
245 TEST (
"abcdefhhijk",
"gh", 6);
246 TEST (
"abcdefgiijk",
"hi", 7);
247 TEST (
"abcdefghjjk",
"ij", 8);
248 TEST (
"abcdefghikk",
"jk", 9);
250 TEST (
"bbcdefghijk",
"a", -1);
251 TEST (
"accdefghijk",
"b", -1);
252 TEST (
"abddefghijk",
"c", -1);
253 TEST (
"abceefghijk",
"d", -1);
254 TEST (
"abcdffghijk",
"e", -1);
255 TEST (
"abcdegghijk",
"f", -1);
256 TEST (
"abcdefhhijk",
"g", -1);
257 TEST (
"abcdefgiijk",
"h", -1);
258 TEST (
"abcdefghjjk",
"i", -1);
259 TEST (
"abcdefghikk",
"j", -1);
262 TEST (
"abcdefghijk",
"", -1);
274template <
class ForwardIterator,
class Predicate,
class T>
278 rw_note (0, __FILE__, __LINE__,
"ForwardIterator test disabled");
285 rw_note (0, __FILE__, __LINE__,
"BidirectionalIterator test disabled");
292 rw_note (0, __FILE__, __LINE__,
"RandomAccessIterator test disabled");
305 "template <class %s, class %s> "
306 "%1$s std::find_first_of (%1$s, %1$s, %2$s, %2$s%{?}, %s%{;})",
307 "ForwardIterator1",
"ForwardIterator2",
308 0 != test_predicate,
"Predicate");
311 const EqPred*
const pred = test_predicate ? (EqPred*)1 : (EqPred*)0;
314 rw_note (0, __FILE__, __LINE__,
"ForwardIterator test disabled");
321 rw_note (0, __FILE__, __LINE__,
"BidirectionalIterator test disabled");
328 rw_note (0, __FILE__, __LINE__,
"RandomAccessIterator test disabled");
343 rw_note (0, __FILE__, __LINE__,
"Predicate test disabled");
354int main (
int argc,
char *argv[])
356 return rw_test (argc, argv, __FILE__,
357 "lib.alg.find.first.of",
359 "|-no-ForwardIterator#"
360 "|-no-BidirectionalIterator#"
361 "|-no-RandomAccessIterator#"
const MyBuffer< char > nsrc[]
void do_test(int line, const char *src, std::size_t resoff, ForwardIterator dummy_iter, const T *, const char *predname)
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
#define TEST(src, fnd, off_res)
void run_tests(const ForwardIterator1 &dummy_iter1, const ForwardIterator2 &dummy_iter2, const T *, const Predicate *pred)
#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_
static std::size_t funcalls_