]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/endian/test/buffer_test.cpp
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / boost / libs / endian / test / buffer_test.cpp
1 // buffer_test.cpp -------------------------------------------------------------------//
2
3 // Copyright Beman Dawes 2014
4
5 // Distributed under the Boost Software License, Version 1.0.
6 // See http://www.boost.org/LICENSE_1_0.txt
7
8 // See library home page at http://www.boost.org/libs/endian
9
10 //--------------------------------------------------------------------------------------//
11
12 #include <boost/endian/detail/disable_warnings.hpp>
13
14 //#define BOOST_ENDIAN_LOG
15 #include <boost/endian/buffers.hpp>
16 #include <boost/detail/lightweight_main.hpp>
17 #include <boost/core/lightweight_test.hpp>
18 #include <boost/cstdint.hpp>
19 #include <iostream>
20 #include <sstream>
21 #include <limits>
22
23 using namespace boost::endian;
24 using std::cout;
25 using std::endl;
26
27 namespace
28 {
29
30 // check_size ------------------------------------------------------------//
31
32 void check_size()
33 {
34
35 BOOST_TEST_EQ(sizeof(big_int8_buf_t), 1u);
36 BOOST_TEST_EQ(sizeof(big_int16_buf_t), 2u);
37 BOOST_TEST_EQ(sizeof(big_int24_buf_t), 3u);
38 BOOST_TEST_EQ(sizeof(big_int32_buf_t), 4u);
39 BOOST_TEST_EQ(sizeof(big_int40_buf_t), 5u);
40 BOOST_TEST_EQ(sizeof(big_int48_buf_t), 6u);
41 BOOST_TEST_EQ(sizeof(big_int56_buf_t), 7u);
42 BOOST_TEST_EQ(sizeof(big_int64_buf_t), 8u);
43
44 BOOST_TEST_EQ(sizeof(big_uint8_buf_t), 1u);
45 BOOST_TEST_EQ(sizeof(big_uint16_buf_t), 2u);
46 BOOST_TEST_EQ(sizeof(big_uint24_buf_t), 3u);
47 BOOST_TEST_EQ(sizeof(big_uint32_buf_t), 4u);
48 BOOST_TEST_EQ(sizeof(big_uint40_buf_t), 5u);
49 BOOST_TEST_EQ(sizeof(big_uint48_buf_t), 6u);
50 BOOST_TEST_EQ(sizeof(big_uint56_buf_t), 7u);
51 BOOST_TEST_EQ(sizeof(big_uint64_buf_t), 8u);
52
53 BOOST_TEST_EQ(sizeof(little_int8_buf_t), 1u);
54 BOOST_TEST_EQ(sizeof(little_int16_buf_t), 2u);
55 BOOST_TEST_EQ(sizeof(little_int24_buf_t), 3u);
56 BOOST_TEST_EQ(sizeof(little_int32_buf_t), 4u);
57 BOOST_TEST_EQ(sizeof(little_int40_buf_t), 5u);
58 BOOST_TEST_EQ(sizeof(little_int48_buf_t), 6u);
59 BOOST_TEST_EQ(sizeof(little_int56_buf_t), 7u);
60 BOOST_TEST_EQ(sizeof(little_int64_buf_t), 8u);
61
62 BOOST_TEST_EQ(sizeof(little_uint8_buf_t), 1u);
63 BOOST_TEST_EQ(sizeof(little_uint16_buf_t), 2u);
64 BOOST_TEST_EQ(sizeof(little_uint24_buf_t), 3u);
65 BOOST_TEST_EQ(sizeof(little_uint32_buf_t), 4u);
66 BOOST_TEST_EQ(sizeof(little_uint40_buf_t), 5u);
67 BOOST_TEST_EQ(sizeof(little_uint48_buf_t), 6u);
68 BOOST_TEST_EQ(sizeof(little_uint56_buf_t), 7u);
69 BOOST_TEST_EQ(sizeof(little_uint64_buf_t), 8u);
70
71 BOOST_TEST_EQ(sizeof(native_int8_buf_t), 1u);
72 BOOST_TEST_EQ(sizeof(native_int16_buf_t), 2u);
73 BOOST_TEST_EQ(sizeof(native_int24_buf_t), 3u);
74 BOOST_TEST_EQ(sizeof(native_int32_buf_t), 4u);
75 BOOST_TEST_EQ(sizeof(native_int40_buf_t), 5u);
76 BOOST_TEST_EQ(sizeof(native_int48_buf_t), 6u);
77 BOOST_TEST_EQ(sizeof(native_int56_buf_t), 7u);
78 BOOST_TEST_EQ(sizeof(native_int64_buf_t), 8u);
79
80 BOOST_TEST_EQ(sizeof(native_uint8_buf_t), 1u);
81 BOOST_TEST_EQ(sizeof(native_uint16_buf_t), 2u);
82 BOOST_TEST_EQ(sizeof(native_uint24_buf_t), 3u);
83 BOOST_TEST_EQ(sizeof(native_uint32_buf_t), 4u);
84 BOOST_TEST_EQ(sizeof(native_uint40_buf_t), 5u);
85 BOOST_TEST_EQ(sizeof(native_uint48_buf_t), 6u);
86 BOOST_TEST_EQ(sizeof(native_uint56_buf_t), 7u);
87 BOOST_TEST_EQ(sizeof(native_uint64_buf_t), 8u);
88
89 BOOST_TEST_EQ(sizeof(big_int8_buf_at), 1u);
90 BOOST_TEST_EQ(sizeof(big_int16_buf_at), 2u);
91 BOOST_TEST_EQ(sizeof(big_int32_buf_at), 4u);
92 BOOST_TEST_EQ(sizeof(big_int64_buf_at), 8u);
93
94 BOOST_TEST_EQ(sizeof(big_uint8_buf_at), 1u);
95 BOOST_TEST_EQ(sizeof(big_uint16_buf_at), 2u);
96 BOOST_TEST_EQ(sizeof(big_uint32_buf_at), 4u);
97 BOOST_TEST_EQ(sizeof(big_uint64_buf_at), 8u);
98
99 BOOST_TEST_EQ(sizeof(little_int8_buf_at), 1u);
100 BOOST_TEST_EQ(sizeof(little_int16_buf_at), 2u);
101 BOOST_TEST_EQ(sizeof(little_int32_buf_at), 4u);
102 BOOST_TEST_EQ(sizeof(little_int64_buf_at), 8u);
103
104 BOOST_TEST_EQ(sizeof(little_uint8_buf_at), 1u);
105 BOOST_TEST_EQ(sizeof(little_uint16_buf_at), 2u);
106 BOOST_TEST_EQ(sizeof(little_uint32_buf_at), 4u);
107 BOOST_TEST_EQ(sizeof(little_uint64_buf_at), 8u);
108 } // check_size
109
110 // test_inserter_and_extractor -----------------------------------------------------//
111
112 void test_inserter_and_extractor()
113 {
114 std::cout << "test inserter and extractor..." << std::endl;
115
116 big_uint64_buf_t bu64(0x010203040506070ULL);
117 little_uint64_buf_t lu64(0x010203040506070ULL);
118
119 boost::uint64_t x;
120
121 std::stringstream ss;
122
123 ss << bu64;
124 ss >> x;
125 BOOST_TEST_EQ(x, 0x010203040506070ULL);
126
127 ss.clear();
128 ss << lu64;
129 ss >> x;
130 BOOST_TEST_EQ(x, 0x010203040506070ULL);
131
132 ss.clear();
133 ss << 0x010203040506070ULL;
134 big_uint64_buf_t bu64z(0);
135 ss >> bu64z;
136 BOOST_TEST_EQ(bu64z.value(), bu64.value());
137
138 ss.clear();
139 ss << 0x010203040506070ULL;
140 little_uint64_buf_t lu64z(0);
141 ss >> lu64z;
142 BOOST_TEST_EQ(lu64z.value(), lu64.value());
143
144 std::cout << "test inserter and extractor complete" << std::endl;
145
146 }
147
148 template<class T> struct unaligned
149 {
150 char x;
151 T y;
152 };
153
154 template<class T> void test_buffer_type( typename T::value_type v1, typename T::value_type v2 )
155 {
156 T buffer( v1 );
157 BOOST_TEST_EQ( buffer.value(), v1 );
158
159 buffer = v2;
160 BOOST_TEST_EQ( buffer.value(), v2 );
161
162 unaligned<T> buffer2 = { 0, T( v1 ) };
163 BOOST_TEST_EQ( buffer2.y.value(), v1 );
164
165 buffer2.y = v2;
166 BOOST_TEST_EQ( buffer2.y.value(), v2 );
167 }
168
169 void test_construction_and_assignment()
170 {
171 std::cout << "test construction and assignment..." << std::endl;
172
173 test_buffer_type< big_int8_buf_at>( 0x01, -0x01 );
174 test_buffer_type<big_int16_buf_at>( 0x0102, -0x0102 );
175 test_buffer_type<big_int32_buf_at>( 0x01020304, -0x01020304 );
176 test_buffer_type<big_int64_buf_at>( 0x0102030405060708LL, -0x0102030405060708LL );
177
178 test_buffer_type< big_uint8_buf_at>( 0x01, 0xFE );
179 test_buffer_type<big_uint16_buf_at>( 0x0102, 0xFE02 );
180 test_buffer_type<big_uint32_buf_at>( 0x01020304, 0xFE020304 );
181 test_buffer_type<big_uint64_buf_at>( 0x0102030405060708ULL, 0xFE02030405060708LL );
182
183 test_buffer_type< little_int8_buf_at>( 0x01, -0x01 );
184 test_buffer_type<little_int16_buf_at>( 0x0102, -0x0102 );
185 test_buffer_type<little_int32_buf_at>( 0x01020304, -0x01020304 );
186 test_buffer_type<little_int64_buf_at>( 0x0102030405060708LL, -0x0102030405060708LL );
187
188 test_buffer_type< little_uint8_buf_at>( 0x01, 0xFE );
189 test_buffer_type<little_uint16_buf_at>( 0x0102, 0xFE02 );
190 test_buffer_type<little_uint32_buf_at>( 0x01020304, 0xFE020304 );
191 test_buffer_type<little_uint64_buf_at>( 0x0102030405060708ULL, 0xFE02030405060708LL );
192
193 test_buffer_type< big_int8_buf_t>( 0x01, -0x01 );
194 test_buffer_type<big_int16_buf_t>( 0x0102, -0x0102 );
195 test_buffer_type<big_int24_buf_t>( 0x010203, -0x010203 );
196 test_buffer_type<big_int32_buf_t>( 0x01020304, -0x01020304 );
197 test_buffer_type<big_int40_buf_t>( 0x0102030405LL, -0x0102030405LL );
198 test_buffer_type<big_int48_buf_t>( 0x010203040506LL, -0x010203040506LL );
199 test_buffer_type<big_int56_buf_t>( 0x01020304050607LL, -0x01020304050607LL );
200 test_buffer_type<big_int64_buf_t>( 0x0102030405060708LL, -0x0102030405060708LL );
201
202 test_buffer_type< little_uint8_buf_t>( 0x01, 0xFE );
203 test_buffer_type<little_uint16_buf_t>( 0x0102, 0xFE02 );
204 test_buffer_type<little_uint24_buf_t>( 0x010203, 0xFE0203 );
205 test_buffer_type<little_uint32_buf_t>( 0x01020304, 0xFE020304 );
206 test_buffer_type<little_uint40_buf_t>( 0x0102030405ULL, 0xFE02030405ULL );
207 test_buffer_type<little_uint48_buf_t>( 0x010203040506ULL, 0xFE0203040506ULL );
208 test_buffer_type<little_uint56_buf_t>( 0x01020304050607ULL, 0xFE020304050607ULL );
209 test_buffer_type<little_uint64_buf_t>( 0x0102030405060708ULL, 0xFE02030405060708LL );
210
211 std::cout << "test construction and assignment complete" << std::endl;
212 }
213
214 template <typename Int>
215 void test_boundary_values_()
216 {
217 test_buffer_type< endian_buffer<order::big, Int, sizeof(Int) * CHAR_BIT, align::no> >( std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max() );
218 test_buffer_type< endian_buffer<order::big, Int, sizeof(Int) * CHAR_BIT, align::no> >( std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max() );
219 test_buffer_type< endian_buffer<order::big, Int, sizeof(Int) * CHAR_BIT, align::yes> >( std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max() );
220 test_buffer_type< endian_buffer<order::big, Int, sizeof(Int) * CHAR_BIT, align::yes> >( std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max() );
221 }
222
223 void test_boundary_values()
224 {
225 std::cout << "test boundary values..." << std::endl;
226
227 test_boundary_values_<signed int>();
228 test_boundary_values_<unsigned int>();
229 test_boundary_values_<signed short>();
230 test_boundary_values_<unsigned short>();
231 test_boundary_values_<signed char>();
232 test_boundary_values_<unsigned char>();
233
234 std::cout << "test boundary values complete" << std::endl;
235 }
236
237 } // unnamed namespace
238
239 //--------------------------------------------------------------------------------------//
240
241 int cpp_main(int, char *[])
242 {
243 cout << "byte swap intrinsics: " BOOST_ENDIAN_INTRINSIC_MSG << endl;
244
245 cout << " construct big endian aligned" << endl;
246 big_int32_buf_at x(1122334455);
247
248 cout << " assign to buffer from built-in integer" << endl;
249 x = 1234567890;
250
251 cout << " operator==(buffer.value(), built-in)" << endl;
252 bool b1(x.value() == 1234567890);
253 BOOST_TEST(b1);
254
255 cout << " construct little endian unaligned" << endl;
256 little_int32_buf_t x2(1122334455);
257
258 cout << " assign to buffer from built-in integer" << endl;
259 x2 = 1234567890;
260
261 cout << " operator==(buffer.value(), built-in)" << endl;
262 bool b2(x2.value() == 1234567890);
263 BOOST_TEST(b2);
264
265 check_size();
266 test_inserter_and_extractor();
267 test_construction_and_assignment();
268 test_boundary_values();
269
270 cout << " done" << endl;
271
272 return ::boost::report_errors();
273 }
274
275 #include <boost/endian/detail/disable_warnings_pop.hpp>