42#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
112 static const char*
name () {
return "Less"; }
115 void operator= (
Less&);
123template <
class T,
class Predicate>
131 const char*
const tname =
"UserClass";
132 const char*
const fname = test_min ?
"min" :
"max";
133 const char*
const funname = Predicate::name();
140 test_min ?
b <
a ? tb.id_ : ta.id_ :
b >
a ? tb.id_ : ta.id_;
142 const char exp_res = test_min ? b < a ? b : a : b >
a ?
b :
a;
146 const T&
res = ppred ?
147 test_min ? std::min (ta, tb, pred) : std::max (ta, tb, pred)
148 : test_min ? std::min (ta, tb) : std::max (ta, tb);
152 "line %d %s <%s%{?}, %s%{;}> (%#c, %#c) returned "
153 "value %#c, id %d; expected value %#c, id %d",
154 __LINE__, fname, tname, 0 != ppred, funname,
a,
b,
155 res.data_.val_,
res.origin_, exp_res, exp_id);
161template <
class T,
class ForwardIterator,
class Predicate>
164 const std::size_t min_off,
165 const std::size_t max_off,
171 const char*
const itname =
type_name (it, (
T*)0);
172 const char*
const fname = test_min ?
"min_element" :
"max_element";
173 const char*
const funname = Predicate::name();
175 const std::size_t
nsrc = std::strlen (src);
177 T*
const xsrc = T::from_char (src,
nsrc);
178 T*
const xsrc_end = xsrc +
nsrc;
185 const std::size_t last_n_op_lt = T::n_total_op_lt_;
191 std::min_element (first,
last, pred)
192 : std::max_element (first,
last, pred);
196 std::min_element (first,
last)
197 : std::max_element (first,
last);
201 const std::size_t
off = test_min ? min_off : max_off;
203 "line %d: %s<%s%{?}, %s%{;}> (\"%s\", %zu, ...) "
204 "got first + %td, expected first + %zu",
205 __LINE__, fname, itname, 0 != ppred, funname, src,
off,
208 const std::size_t n_ops_lt = ppred ?
209 Predicate::funcalls_ : T::n_total_op_lt_ - last_n_op_lt;
212 std::size_t n_exp_ops =
nsrc > 0 ?
nsrc - 1 : 0;
214 "line %d: %s<%s%{?}, %s%{;}> (\"%s\", %zu, ...) "
215 "complexity: got %zu, expected %zu",
216 __LINE__, fname, itname, 0 != ppred, funname, src,
off,
217 n_ops_lt, n_exp_ops);
225template <
class T,
class Predicate>
230 const char*
const tname =
"UserClass";
231 const char*
const fname = test_min ?
"min" :
"max";
232 const char*
const funname = Predicate::name();
235 "const %s& std::%s(const %1$s&, const %1$s&%{?}, %s%{;})",
236 tname, fname, 0 != ppred, funname);
239 test_min_max (__LINE__, a, b, (T*)0, ppred, test_min)
254template <
class T,
class ForwardIterator,
class Predicate>
260 const char*
const itname =
type_name (it, (
T*)0);
261 const char*
const fname = test_min ?
"min_element" :
"max_element";
262 const char*
const funname = Predicate::name();
265 "%s std::%s(%1$s, %1$s%{?}, %s%{;})",
266 itname, fname, 0 != ppred, funname);
268#define TEST(src, min_off, max_off) \
269 test_min_max_element (__LINE__, src, min_off, max_off, it, \
270 (T*)0, ppred, test_min)
278 TEST (
"abcdefghij", 0, 9);
279 TEST (
"bacdefghji", 1, 8);
280 TEST (
"bcadefgjhi", 2, 7);
281 TEST (
"bcdaefjghi", 3, 6);
282 TEST (
"bcdeajfghi", 4, 5);
283 TEST (
"bcdejafghi", 5, 4);
284 TEST (
"bcdjefaghi", 6, 3);
285 TEST (
"bcjdefgahi", 7, 2);
286 TEST (
"bjcdefghai", 8, 1);
287 TEST (
"jbcdefghia", 9, 0);
289 TEST (
"jihgfedcba", 9, 0);
291 TEST (
"aaaaaaaaaa", 0, 0);
292 TEST (
"ababababab", 0, 1);
293 TEST (
"bababababa", 1, 0);
294 TEST (
"aaaaabaaaa", 0, 5);
295 TEST (
"bbbbbabbbb", 5, 0);
313template <
class T,
class Predicate>
323 "template <class %s%{?}, class %s%{;}> "
324 "%1$s std::%s (%1$s, %1$s%{?}, %s%{;})",
325 "ForwardIterator", ppred,
"Compare",
326 test_min ?
"min_element" :
"max_element", ppred,
"Compare");
329 rw_note (0, 0, __LINE__,
"ForwardIterator test disabled");
336 rw_note (0, 0, __LINE__,
"BidirectionalIterator test disabled");
343 rw_note (0, 0, __LINE__,
"RandomAccessIterator test disabled");
352template <
class T,
class Predicate>
357 rw_note (0, 0, __LINE__,
"std::min test disabled");
364 rw_note (0, 0, __LINE__,
"std::max test disabled");
371 rw_note (0, 0, __LINE__,
"std::min_element test disabled");
378 rw_note (0, 0, __LINE__,
"std::max_element test disabled");
392 rw_note (0, 0, __LINE__,
"std.alg.min.max predicate tests disabled");
404int main (
int argc,
char *argv[])
406 return rw_test (argc, argv, __FILE__,
414 "|-no-ForwardIterator# "
415 "|-no-BidirectionalIterator# "
416 "|-no-RandomAccessIterator",
const MyBuffer< char > nsrc[]
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
int rw_opt_no_max_element
int rw_opt_no_min_element
void test_min_max(int line, const char a, const char b, const T *, const Predicate *ppred, bool test_min)
void test_alg_min_max(const T *, const Predicate *ppred)
void test_min_max_element(int line, const char *src, const std::size_t min_off, const std::size_t max_off, const ForwardIterator &it, const T *, const Predicate *ppred, bool test_min)
#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()
conv_to_bool operator()(const T &x, const T &y)
static std::size_t funcalls_
static conv_to_bool make(bool val)