]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/histogram/test/detail_misc_test.cpp
1 // Copyright 2015-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)
8 #include <boost/core/lightweight_test.hpp>
9 #include <boost/core/lightweight_test_trait.hpp>
10 #include <boost/histogram/accumulators/weighted_sum.hpp>
11 #include <boost/histogram/axis/integer.hpp>
12 #include <boost/histogram/detail/common_type.hpp>
13 #include <boost/histogram/detail/counting_streambuf.hpp>
14 #include <boost/histogram/detail/index_translator.hpp>
15 #include <boost/histogram/detail/nonmember_container_access.hpp>
16 #include <boost/histogram/detail/span.hpp>
17 #include <boost/histogram/detail/sub_array.hpp>
18 #include <boost/histogram/fwd.hpp>
19 #include <boost/histogram/literals.hpp>
20 #include <boost/histogram/storage_adaptor.hpp>
21 #include <boost/histogram/unlimited_storage.hpp>
24 #include "std_ostream.hpp"
25 #include "throw_exception.hpp"
29 template <std::size_t N
>
30 std::ostream
& operator<<(std::ostream
& os
, const multi_index
<N
>& mi
) {
44 template <std::size_t N
, std::size_t M
>
45 bool operator==(const multi_index
<N
>& a
, const multi_index
<M
>& b
) {
46 return std::equal(a
.begin(), a
.end(), b
.begin(), b
.end());
48 } // namespace histogram
51 using namespace boost::histogram
;
52 using namespace boost::histogram::literals
;
53 namespace dtl
= boost::histogram::detail
;
58 BOOST_TEST_TRAIT_SAME(std::integral_constant
<unsigned, 0>, decltype(0_c
));
59 BOOST_TEST_TRAIT_SAME(std::integral_constant
<unsigned, 3>, decltype(3_c
));
60 BOOST_TEST_EQ(decltype(10_c
)::value
, 10);
61 BOOST_TEST_EQ(decltype(213_c
)::value
, 213);
66 BOOST_TEST_TRAIT_SAME(dtl::common_storage
<unlimited_storage
<>, unlimited_storage
<>>,
68 BOOST_TEST_TRAIT_SAME(
69 dtl::common_storage
<dense_storage
<double>, dense_storage
<double>>,
70 dense_storage
<double>);
71 BOOST_TEST_TRAIT_SAME(dtl::common_storage
<dense_storage
<int>, dense_storage
<double>>,
72 dense_storage
<double>);
73 BOOST_TEST_TRAIT_SAME(dtl::common_storage
<dense_storage
<double>, dense_storage
<int>>,
74 dense_storage
<double>);
75 BOOST_TEST_TRAIT_SAME(dtl::common_storage
<dense_storage
<double>, unlimited_storage
<>>,
76 dense_storage
<double>);
77 BOOST_TEST_TRAIT_SAME(dtl::common_storage
<dense_storage
<int>, unlimited_storage
<>>,
79 BOOST_TEST_TRAIT_SAME(dtl::common_storage
<dense_storage
<double>, weight_storage
>,
85 char a
[4] = {1, 2, 3, 4};
86 BOOST_TEST_EQ(dtl::size(a
), 4u);
87 BOOST_TEST_EQ(dtl::data(a
), a
);
89 BOOST_TEST_EQ(dtl::size(b
), 2u);
90 BOOST_TEST_EQ(dtl::data(b
), b
.begin());
92 unsigned size() const { return 3; }
93 int* data() { return buf
; }
94 const int* data() const { return buf
; }
97 BOOST_TEST_EQ(dtl::size(c
), 3u);
98 BOOST_TEST_EQ(dtl::data(c
), c
.buf
);
99 BOOST_TEST_EQ(dtl::data(static_cast<const C
&>(c
)), c
.buf
);
101 int size() const { return 5; }
103 BOOST_TEST_EQ(dtl::size(d
), 5u);
106 // counting_streambuf
108 std::streamsize count
= 0;
109 dtl::counting_streambuf
<char> csb(count
);
110 std::ostream
os(&csb
);
112 BOOST_TEST_EQ(count
, 1);
114 BOOST_TEST_EQ(count
, 3);
116 BOOST_TEST_EQ(count
, 6);
119 std::streamsize count
= 0;
120 auto g
= dtl::make_count_guard(std::cout
, count
);
122 BOOST_TEST_EQ(count
, 1);
124 BOOST_TEST_EQ(count
, 3);
126 BOOST_TEST_EQ(count
, 6);
129 // sub_array and span
131 dtl::sub_array
<int, 2> a(2, 1);
133 auto sp
= dtl::span
<int>(a
);
134 BOOST_TEST_EQ(sp
.size(), 2);
135 BOOST_TEST_EQ(sp
.front(), 1);
136 BOOST_TEST_EQ(sp
.back(), 2);
139 auto csp
= dtl::span
<const int>(ca
);
140 BOOST_TEST_EQ(csp
.size(), 2);
141 BOOST_TEST_EQ(csp
.front(), 1);
142 BOOST_TEST_EQ(csp
.back(), 2);
147 using I
= axis::integer
<>;
150 auto t
= std::vector
<I
>{I
{0, 1}, I
{1, 3}};
151 auto tr
= dtl::make_index_translator(t
, t
);
152 multi_index
<static_cast<std::size_t>(-1)> mi
{0, 1};
153 BOOST_TEST_EQ(tr(mi
), mi
);
154 multi_index
<2> mi2
{0, 1};
155 BOOST_TEST_EQ(tr(mi2
), mi
);
159 auto t
= std::make_tuple(I
{0, 1});
160 auto tr
= dtl::make_index_translator(t
, t
);
161 multi_index
<static_cast<std::size_t>(-1)> mi
{0};
162 BOOST_TEST_EQ(tr(mi
), mi
);
165 BOOST_TEST_THROWS(multi_index
<1>::create(2), std::invalid_argument
);
168 return boost::report_errors();