1 | // Copyright 2020 Peter Dimov |
---|---|
2 | // Distributed under the Boost Software License, Version 1.0. |
3 | // https://www.boost.org/LICENSE_1_0.txt |
4 | |
5 | #include <boost/endian/conversion.hpp> |
6 | #include <boost/core/lightweight_test.hpp> |
7 | #include <boost/config.hpp> |
8 | #include <cstddef> |
9 | |
10 | template<class T> void test_reverse_inplace( T x ) |
11 | { |
12 | using boost::endian::endian_reverse_inplace; |
13 | |
14 | T x2( x ); |
15 | |
16 | endian_reverse_inplace( x2 ); |
17 | endian_reverse_inplace( x2 ); |
18 | BOOST_TEST( x == x2 ); |
19 | |
20 | boost::endian::native_to_little_inplace( x2 ); |
21 | boost::endian::little_to_native_inplace( x2 ); |
22 | BOOST_TEST( x == x2 ); |
23 | |
24 | boost::endian::native_to_big_inplace( x2 ); |
25 | boost::endian::big_to_native_inplace( x2 ); |
26 | BOOST_TEST( x == x2 ); |
27 | } |
28 | |
29 | struct X |
30 | { |
31 | int v1_; |
32 | int v2_; |
33 | }; |
34 | |
35 | inline bool operator==( X const& x1, X const& x2 ) |
36 | { |
37 | return x1.v1_ == x2.v1_ && x1.v2_ == x2.v2_; |
38 | } |
39 | |
40 | inline void endian_reverse_inplace( X & x ) |
41 | { |
42 | using boost::endian::endian_reverse_inplace; |
43 | |
44 | endian_reverse_inplace( x&: x.v1_ ); |
45 | endian_reverse_inplace( x&: x.v2_ ); |
46 | } |
47 | |
48 | struct Y |
49 | { |
50 | X x1_; |
51 | X x2_[ 2 ]; |
52 | }; |
53 | |
54 | inline bool operator==( Y const& y1, Y const& y2 ) |
55 | { |
56 | return y1.x1_ == y2.x1_ && y1.x2_[0] == y2.x2_[0] && y1.x2_[1] == y2.x2_[1]; |
57 | } |
58 | |
59 | inline void endian_reverse_inplace( Y & y ) |
60 | { |
61 | using boost::endian::endian_reverse_inplace; |
62 | |
63 | endian_reverse_inplace( x&: y.x1_ ); |
64 | endian_reverse_inplace( x&: y.x2_ ); |
65 | } |
66 | |
67 | int main() |
68 | { |
69 | Y y = { .x1_: { .v1_: 1, .v2_: 2 }, .x2_: { { .v1_: 3, .v2_: 4 }, { .v1_: 5, .v2_: 6 } } }; |
70 | |
71 | test_reverse_inplace( x: y ); |
72 | |
73 | return boost::report_errors(); |
74 | } |
75 |