-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathnumeric.cpp
More file actions
95 lines (78 loc) · 3.58 KB
/
numeric.cpp
File metadata and controls
95 lines (78 loc) · 3.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <stdx/numeric.hpp>
#include <catch2/catch_test_macros.hpp>
#include <array>
#include <functional>
#include <iterator>
TEST_CASE("unary transform_reduce", "[numeric]") {
auto const input = std::array{1, 2, 3, 4};
auto const v =
stdx::transform_reduce(std::cbegin(input), std::cend(input), 0,
std::plus{}, [](auto n) { return n * 2; });
CHECK(v == 20);
}
TEST_CASE("n-ary transform_reduce", "[numeric]") {
auto const input = std::array{1, 2, 3, 4};
auto const v = stdx::transform_reduce(
std::cbegin(input), std::cend(input), 0, std::plus{},
[](auto... ns) { return (0 + ... + ns); }, std::cbegin(input),
std::cbegin(input), std::cbegin(input));
CHECK(v == 40);
}
TEST_CASE("unary transform_reduce_n", "[numeric]") {
auto const input = std::array{1, 2, 3, 4};
auto const v =
stdx::transform_reduce_n(std::cbegin(input), std::size(input), 0,
std::plus{}, [](auto n) { return n * 2; });
CHECK(v == 20);
}
TEST_CASE("n-ary transform_reduce_n", "[numeric]") {
auto const input = std::array{1, 2, 3, 4};
auto const v = stdx::transform_reduce_n(
std::cbegin(input), std::size(input), 0, std::plus{},
[](auto... ns) { return (0 + ... + ns); }, std::cbegin(input),
std::cbegin(input), std::cbegin(input));
CHECK(v == 40);
}
TEST_CASE("transform_reduce with output fixed by template argument",
"[numeric]") {
auto const input = std::array{1.5, 2.5, 3.5, 4.5};
auto v =
stdx::transform_reduce<double>(std::cbegin(input), std::cend(input), 0,
std::plus{}, [](auto n) { return n; });
STATIC_REQUIRE(std::is_same_v<decltype(v), double>);
CHECK(v == 12);
}
TEST_CASE("saturate_cast cppreference example", "[numeric]") {
constexpr std::int16_t x1{696};
constexpr std::int8_t x2 = stdx::saturate_cast<std::int8_t>(x1);
CHECK(x2 == std::numeric_limits<std::int8_t>::max());
constexpr std::uint8_t x3 = stdx::saturate_cast<std::uint8_t>(x1);
CHECK(x3 == std::numeric_limits<std::uint8_t>::max());
constexpr std::int16_t y1{-696};
constexpr std::int8_t y2 = stdx::saturate_cast<std::int8_t>(y1);
CHECK(y2 == std::numeric_limits<std::int8_t>::min());
constexpr std::uint8_t y3 = stdx::saturate_cast<std::uint8_t>(y1);
CHECK(y3 == 0);
}
TEST_CASE("saturate_cast signed large From, small To", "[numeric]") {
STATIC_REQUIRE(stdx::saturate_cast<std::int8_t>(std::int32_t{42}) == 42);
STATIC_REQUIRE(stdx::saturate_cast<std::int8_t>(std::int32_t{1000}) == 127);
STATIC_REQUIRE(stdx::saturate_cast<std::int8_t>(std::int32_t{-200}) ==
-128);
}
TEST_CASE("saturate_cast signed small From, large To", "[numeric]") {
STATIC_REQUIRE(stdx::saturate_cast<std::int32_t>(std::int8_t{42}) == 42);
}
TEST_CASE("saturate_cast unsigned From, signed To", "[numeric]") {
STATIC_REQUIRE(stdx::saturate_cast<std::int8_t>(std::uint8_t{255u}) == 127);
STATIC_REQUIRE(stdx::saturate_cast<std::int8_t>(std::uint8_t{42u}) == 42);
STATIC_REQUIRE(stdx::saturate_cast<std::int8_t>(std::uint8_t{0u}) == 0);
}
TEST_CASE("saturate_cast signed From, unsigned To", "[numeric]") {
STATIC_REQUIRE(stdx::saturate_cast<std::uint8_t>(std::int8_t{-1}) == 0);
STATIC_REQUIRE(stdx::saturate_cast<std::uint8_t>(
std::numeric_limits<std::int8_t>::min()) == 0);
STATIC_REQUIRE(stdx::saturate_cast<std::uint8_t>(
std::numeric_limits<std::int8_t>::max()) ==
std::numeric_limits<std::int8_t>::max());
}