Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
25.find.first.cpp
Go to the documentation of this file.
1
29#include <algorithm> // for find_first_of
30#include <cstring> // for size_t, strlen()
31
32#include <rw_alg_test.h>
33#include <rw_value.h> // for UserClass
34#include <rw_driver.h> // for rw_test
35
36
39
40#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
41
42template
44find_first_of (FwdIter<eq_comp<base<> > >, FwdIter<eq_comp<base<> > >,
46
47template
49find_first_of (FwdIter<eq_comp<base<> > >, FwdIter<eq_comp<base<> > >,
52
53#endif // _RWSTD_NO_EXPLICIT_INSTANTIATION
54
55} // namespace std
56
57
59template <class T, class U>
61{
62 static std::size_t funcalls_;
63
64 // dummy arguments provided to prevent the class
65 // from being default constructible
66 EqualityPredicate (T* /* dummy */, U* /* dummy */) {
67 funcalls_ = 0;
68 }
69
70 // return a type other than bool but one that is implicitly
71 // convertible to bool to detect incorrect assumptions
72 class ConvertibleToBool {
73 bool result_;
74 public:
75 ConvertibleToBool (bool res): result_ (res) { /* empty */ }
76 operator bool() const { return result_; }
77 };
78
79 ConvertibleToBool operator() (const T &x, const U &y) /* non-const */ {
80 ++funcalls_;
81 return x == y;
82 }
83};
84
85template <class T, class U>
87
88
90// used to initialize an array of objects of type T
91static const char *tinit_begin;
92
93int tinit ()
94{
95 typedef unsigned char UChar;
96
97 return UChar (*tinit_begin++);
98}
99
100
101// exercises std::find_end()
102template <class ForwardIterator1, class ForwardIterator2,
103 class Predicate, class T>
104void do_test (int line, // line number of test case
105 const char *src, // source sequence
106 const char *fseq, // sequence to be found
107 std::size_t resoff, // offset of result
108 ForwardIterator1 &dummy_iter1,
109 ForwardIterator2 &dummy_iter2,
110 const T*,
111 const Predicate *pred)
112{
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==";
116
117 const std::size_t nsrc = std::strlen (src);
118 const std::size_t nfseq = std::strlen (fseq);
119
120 if (std::size_t (-1) == resoff)
121 resoff = nsrc;
122
123 // have the T default ctor initialize objects from `src'
124 tinit_begin = src;
125 T::gen_ = tinit;
126
127 T* const tsrc = new T [nsrc];
128
129 T* const src_begin = tsrc;
130 T* const src_end = tsrc + nsrc;
131
132 // have the T default ctor initialize sequence to be found
133 tinit_begin = fseq;
134
135 T* const tfseq = new T [nfseq];
136
137 T* const fseq_begin = tfseq;
138 T* const fseq_end = tfseq + nfseq;
139
140 // create iterators
141 const ForwardIterator1 first1 =
142 make_iter (src_begin, src_begin, src_end, dummy_iter1);
143
144 const ForwardIterator1 last1 =
145 make_iter (src_end, src_begin, src_end, dummy_iter1);
146
147 const ForwardIterator2 first2 =
148 make_iter (fseq_begin, fseq_begin, fseq_end, dummy_iter2);
149
150 const ForwardIterator2 last2 =
151 make_iter (fseq_end, fseq_begin, fseq_end, dummy_iter2);
152
153 // compute the number of invocations of the operator==()
154 std::size_t last_n_op_assign = T::n_total_op_assign_;
155
156 const Predicate fun((T*)0, (T*)0); // dummy arguments
157
158 const ForwardIterator1 res = pred ?
159 std::find_first_of (first1, last1, first2, last2, fun)
160 : std::find_first_of (first1, last1, first2, last2);
161
162 // silence a bogus EDG eccp remark #550-D:
163 // variable "res" was set but never used
165
166 if (!rw_assert (res.cur_ == first1.cur_ + resoff, 0, line,
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_)) {
171 delete[] tsrc;
172 delete[] tfseq;
173 return;
174 }
175
176 const std::size_t npreds = pred ?
177 fun.funcalls_ : T::n_total_op_assign_ - last_n_op_assign;
178
179 rw_assert (npreds <= nfseq * nsrc, 0, line,
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);
184
185 delete[] tsrc;
186 delete[] tfseq;
187}
188
189
191template <class ForwardIterator1, class ForwardIterator2,
192 class Predicate, class T>
193void run_tests (const ForwardIterator1 &dummy_iter1,
194 const ForwardIterator2 &dummy_iter2,
195 const T*,
196 const Predicate *pred)
197{
198 static const char* const it1name = type_name (dummy_iter1, (T*)0);
199 static const char* const it2name = type_name (dummy_iter2, (T*)0);
200
201 rw_info (0, 0, 0,
202 "%s std::find_first_of (%1$s, %1$s, %s, %2$s%{?}, %s%{;})",
203 it1name, it2name, 0 != pred, "Predicate");
204
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)
208
209 // +------------------ subject sequence
210 // | +--- sequence to be found
211 // | |
212 // | | +-- offset of returned iterator,
213 // | | | -1 denotes the end of sequence
214 // v v v
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);
226
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);
238
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);
249
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);
260
261 TEST ("", "a", -1);
262 TEST ("abcdefghijk", "", -1);
263}
264
265
266
268/* extern */ int rw_opt_no_fwd_iter; // --no-ForwardIterator
269/* extern */ int rw_opt_no_bidir_iter; // --no-BidirectionalIterator
270/* extern */ int rw_opt_no_rnd_iter; // --no-RandomAccessIterator
271/* extern */ int rw_opt_no_predicate; // --no-Predicate
272
273
274template <class ForwardIterator, class Predicate, class T>
275void run_test (const ForwardIterator &dummy, T*, Predicate* pred)
276{
277 if (rw_opt_no_fwd_iter) {
278 rw_note (0, __FILE__, __LINE__, "ForwardIterator test disabled");
279 }
280 else {
281 run_tests (dummy, FwdIter<T>(), (T*)0, pred);
282 }
283
285 rw_note (0, __FILE__, __LINE__, "BidirectionalIterator test disabled");
286 }
287 else {
288 run_tests (dummy, BidirIter<T>(), (T*)0, pred);
289 }
290
291 if (rw_opt_no_rnd_iter) {
292 rw_note (0, __FILE__, __LINE__, "RandomAccessIterator test disabled");
293 }
294 else {
295 run_tests (dummy, RandomAccessIter<T>(), (T*)0, pred);
296 }
297}
298
299
301static void
302run_test (bool test_predicate)
303{
304 rw_info (0, 0, 0,
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");
309
311 const EqPred* const pred = test_predicate ? (EqPred*)1 : (EqPred*)0;
312
313 if (rw_opt_no_fwd_iter) {
314 rw_note (0, __FILE__, __LINE__, "ForwardIterator test disabled");
315 }
316 else {
318 }
319
321 rw_note (0, __FILE__, __LINE__, "BidirectionalIterator test disabled");
322 }
323 else {
325 }
326
327 if (rw_opt_no_rnd_iter) {
328 rw_note (0, __FILE__, __LINE__, "RandomAccessIterator test disabled");
329 }
330 else {
332 }
333}
334
335
337static int
338run_test (int, char*[])
339{
340 run_test (false);
341
343 rw_note (0, __FILE__, __LINE__, "Predicate test disabled");
344 }
345 else {
346 run_test (true);
347 }
348
349 return 0;
350}
351
352
354int main (int argc, char *argv[])
355{
356 return rw_test (argc, argv, __FILE__,
357 "lib.alg.find.first.of",
358 0 /* no comment */, run_test,
359 "|-no-ForwardIterator#"
360 "|-no-BidirectionalIterator#"
361 "|-no-RandomAccessIterator#"
362 "|-no-Predicate#",
367}
#define T
Definition 17.names.cpp:163
#define y
Definition 17.names.cpp:141
#define fun
Definition 17.names.cpp:471
#define line
Definition 17.names.cpp:490
#define res
Definition 17.names.cpp:531
#define x
Definition 17.names.cpp:140
#define Predicate
Definition 17.names.cpp:522
#define ForwardIterator
Definition 17.names.cpp:469
#define U
Definition 17.names.cpp:164
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)
int rw_opt_no_fwd_iter
int rw_opt_no_rnd_iter
#define TEST(src, fnd, off_res)
int rw_opt_no_bidir_iter
int rw_opt_no_predicate
int tinit()
void run_tests(const ForwardIterator1 &dummy_iter1, const ForwardIterator2 &dummy_iter2, const T *, const Predicate *pred)
const char * type_name()
#define main
#define _RWSTD_UNUSED(arg)
Definition _defs.h:972
#define _RWSTD_NAMESPACE(name)
Definition _defs.h:567
Definition json.h:5363
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 *,...)
Definition driver.cpp:1681
_TEST_EXPORT int rw_note(int, const char *, int, const char *,...)
Definition driver.cpp:1664
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)
Definition driver.cpp:1630
unsigned char UChar
Definition collate.cpp:122
#define bool
Definition stdbool.h:24
ConvertibleToBool operator()(const T &x, const U &y)
EqualityPredicate(T *, U *)
static std::size_t funcalls_
static std::size_t funcalls_
Definition 25.find.cpp:62