40#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
66 static std::size_t funcalls_;
81 static const char*
name () {
return "Less"; }
84 void operator= (
Less&);
92<
class T,
class InputIterator1,
class InputIterator2,
class Predicate>
97 const InputIterator1 &it1,
98 const InputIterator2 &it2,
102 const char*
const it1name =
type_name (it1, (
T*)0);
103 const char*
const it2name =
type_name (it2, (
T*)0);
104 const char*
const fname =
"includes";
105 const char*
const predname = Predicate::name();
107 const std::size_t nsrc1 = std::strlen (src1);
108 const std::size_t nsrc2 = std::strlen (src2);
110 T*
const xsrc1 = T::from_char (src1, nsrc1);
111 T*
const xsrc2 = T::from_char (src2, nsrc2);
113 T*
const xsrc1_end = xsrc1 + nsrc1;
114 T*
const xsrc2_end = xsrc2 + nsrc2;
116 const InputIterator1 first1 =
make_iter (xsrc1, xsrc1, xsrc1_end, it1);
117 const InputIterator1 last1 =
make_iter (xsrc1_end, xsrc1, xsrc1_end, it1);
118 const InputIterator2 first2 =
make_iter (xsrc2, xsrc2, xsrc2_end, it2);
119 const InputIterator2 last2 =
make_iter (xsrc2_end, xsrc2, xsrc2_end, it2);
123 const std::size_t last_n_op_lt = T::n_total_op_lt_;
125 const bool result = ppred ?
126 std::includes (first1, last1, first2, last2, pred)
127 : std::includes (first1, last1, first2, last2);
131 "line %d: %s<%s, %s%{?}, %s%{;}>(\"%s\", \"%s\", ...) "
133 __LINE__, fname, it1name, it2name, ppred, predname, src1, src2,
136 std::size_t n_ops_lt = ppred ?
137 Predicate::funcalls_ : T::n_total_op_lt_ - last_n_op_lt;
140 std::size_t n_exp_ops = nsrc1 + nsrc2 > 0 ? 2 * (nsrc1 + nsrc2) - 1 : 0;
142 "line %d: %s<%s, %s%{?}, %s%{;}>(\"%s\", \"%s\", ...) "
143 "complexity: got %zu, expected <= %zu",
144 __LINE__, fname, it1name, it2name, ppred, predname, src1, src2,
145 n_ops_lt, n_exp_ops);
155<
class T,
class InputIterator1,
class InputIterator2,
class Predicate>
157 const InputIterator2 &it2,
161 const char*
const it1name =
type_name (it1, (
T*)0);
162 const char*
const it2name =
type_name (it2, (
T*)0);
163 const char*
const fname =
"includes";
164 const char*
const predname = Predicate::name ();
167 "std::%s(%s, %2$s, %s, %3$s%{?}, %s%{;})",
168 fname, it1name, it2name, ppred, predname);
170#define TEST(src1, src2, res) \
171 test_includes (__LINE__, src1, src2, res, it1, it2, (T*)0, ppred)
174 TEST (
"a",
"",
true);
175 TEST (
"",
"a",
false);
177 TEST (
"a",
"a",
true);
178 TEST (
"a",
"b",
false);
179 TEST (
"b",
"a",
false);
181 TEST (
"aa",
"aa",
true);
182 TEST (
"aa",
"ab",
false);
183 TEST (
"ab",
"aa",
false);
184 TEST (
"ab",
"ab",
true);
186 TEST (
"abcdef",
"b",
true);
187 TEST (
"abcdef",
"bd",
true);
188 TEST (
"abcdef",
"i",
false);
189 TEST (
"abcdef",
"ei",
false);
191 TEST (
"abcde",
"abcde",
true);
192 TEST (
"abbde",
"abbde",
true);
193 TEST (
"abcce",
"abcce",
true);
194 TEST (
"abcdd",
"abcdd",
true);
196 TEST (
"ab",
"aaabbbb",
false);
197 TEST (
"ab",
"aaabbbc",
false);
198 TEST (
"aaabbbb",
"ab",
true);
199 TEST (
"aaabbbc",
"ac",
true);
201 TEST (
"a",
"aaaaaaaa",
false);
202 TEST (
"a",
"aaaaaaab",
false);
204 TEST (
"aaaaaaaa",
"aaaaaaaa",
true);
205 TEST (
"aaaaaaab",
"aaaaaaab",
true);
218template <
class T,
class InputIterator1,
class Predicate>
229 rw_note (0, __FILE__, __LINE__,
"InputIterator test disabled");
236 rw_note (0, __FILE__, __LINE__,
"ForwardIterator test disabled");
243 rw_note (0, __FILE__, __LINE__,
"BidirectionalIterator test disabled");
250 rw_note (0, __FILE__, __LINE__,
"RandomAccessIterator test disabled");
259template <
class T,
class Predicate>
269 "template <class %s, class %s%{?}, class %s%{;}> "
270 "bool std::includes (%1$s, %1$s, %2$s, %2$s%{?}, %s%{;})",
271 "InputIterator1",
"InputIterator2", ppred,
"Compare",
275 rw_note (0, __FILE__, __LINE__,
"InputIterator test disabled");
282 rw_note (0, __FILE__, __LINE__,
"ForwardIterator test disabled");
289 rw_note (0, __FILE__, __LINE__,
"BidirectionalIterator test disabled");
296 rw_note (0, __FILE__, __LINE__,
"RandomAccessIterator test disabled");
310 rw_note (0, __FILE__, __LINE__,
311 "std::includes predicate test disabled");
323int main (
int argc,
char *argv[])
325 return rw_test (argc, argv, __FILE__,
330 "|-no-InputIterator# "
331 "|-no-ForwardIterator# "
332 "|-no-BidirectionalIterator# "
333 "|-no-RandomAccessIterator#",
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
void test_includes(int line, const char *src1, const char *src2, const bool res, const InputIterator1 &it1, const InputIterator2 &it2, const T *, const Predicate *ppred)
#define TEST(src1, src2, res)
#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 *,...)
static const char * name()
static conv_to_bool make(bool val)