1 // Copyright 2019 Peter Dimov
3 // Distributed under the Boost Software License, Version 1.0.
4 // http://www.boost.org/LICENSE_1_0.txt
6 #include <boost/endian/arithmetic.hpp>
7 #include <boost/core/lightweight_test.hpp>
8 #include <boost/config.hpp>
9 #include <boost/cstdint.hpp>
12 template<BOOST_SCOPED_ENUM(boost::endian::order) Order, BOOST_SCOPED_ENUM(boost::endian::align) Align, class T> void test_arithmetic_( T const& x )
14 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y( x );
16 BOOST_TEST_EQ( +x, +y );
18 BOOST_TEST_EQ( x + x, y + y );
19 BOOST_TEST_EQ( x - x, y - y );
21 BOOST_TEST_EQ( x * x, y * y );
22 BOOST_TEST_EQ( x / x, y / y );
26 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y2( y );
28 BOOST_TEST_EQ( x2 += x, y2 += y );
33 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y2( y );
35 BOOST_TEST_EQ( x2 -= x, y2 -= y );
40 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y2( y );
42 BOOST_TEST_EQ( x2 *= x, y2 *= y );
47 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y2( y );
49 BOOST_TEST_EQ( x2 /= x, y2 /= y );
54 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y2( y );
56 BOOST_TEST_EQ( ++x2, ++y2 );
61 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y2( y );
63 BOOST_TEST_EQ( --x2, --y2 );
68 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y2( y );
70 BOOST_TEST_EQ( x2++, y2++ );
75 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y2( y );
77 BOOST_TEST_EQ( x2--, y2-- );
81 template<BOOST_SCOPED_ENUM(boost::endian::order) Order, BOOST_SCOPED_ENUM(boost::endian::align) Align, class T> void test_integral_( T const& x )
83 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y( x );
85 BOOST_TEST_EQ( x % x, y % y );
87 BOOST_TEST_EQ( x & x, y & y );
88 BOOST_TEST_EQ( x | x, y | y );
89 BOOST_TEST_EQ( x ^ x, y ^ y );
91 BOOST_TEST_EQ( x << 1, y << 1 );
92 BOOST_TEST_EQ( x >> 1, y >> 1 );
96 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y2( y );
98 BOOST_TEST_EQ( x2 %= x, y2 %= y );
103 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y2( y );
105 BOOST_TEST_EQ( x2 &= x, y2 &= y );
110 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y2( y );
112 BOOST_TEST_EQ( x2 |= x, y2 |= y );
117 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y2( y );
119 BOOST_TEST_EQ( x2 ^= x, y2 ^= y );
124 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y2( y );
126 BOOST_TEST_EQ( x2 <<= 1, y2 <<= 1 );
131 boost::endian::endian_arithmetic<Order, T, sizeof(T) * 8, Align> y2( y );
133 BOOST_TEST_EQ( x2 >>= 1, y2 >>= 1 );
137 template<class T> void test_arithmetic( T const& x )
139 test_arithmetic_<boost::endian::order::little, boost::endian::align::no>( x );
140 test_arithmetic_<boost::endian::order::little, boost::endian::align::yes>( x );
141 test_arithmetic_<boost::endian::order::big, boost::endian::align::no>( x );
142 test_arithmetic_<boost::endian::order::big, boost::endian::align::yes>( x );
145 template<class T> void test_integral( T const& x )
147 test_arithmetic( x );
149 test_integral_<boost::endian::order::little, boost::endian::align::no>( x );
150 test_integral_<boost::endian::order::little, boost::endian::align::yes>( x );
151 test_integral_<boost::endian::order::big, boost::endian::align::no>( x );
152 test_integral_<boost::endian::order::big, boost::endian::align::yes>( x );
157 test_integral( 0x7EF2 );
158 test_integral( 0x01020304u );
160 test_arithmetic( 3.1416f );
161 test_arithmetic( 3.14159 );
163 return boost::report_errors();