2017-11-22 16:49:37 +11:00
|
|
|
#include "../tap.hpp"
|
2017-06-13 16:59:24 +10:00
|
|
|
|
2017-11-22 16:49:37 +11:00
|
|
|
#include "../iterator.hpp"
|
2017-06-13 16:59:24 +10:00
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
#include <array>
|
|
|
|
|
|
|
|
|
2018-10-05 14:55:29 +10:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
2019-03-18 13:52:00 +11:00
|
|
|
static void
|
2018-10-05 14:55:29 +10:00
|
|
|
test_counting_output_iterator (cruft::TAP::logger &tap)
|
|
|
|
{
|
|
|
|
cruft::counting_output_iterator out;
|
|
|
|
*out = 0; ++out;
|
|
|
|
*out = 1; ++out;
|
|
|
|
*out = 2; ++out;
|
|
|
|
|
|
|
|
tap.expect_eq (out.count (), 3u, "counting_output_iterator simple manual assignment");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-03-18 13:52:00 +11:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
static void
|
2018-10-15 17:15:27 +11:00
|
|
|
test_dereference_iterator (cruft::TAP::logger &tap)
|
|
|
|
{
|
|
|
|
int values[4] { 0, 1, 2, 3 };
|
|
|
|
int const* pointers[4] = { values + 0, values + 1, values + 2, values + 3 };
|
|
|
|
|
|
|
|
auto const sum = std::accumulate (
|
|
|
|
cruft::dereference_adapter (std::cbegin (pointers)),
|
|
|
|
cruft::dereference_adapter (std::cend (pointers)),
|
|
|
|
0
|
|
|
|
);
|
|
|
|
|
|
|
|
tap.expect_eq (sum, 6, "dereference_adapter used in accumulate");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-03-18 13:52:00 +11:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
static void
|
|
|
|
test_iota (cruft::TAP::logger &tap)
|
|
|
|
{
|
|
|
|
cruft::iota seq (5);
|
|
|
|
auto const sum = std::accumulate (std::begin (seq), std::end (seq), 0u);
|
|
|
|
tap.expect_eq (sum, 4u+3u+2u+1u+0u, "iota summation %!", sum);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-06-13 16:59:24 +10:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
int
|
|
|
|
main (int, char**)
|
|
|
|
{
|
2018-08-05 14:42:02 +10:00
|
|
|
cruft::TAP::logger tap;
|
2017-06-13 16:59:24 +10:00
|
|
|
|
2018-03-27 15:49:47 +11:00
|
|
|
// test that iteration across disparate types works as expected.
|
|
|
|
//
|
|
|
|
// the char array is an important element because it tends to decay to a
|
|
|
|
// pointer type unless we're paying careful attention.
|
|
|
|
{
|
|
|
|
std::vector<int> v_int { 1, 2, 3 };
|
|
|
|
std::array<float,3> a_float { 1.1f, 2.2f, 3.3f };
|
|
|
|
char c_char[] = { '\0', 'b', 'c' };
|
|
|
|
|
|
|
|
bool success = true;
|
2018-08-05 14:42:02 +10:00
|
|
|
for (auto const &[i, v, a, c]: cruft::izip (v_int, a_float, c_char)) {
|
2018-03-27 15:49:47 +11:00
|
|
|
success = success &&
|
|
|
|
v_int[i] == v &&
|
2018-08-05 14:42:02 +10:00
|
|
|
cruft::equal (a_float[i], a) &&
|
2018-03-27 15:49:47 +11:00
|
|
|
c_char[i] == c;
|
|
|
|
}
|
|
|
|
|
|
|
|
tap.expect (success, "izip containers of int, float, and char and an initialiser_list");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// test that the obvious structured binding syntax gives references to
|
|
|
|
// the underlying values rather than silently supplying lvalues.
|
|
|
|
//
|
|
|
|
// we deliberately do not use any type of references in the range loop so
|
|
|
|
// that we check the syntax a user is likely to employ actually works.
|
|
|
|
// references may not be an obvious consideration.
|
|
|
|
{
|
|
|
|
const std::array<unsigned,3> src { 0, 1, 2 };
|
|
|
|
std::array<unsigned,3> dst { 2, 0, 1 };
|
|
|
|
|
2018-08-05 14:42:02 +10:00
|
|
|
for (auto [a,b]: cruft::zip (src, dst))
|
2018-03-27 15:49:47 +11:00
|
|
|
b = a;
|
|
|
|
|
|
|
|
tap.expect_eq (src, dst, "copy using structured bindings");
|
2017-06-13 16:59:24 +10:00
|
|
|
}
|
|
|
|
|
2018-10-05 14:55:29 +10:00
|
|
|
test_counting_output_iterator (tap);
|
2019-03-18 13:52:00 +11:00
|
|
|
test_dereference_iterator (tap);
|
|
|
|
test_iota (tap);
|
2018-10-05 14:55:29 +10:00
|
|
|
|
2017-06-13 16:59:24 +10:00
|
|
|
return tap.status ();
|
|
|
|
}
|