41#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
61static const char *tinit_begin;
65 typedef unsigned char UChar;
67 return UChar (*tinit_begin++);
72template <
class ForwardIterator1,
class ForwardIterator2,
class T>
77 ForwardIterator1 &dummy_iter1,
78 ForwardIterator2 &dummy_iter2,
82 static const char*
const it1name =
type_name (dummy_iter1, (
T*)0);
83 static const char*
const it2name =
type_name (dummy_iter2, (
T*)0);
85 const std::size_t
nsrc = std::strlen (src);
86 const std::size_t nfseq = std::strlen (fseq);
88 if (std::size_t (-1) == resoff)
95 T*
const tsrc =
new T [
nsrc];
97 T*
const src_begin = tsrc;
98 T*
const src_end = tsrc +
nsrc;
103 T*
const tfseq =
new T [nfseq];
105 T*
const fseq_begin = tfseq;
106 T*
const fseq_end = tfseq + nfseq;
109 const ForwardIterator1 first1 =
110 make_iter (src_begin, src_begin, src_end, dummy_iter1);
112 const ForwardIterator1 last1 =
113 make_iter (src_end, src_begin, src_end, dummy_iter1);
115 const ForwardIterator2 first2 =
116 make_iter (fseq_begin, fseq_begin, fseq_end, dummy_iter2);
118 const ForwardIterator2 last2 =
119 make_iter (fseq_end, fseq_begin, fseq_end, dummy_iter2);
122 std::size_t last_n_op_assign = T::n_total_op_assign_;
125 std::find_end (first1, last1, first2, last2, std::equal_to<T>())
126 : std::find_end (first1, last1, first2, last2);
132 bool success =
res.cur_ == first1.cur_ + resoff;
134 "line %d: find_end<%s, %s>(it = \"%s\", \"%s\")"
135 " == (it + %zu), got (it + %td)",
136 __LINE__, it1name, it2name, src, fseq,
137 resoff,
res.cur_ - first1.cur_);
145 if (
res.cur_ != last1.cur_) {
147 for ( ;
j < nfseq; ++
j) {
148 success = (
res.cur_ +
j)->data_.val_ == fseq[
j];
154 "line %d: find_end<%s, %s>(it = \"%s\", \"%s\")"
155 " expected value %c got %c at %zu position",
156 __LINE__, it1name, it2name, src, fseq,
157 fseq[
j], (
res.cur_ +
j)->data_.val_,
j);
167 T::n_total_op_assign_ - last_n_op_assign <= nfseq * (
nsrc - nfseq + 1);
169 "line %d: find_end<%s, %s>(it = \"%s\", \"%s\")"
170 " %s invoked %zu times, expected no more than %td",
171 __LINE__, it1name, it2name, src, fseq,
173 T::n_total_op_eq_, nfseq * (
nsrc - nfseq + 1));
181template <
class ForwardIterator1,
class ForwardIterator2,
class T>
183 const ForwardIterator2& dummy_iter2,
186 static const char*
const it1name =
type_name (dummy_iter1, (
T*)0);
187 static const char*
const it2name =
type_name (dummy_iter2, (
T*)0);
189 rw_info (0, 0, 0,
"%s std::find_end (%1$s, %1$s, %s, %2$s%{?}, %s%{;})",
192#define TEST(src, fnd, off_res) \
193 do_test (__LINE__, src, fnd, std::size_t (off_res), \
194 dummy_iter1, dummy_iter2, (UserClass*)0, predicate)
202 TEST (
"abcdefghijk",
"ab", 0);
203 TEST (
"abcdefghijk",
"bc", 1);
204 TEST (
"abcdefghijk",
"cd", 2);
205 TEST (
"abcdefghijk",
"de", 3);
206 TEST (
"abcdefghijk",
"ef", 4);
207 TEST (
"abcdefghijk",
"fg", 5);
208 TEST (
"abcdefghijk",
"gh", 6);
209 TEST (
"abcdefghijk",
"hi", 7);
210 TEST (
"abcdefghijk",
"ij", 8);
211 TEST (
"abcdefghijk",
"jk", 9);
213 TEST (
"ababcdefghij",
"ab", 2);
214 TEST (
"abcbcdefghij",
"bc", 3);
215 TEST (
"abcdcdefghij",
"cd", 4);
216 TEST (
"abcdedefghij",
"de", 5);
217 TEST (
"abcdefefghij",
"ef", 6);
218 TEST (
"abcdefgfghij",
"fg", 7);
219 TEST (
"abcdefghghij",
"gh", 8);
220 TEST (
"abcdefghihij",
"hi", 9);
221 TEST (
"bcdefghijijk",
"ij", 9);
222 TEST (
"bcdefghijkjk",
"jk", 10);
225 TEST (
"a",
"ab", -1);
226 TEST (
"ab",
"abc", -1);
227 TEST (
"abc",
"abcd", -1);
228 TEST (
"abcd",
"abcde", -1);
229 TEST (
"abcde",
"abcdef", -1);
230 TEST (
"abcdef",
"abcdefg", -1);
231 TEST (
"abcdefg",
"abcdefgh", -1);
233 TEST (
"abcdefghijk",
"ba", -1);
234 TEST (
"abcdefghijk",
"cb", -1);
235 TEST (
"abcdefghijk",
"dc", -1);
236 TEST (
"abcdefghijk",
"ed", -1);
237 TEST (
"abcdefghijk",
"fe", -1);
238 TEST (
"abcdefghijk",
"gf", -1);
239 TEST (
"abcdefghijk",
"hg", -1);
240 TEST (
"abcdefghijk",
"ih", -1);
241 TEST (
"abcdefghijk",
"ji", -1);
252template <
class ForwardIterator,
class T>
257 rw_note (0, __FILE__, __LINE__,
"ForwardIterator test disabled");
264 rw_note (0, __FILE__, __LINE__,
"BidirectionalIterator test disabled");
271 rw_note (0, __FILE__, __LINE__,
"RandomAccessIterator test disabled");
284 "template <class %s, class %s> "
285 "%1$s std::find_end (%1$s, %1$s, %2$s, %2$s%{?}, %s%{;})",
286 "ForwardIterator1",
"ForwardIterator2",
290 rw_note (0, __FILE__, __LINE__,
"ForwardIterator test disabled");
297 rw_note (0, __FILE__, __LINE__,
"BidirectionalIterator test disabled");
304 rw_note (0, __FILE__, __LINE__,
"RandomAccessIterator test disabled");
315run_test (
int,
char*[])
320 rw_note (0, __FILE__, __LINE__,
"Predicate test disabled");
323 test_find_end (
"std::equal_to<UserClass>");
331int main (
int argc,
char *argv[])
333 return rw_test (argc, argv, __FILE__,
336 "|-no-ForwardIterator#"
337 "|-no-BidirectionalIterator#"
338 "|-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_find_end(const ForwardIterator &dummy, T *, const char *predicate)
#define TEST(src, fnd, off_res)
void run_tests(const ForwardIterator1 &dummy_iter1, const ForwardIterator2 &dummy_iter2, const T *, const char *predicate)
#define _RWSTD_UNUSED(arg)
#define _RWSTD_NAMESPACE(name)
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 *,...)