1 // Copyright 2018-2019 Hans Dembinski
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt
5 // or copy at http://www.boost.org/LICENSE_1_0.txt)
7 #include <boost/core/lightweight_test.hpp>
8 #include <boost/histogram/detail/large_int.hpp>
12 #include "std_ostream.hpp"
17 template <class Allocator>
18 std::ostream& operator<<(std::ostream& os, const large_int<Allocator>& x) {
19 os << "large_int" << x.data;
23 } // namespace histogram
26 using namespace boost::histogram;
28 using large_int = detail::large_int<std::allocator<std::uint64_t>>;
30 template <class... Ts>
31 auto make_large_int(Ts... ts) {
33 r.data = {static_cast<uint64_t>(ts)...};
41 BOOST_TEST_EQ(detail::safe_increment(c), true);
44 BOOST_TEST_EQ(detail::safe_increment(c), false);
45 BOOST_TEST_EQ(c, 255);
47 BOOST_TEST_EQ(detail::safe_radd(c, 255u), true);
48 BOOST_TEST_EQ(c, 255);
50 BOOST_TEST_EQ(detail::safe_radd(c, 255u), false);
53 BOOST_TEST_EQ(detail::safe_radd(c, 1u), false);
54 BOOST_TEST_EQ(c, 255);
57 const auto vmax = (std::numeric_limits<std::uint64_t>::max)();
63 BOOST_TEST_EQ(b.data.front(), 42);
64 large_int c(std::move(b));
65 BOOST_TEST_EQ(c.data.front(), 42);
68 BOOST_TEST_EQ(d.data.front(), 42);
70 BOOST_TEST_EQ(e.data.front(), 42);
75 BOOST_TEST_EQ(large_int(), 0u);
76 BOOST_TEST_EQ(large_int(1u), 1u);
77 BOOST_TEST_EQ(large_int(1u), 1.0);
78 BOOST_TEST_EQ(large_int(1u), large_int(1u));
79 BOOST_TEST_NE(large_int(1u), 2u);
80 BOOST_TEST_NE(large_int(1u), 2.0);
81 BOOST_TEST_NE(large_int(1u), 2.0f);
82 BOOST_TEST_NE(large_int(1u), large_int(2u));
83 BOOST_TEST_LT(large_int(1u), 2u);
84 BOOST_TEST_LT(large_int(1u), 2.0);
85 BOOST_TEST_LT(large_int(1u), 2.0f);
86 BOOST_TEST_LT(large_int(1u), large_int(2u));
87 BOOST_TEST_LE(large_int(1u), 2u);
88 BOOST_TEST_LE(large_int(1u), 2.0);
89 BOOST_TEST_LE(large_int(1u), 2.0f);
90 BOOST_TEST_LE(large_int(1u), large_int(2u));
91 BOOST_TEST_LE(large_int(1u), 1u);
92 BOOST_TEST_GT(large_int(1u), 0u);
93 BOOST_TEST_GT(large_int(1u), 0.0);
94 BOOST_TEST_GT(large_int(1u), 0.0f);
95 BOOST_TEST_GT(large_int(1u), large_int(0u));
96 BOOST_TEST_GE(large_int(1u), 0u);
97 BOOST_TEST_GE(large_int(1u), 0.0);
98 BOOST_TEST_GE(large_int(1u), 0.0f);
99 BOOST_TEST_GE(large_int(1u), 1u);
100 BOOST_TEST_GE(large_int(1u), large_int(0u));
101 BOOST_TEST_NOT(large_int(1u) < large_int(1u));
102 BOOST_TEST_NOT(large_int(1u) > large_int(1u));
104 BOOST_TEST_GT(1, large_int());
105 BOOST_TEST_LT(-1, large_int());
106 BOOST_TEST_GE(1, large_int());
107 BOOST_TEST_LE(-1, large_int());
108 BOOST_TEST_NE(1, large_int());
110 constexpr auto nan = std::numeric_limits<double>::quiet_NaN();
111 BOOST_TEST_NOT(large_int(1u) < nan);
112 BOOST_TEST_NOT(large_int(1u) > nan);
113 BOOST_TEST_NOT(large_int(1u) == nan);
114 BOOST_TEST(large_int(1u) != nan); // same behavior as int compared to nan
115 BOOST_TEST_NOT(large_int(1u) <= nan);
116 BOOST_TEST_NOT(large_int(1u) >= nan);
118 BOOST_TEST_NOT(nan < large_int(1u));
119 BOOST_TEST_NOT(nan > large_int(1u));
120 BOOST_TEST_NOT(nan == large_int(1u));
121 BOOST_TEST(nan != large_int(1u)); // same behavior as int compared to nan
122 BOOST_TEST_NOT(nan <= large_int(1u));
123 BOOST_TEST_NOT(nan >= large_int(1u));
128 auto a = large_int();
130 BOOST_TEST_EQ(a.data.size(), 1);
131 BOOST_TEST_EQ(a.data[0], 1);
133 BOOST_TEST_EQ(a.data[0], 2);
135 BOOST_TEST_EQ(a, vmax);
136 BOOST_TEST_EQ(a, static_cast<double>(vmax));
138 BOOST_TEST_EQ(a, make_large_int(0, 1));
140 BOOST_TEST_EQ(a, make_large_int(1, 1));
142 BOOST_TEST_EQ(a, make_large_int(2, 2));
143 BOOST_TEST_EQ(a, 2 * static_cast<double>(vmax) + 2);
149 BOOST_TEST_EQ(a, make_large_int(0, 2));
154 BOOST_TEST_EQ(a, make_large_int(0, 2));
158 a += make_large_int(1, 1);
159 BOOST_TEST_EQ(a, make_large_int(0, 3));
161 a.data[0] = vmax - 1;
164 BOOST_TEST_EQ(a, make_large_int(vmax, vmax));
168 BOOST_TEST_EQ(a, make_large_int(0, 0, 1));
170 a = make_large_int(vmax, vmax);
172 BOOST_TEST_EQ(a, make_large_int(0, 0, 1));
174 a = make_large_int(vmax, vmax);
176 BOOST_TEST_EQ(a, make_large_int(0, 0, 1));
179 a = make_large_int(vmax, vmax);
181 BOOST_TEST_EQ(a, make_large_int(vmax - 1, vmax, 1));
183 // add smaller to larger
184 a = make_large_int(1, 1, 1);
185 a += make_large_int(1, 1);
186 BOOST_TEST_EQ(a, make_large_int(2, 2, 1));
188 // add larger to smaller
189 a = make_large_int(1, 1);
190 a += make_large_int(1, 1, 1);
191 BOOST_TEST_EQ(a, make_large_int(2, 2, 1));
196 for (unsigned i = 0; i < 80; ++i) {
202 BOOST_TEST_GT(a.data.size(), 1u);
205 return boost::report_errors();