1 // buffer_test.cpp -------------------------------------------------------------------//
3 // Copyright Beman Dawes 2014
5 // Distributed under the Boost Software License, Version 1.0.
6 // See http://www.boost.org/LICENSE_1_0.txt
8 // See library home page at http://www.boost.org/libs/endian
10 //--------------------------------------------------------------------------------------//
12 #include <boost/endian/detail/disable_warnings.hpp>
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>
23 using namespace boost::endian
;
30 // check_size ------------------------------------------------------------//
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
110 // test_inserter_and_extractor -----------------------------------------------------//
112 void test_inserter_and_extractor()
114 std::cout
<< "test inserter and extractor..." << std::endl
;
116 big_uint64_buf_t
bu64(0x010203040506070ULL
);
117 little_uint64_buf_t
lu64(0x010203040506070ULL
);
121 std::stringstream ss
;
125 BOOST_TEST_EQ(x
, 0x010203040506070ULL
);
130 BOOST_TEST_EQ(x
, 0x010203040506070ULL
);
133 ss
<< 0x010203040506070ULL
;
134 big_uint64_buf_t
bu64z(0);
136 BOOST_TEST_EQ(bu64z
.value(), bu64
.value());
139 ss
<< 0x010203040506070ULL
;
140 little_uint64_buf_t
lu64z(0);
142 BOOST_TEST_EQ(lu64z
.value(), lu64
.value());
144 std::cout
<< "test inserter and extractor complete" << std::endl
;
148 template<class T
> struct unaligned
154 template<class T
> void test_buffer_type( typename
T::value_type v1
, typename
T::value_type v2
)
157 BOOST_TEST_EQ( buffer
.value(), v1
);
160 BOOST_TEST_EQ( buffer
.value(), v2
);
162 unaligned
<T
> buffer2
= { 0, T( v1
) };
163 BOOST_TEST_EQ( buffer2
.y
.value(), v1
);
166 BOOST_TEST_EQ( buffer2
.y
.value(), v2
);
169 void test_construction_and_assignment()
171 std::cout
<< "test construction and assignment..." << std::endl
;
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
);
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
);
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
);
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
);
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
);
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
);
211 std::cout
<< "test construction and assignment complete" << std::endl
;
214 template <typename Int
>
215 void test_boundary_values_()
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() );
223 void test_boundary_values()
225 std::cout
<< "test boundary values..." << std::endl
;
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>();
234 std::cout
<< "test boundary values complete" << std::endl
;
237 } // unnamed namespace
239 //--------------------------------------------------------------------------------------//
241 int cpp_main(int, char *[])
243 cout
<< "byte swap intrinsics: " BOOST_ENDIAN_INTRINSIC_MSG
<< endl
;
245 cout
<< " construct big endian aligned" << endl
;
246 big_int32_buf_at
x(1122334455);
248 cout
<< " assign to buffer from built-in integer" << endl
;
251 cout
<< " operator==(buffer.value(), built-in)" << endl
;
252 bool b1(x
.value() == 1234567890);
255 cout
<< " construct little endian unaligned" << endl
;
256 little_int32_buf_t
x2(1122334455);
258 cout
<< " assign to buffer from built-in integer" << endl
;
261 cout
<< " operator==(buffer.value(), built-in)" << endl
;
262 bool b2(x2
.value() == 1234567890);
266 test_inserter_and_extractor();
267 test_construction_and_assignment();
268 test_boundary_values();
270 cout
<< " done" << endl
;
272 return ::boost::report_errors();
275 #include <boost/endian/detail/disable_warnings_pop.hpp>