// Copyright 2019 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // http://www.boost.org/LICENSE_1_0.txt #if defined(_MSC_VER) # pragma warning( disable: 4309 ) // static_cast: truncation of constant value #endif #include #include #include #include template struct test_value { }; template struct test_value { static const T v1 = static_cast( 0x1F ); static const T w1 = static_cast( 0x1F ); static const T v2 = static_cast( 0xF1 ); static const T w2 = static_cast( 0xF1 ); }; template T const test_value::v1; template T const test_value::w1; template T const test_value::v2; template T const test_value::w2; template struct test_value { static const T v1 = static_cast( 0x1F2E ); static const T w1 = static_cast( 0x2E1F ); static const T v2 = static_cast( 0xF1E2 ); static const T w2 = static_cast( 0xE2F1 ); }; template T const test_value::v1; template T const test_value::w1; template T const test_value::v2; template T const test_value::w2; template struct test_value { static const T v1 = static_cast( 0x1F2E3D4C ); static const T w1 = static_cast( 0x4C3D2E1F ); static const T v2 = static_cast( 0xF1E2D3C4 ); static const T w2 = static_cast( 0xC4D3E2F1 ); }; template T const test_value::v1; template T const test_value::w1; template T const test_value::v2; template T const test_value::w2; template struct test_value { static const T v1 = static_cast( 0x1F2E3D4C5B6A7988ull ); static const T w1 = static_cast( 0x88796A5B4C3D2E1Full ); static const T v2 = static_cast( 0xF1E2D3C4B5A69788ull ); static const T w2 = static_cast( 0x8897A6B5C4D3E2F1ull ); }; template T const test_value::v1; template T const test_value::w1; template T const test_value::v2; template T const test_value::w2; #if defined(BOOST_HAS_INT128) template struct test_value { static const T v1 = static_cast( 0x1F2E3D4C5B6A7988ull ) << 64 | static_cast( 0xF1E2D3C4B5A69780ull ); static const T w1 = static_cast( 0x8097A6B5C4D3E2F1ull ) << 64 | static_cast( 0x88796A5B4C3D2E1Full ); static const T v2 = static_cast( 0xF1E2D3C4B5A69788ull ) << 64 | static_cast( 0x1F2E3D4C5B6A7980ull ); static const T w2 = static_cast( 0x80796A5B4C3D2E1Full ) << 64 | static_cast( 0x8897A6B5C4D3E2F1ull ); }; template T const test_value::v1; template T const test_value::w1; template T const test_value::v2; template T const test_value::w2; #endif // #if defined(BOOST_HAS_INT128) template void test() { using boost::endian::endian_reverse; using boost::endian::endian_reverse_inplace; { T t1 = test_value::v1; T t2 = endian_reverse( t1 ); BOOST_TEST_EQ( t2, test_value::w1 ); T t3 = endian_reverse( t2 ); BOOST_TEST_EQ( t3, t1 ); T t4 = t1; endian_reverse_inplace( t4 ); BOOST_TEST_EQ( t4, test_value::w1 ); endian_reverse_inplace( t4 ); BOOST_TEST_EQ( t4, t1 ); } { T t1 = test_value::v2; T t2 = endian_reverse( t1 ); BOOST_TEST_EQ( t2, test_value::w2 ); T t3 = endian_reverse( t2 ); BOOST_TEST_EQ( t3, t1 ); T t4 = t1; endian_reverse_inplace( t4 ); BOOST_TEST_EQ( t4, test_value::w2 ); endian_reverse_inplace( t4 ); BOOST_TEST_EQ( t4, t1 ); } } template void test_np() { using boost::endian::endian_reverse; using boost::endian::endian_reverse_inplace; { T t1 = test_value::v1; T t2 = endian_reverse( t1 ); BOOST_TEST( t2 == test_value::w1 ); T t3 = endian_reverse( t2 ); BOOST_TEST( t3 == t1 ); T t4 = t1; endian_reverse_inplace( t4 ); BOOST_TEST( t4 == test_value::w1 ); endian_reverse_inplace( t4 ); BOOST_TEST( t4 == t1 ); } { T t1 = test_value::v2; T t2 = endian_reverse( t1 ); BOOST_TEST( t2 == test_value::w2 ); T t3 = endian_reverse( t2 ); BOOST_TEST( t3 == t1 ); T t4 = t1; endian_reverse_inplace( t4 ); BOOST_TEST( t4 == test_value::w2 ); endian_reverse_inplace( t4 ); BOOST_TEST( t4 == t1 ); } } int main() { test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); #if !defined(BOOST_NO_CXX11_CHAR16_T) test(); #endif #if !defined(BOOST_NO_CXX11_CHAR32_T) test(); #endif #if defined(BOOST_HAS_INT128) test_np(); test_np(); #endif return boost::report_errors(); }