58#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
103 void operator!()
const;
125 res.data_.val_ -=
y.data_.val_;
150template <
class InputIterator,
class OutputIterator>
168 std::adjacent_difference (first,
last,
result, *op)
169 : std::adjacent_difference (first,
last,
result);
187 const char*
const itname = alg.
iter_names [0];
188 const char*
const outname = alg.
iter_names [1];
189 const char*
const opname =
"Minus";
192 "std::adjacent_difference(%s, %1$s, %s%{?}, %s%{;})%{?}, %s%{;}",
193 itname, outname, binop, opname, same_seq,
"first == result");
200 static const int cwidth =
sizeof (*src);
202 for (std::size_t
i = 0;
i !=
N; ++
i) {
207 std::size_t last_n_op_minus_assign =
211 const Accumulator*
const pbinop = binop ? &acc : 0;
213 std::size_t
k = 0 <
i ?
i - 1 : 0;
214 int*
const tmp_val =
new int [
i + 1];
217 tmp_val [
k] = src [
k].data_.val_ - src [
k - 1].
data_.
val_;
224 const std::size_t minus_ops = binop ?
229 bool success =
res == dst_end;
231 "adjacent_difference <%s, %s%{?}, %s%{;}>"
232 "({%{X=+*}}, ...) == result + %td, got result + %td",
233 itname, outname, binop, opname,
234 cwidth,
int (
i), src, dst_end - dst,
res - dst);
236 for (
k = 0;
k <
i;
k++) {
245 k =
k <
i ?
k :
i - 1;
248 "adjacent_difference <%s, %s%{?}, %s%{;}>"
249 "({%{X=+*}}, ...) ==> {%{X=+*.*}}, expected %d",
250 itname, outname, binop, opname,
251 cwidth,
int (
i), src,
int (
i),
int (
k), dst, tmp_val [
k]);
260 const std::size_t exp_minus_ops = 0 <
i ?
i - 1 : 0;
261 success = minus_ops == exp_minus_ops;
263 "adjacent_difference <%s, %s%{?}, %s%{;}>"
264 "({%{X=+*}}, ...) complexity: got %zu invocations "
265 "of %s, expected %zu",
266 itname, outname, binop, opname,
267 cwidth,
int (
i), src, minus_ops,
268 binop ?
"BinaryMinus" :
"operator-", exp_minus_ops);
292template <
class InputIterator,
class OutputIterator>
308template <
class InputIterator>
333 "template <class %s, class %s%{?}, class %s%{;}> "
334 "%2$s adjacent_difference (%1$s, %1$s, %2$s%{?}, %s%{;})",
335 "InputIterator",
"OutputIterator", binop,
"BinaryOperation",
336 binop,
"BinaryOperation");
339 rw_note (0, 0, 0,
"OutputIterator test disabled");
342 rw_note (0, 0, 0,
"InputIterator test disabled");
347 rw_note (0, 0, 0,
"ForwardIterator test disabled");
353 rw_note (0, 0, 0,
"BidirectionalIterator test disabled");
359 rw_note (0, 0, 0,
"RandomAccessIterator test disabled");
376 "adjacent_difference with binary operation test disabled");
385int main (
int argc,
char *argv[])
387 return rw_test (argc, argv, __FILE__,
388 "lib.adjacent.difference",
392 "|-no-InputIterator# "
393 "|-no-OutputIterator# "
394 "|-no-ForwardIterator# "
395 "|-no-BidirectionalIterator# "
396 "|-no-RandomAccessIterator#",
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
const minus< T > & operator-(const minus< T > &lhs, const minus< T > &rhs)
void test_adjacent_difference(const std::size_t N, const AdjacentDiffBase &alg, bool binop, bool same_seq)
void gen_adjacent_difference_test(const std::size_t N, const InputIterator &, const OutputIterator &, bool binop)
int rw_opt_no_output_iter
#define _RWSTD_UNUSED(arg)
#define _RWSTD_NAMESPACE(name)
_TEST_EXPORT int gen_seq()
_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 *,...)
conv_to_T< Y > operator()(const Y &x, const Y &y)
static std::size_t funcalls_
virtual ~AdjacentDiffBase()
virtual UserClass * adjacent_difference(const UserClass *xsrc, const UserClass *xsrc_end, UserClass *xdst, const UserClass *xdst_end, const Accumulator *op) const =0
const char * iter_names[2]
virtual UserClass * adjacent_difference(const UserClass *xsrc, const UserClass *xsrc_end, UserClass *xdst, const UserClass *xdst_end, const Accumulator *op) const
static _RWSTD_SIZE_T n_total_op_minus_assign_
static conv_to_T make(T val)