// conversion_test.cpp ---------------------------------------------------------------// // Copyright Beman Dawes 2010 // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt //--------------------------------------------------------------------------------------// #include #include #include #include #include namespace be = boost::endian; using std::cout; using std::endl; namespace { const boost::int64_t ni64 = 0x0102030405060708LL; # ifdef BOOST_BIG_ENDIAN const boost::int64_t bi64 = 0x0102030405060708LL; const boost::int64_t li64 = 0x0807060504030201LL; # else const boost::int64_t bi64 = 0x0807060504030201LL; const boost::int64_t li64 = 0x0102030405060708LL; # endif const boost::int32_t ni32 = 0x01020304; # ifdef BOOST_BIG_ENDIAN const boost::int32_t bi32 = 0x01020304; const boost::int32_t li32 = 0x04030201; # else const boost::int32_t bi32 = 0x04030201; const boost::int32_t li32 = 0x01020304; # endif const boost::int16_t ni16 = 0x0102; # ifdef BOOST_BIG_ENDIAN const boost::int16_t bi16 = 0x0102; const boost::int16_t li16 = 0x0201; # else const boost::int16_t bi16 = 0x0201; const boost::int16_t li16 = 0x0102; # endif const boost::int16_t ni16hi = static_cast(0xf1f2U); # ifdef BOOST_BIG_ENDIAN const boost::int16_t bi16hi = static_cast(0xf1f2U); const boost::int16_t li16hi = static_cast(0xf2f1U); # else const boost::int16_t bi16hi = static_cast(0xf2f1U); const boost::int16_t li16hi = static_cast(0xf1f2U); # endif const boost::uint64_t nui64 = 0x0102030405060708ULL; # ifdef BOOST_BIG_ENDIAN const boost::uint64_t bui64 = 0x0102030405060708ULL; const boost::uint64_t lui64 = 0x0807060504030201ULL; # else const boost::uint64_t bui64 = 0x0807060504030201ULL; const boost::uint64_t lui64 = 0x0102030405060708ULL; # endif const boost::uint32_t nui32 = 0x01020304; # ifdef BOOST_BIG_ENDIAN const boost::uint32_t bui32 = 0x01020304; const boost::uint32_t lui32 = 0x04030201; # else const boost::uint32_t bui32 = 0x04030201; const boost::uint32_t lui32 = 0x01020304; # endif const boost::uint16_t nui16 = 0x0102; # ifdef BOOST_BIG_ENDIAN const boost::uint16_t bui16 = 0x0102; const boost::uint16_t lui16 = 0x0201; # else const boost::uint16_t bui16 = 0x0201; const boost::uint16_t lui16 = 0x0102; # endif // values for tests void native_value(int16_t& x) {x = static_cast(0xF102U);} void native_value(uint16_t& x) {x = static_cast(0xF102U);} # ifdef BOOST_BIG_ENDIAN void big_value(int16_t& x) {x = static_cast(0xF102U);} void big_value(uint16_t& x) {x = static_cast(0xF102U);} void little_value(int16_t& x) {x = static_cast(0x02F1U);} void little_value(uint16_t& x) {x = static_cast(0x02F1U);} # else void big_value(int16_t& x) {x = static_cast(0x02F1U);} void big_value(uint16_t& x) {x = static_cast(0x02F1U);} void little_value(int16_t& x) {x = static_cast(0xF102U);} void little_value(uint16_t& x) {x = static_cast(0xF102U);} # endif void native_value(int32_t& x) {x = static_cast(0xF1E21304UL);} void native_value(uint32_t& x) {x = static_cast(0xF1E21304UL);} # ifdef BOOST_BIG_ENDIAN void big_value(int32_t& x) {x = static_cast(0xF1E21304UL);} void big_value(uint32_t& x) {x = static_cast(0xF1E21304UL);} void little_value(int32_t& x) {x = static_cast(0x0413E2F1UL);} void little_value(uint32_t& x) {x = static_cast(0x0413E2F1UL);} # else void big_value(int32_t& x) {x = static_cast(0x0413E2F1UL);} void big_value(uint32_t& x) {x = static_cast(0x0413E2F1UL);} void little_value(int32_t& x) {x = static_cast(0xF1E21304UL);} void little_value(uint32_t& x) {x = static_cast(0xF1E21304UL);} # endif void native_value(int64_t& x) {x = static_cast(0xF1E2D3C444231201ULL);} void native_value(uint64_t& x) {x = static_cast(0xF1E2D3C444231201ULL);} # ifdef BOOST_BIG_ENDIAN void big_value(int64_t& x) {x = static_cast(0xF1E2D3C444231201ULL);} void big_value(uint64_t& x) {x = static_cast(0xF1E2D3C444231201ULL);} void little_value(int64_t& x) {x = static_cast(0x01122344C4D3E2F1ULL);} void little_value(uint64_t& x) {x = static_cast(0x01122344C4D3E2F1ULL);} # else void big_value(int64_t& x) {x = static_cast(0x01122344C4D3E2F1ULL);} void big_value(uint64_t& x) {x = static_cast(0x01122344C4D3E2F1ULL);} void little_value(int64_t& x) {x = static_cast(0xF1E2D3C444231201ULL);} void little_value(uint64_t& x) {x = static_cast(0xF1E2D3C444231201ULL);} # endif const float float_value = -1.234F; const double double_value = -1.234567; void native_value(float& x) {std::memcpy(&x, &float_value, sizeof(float));} void native_value(double& x) {memcpy(&x, &double_value, sizeof(double));} # ifdef BOOST_BIG_ENDIAN void big_value(float& x) {memcpy(&x, &float_value, sizeof(float));} void big_value(double& x) {memcpy(&x, &double_value, sizeof(double));} void little_value(float& x) { memcpy(&x, &float_value, sizeof(float)); std::reverse(reinterpret_cast(&x), reinterpret_cast(&x)+sizeof(float)); } void little_value(double& x) { memcpy(&x, &double_value, sizeof(double)); std::reverse(reinterpret_cast(&x), reinterpret_cast(&x)+sizeof(double)); } # else void big_value(float& x) { memcpy(&x, &float_value, sizeof(float)); std::reverse(reinterpret_cast(&x), reinterpret_cast(&x)+sizeof(float)); } void big_value(double& x) { memcpy(&x, &double_value, sizeof(double)); std::reverse(reinterpret_cast(&x), reinterpret_cast(&x)+sizeof(double)); } void little_value(float& x) {memcpy(&x, &float_value, sizeof(float));} void little_value(double& x) {memcpy(&x, &double_value, sizeof(double));} # endif template void test() { T native; T big; T little; native_value(native); big_value(big); little_value(little); BOOST_TEST_EQ(be::reverse_value(big), little); BOOST_TEST_EQ(be::reverse_value(little), big); BOOST_TEST_EQ(be::detail::reverse_value(big), little); BOOST_TEST_EQ(be::detail::reverse_value(little), big); BOOST_TEST_EQ(be::big_endian_value(native), big); BOOST_TEST_EQ(be::little_endian_value(native), little); BOOST_TEST_EQ(be::big_endian_value(be::big_endian_value(native)), native); BOOST_TEST_EQ(be::big_endian_value(be::big_endian_value(big)), big); BOOST_TEST_EQ(be::big_endian_value(be::big_endian_value(little)), little); BOOST_TEST_EQ(be::little_endian_value(be::little_endian_value(native)), native); BOOST_TEST_EQ(be::little_endian_value(be::little_endian_value(big)), big); BOOST_TEST_EQ(be::little_endian_value(be::little_endian_value(little)), little); # ifdef BOOST_BIG_ENDIAN BOOST_TEST_EQ(be::reverse_value(native), little); BOOST_TEST_EQ(be::detail::reverse_value(native), little); BOOST_TEST_EQ(be::big_endian_value(big), big); BOOST_TEST_EQ(be::big_endian_value(big), big); BOOST_TEST_EQ(be::big_endian_value(little), little); BOOST_TEST_EQ(be::big_endian_value(little), little); BOOST_TEST_EQ(be::big_endian_value(native), little); BOOST_TEST_EQ(be::big_endian_value(native), little); # else BOOST_TEST_EQ(be::reverse_value(native), big); BOOST_TEST_EQ(be::detail::reverse_value(native), big); BOOST_TEST_EQ(be::big_endian_value(big), little); BOOST_TEST_EQ(be::big_endian_value(big), little); BOOST_TEST_EQ(be::big_endian_value(little), big); BOOST_TEST_EQ(be::big_endian_value(little), big); BOOST_TEST_EQ(be::big_endian_value(native), big); BOOST_TEST_EQ(be::big_endian_value(native), big); # endif // compile time order determination BOOST_TEST_EQ((be::convert_value(big)), big); BOOST_TEST_EQ((be::convert_value(little)), little); BOOST_TEST_EQ((be::convert_value(native)), native); BOOST_TEST_EQ((be::convert_value(big)), little); BOOST_TEST_EQ((be::convert_value(big)), native); BOOST_TEST_EQ((be::convert_value(little)), big); BOOST_TEST_EQ((be::convert_value(little)), native); BOOST_TEST_EQ((be::convert_value(native)), big); BOOST_TEST_EQ((be::convert_value(native)), native); // runtime order determination BOOST_TEST_EQ((be::convert_value(big, be::order::big, be::order::big)), big); BOOST_TEST_EQ((be::convert_value(little, be::order::little, be::order::little)), little); BOOST_TEST_EQ((be::convert_value(native, be::order::native, be::order::native)), native); BOOST_TEST_EQ((be::convert_value(big, be::order::big, be::order::little)), little); BOOST_TEST_EQ((be::convert_value(big, be::order::big, be::order::native)), native); BOOST_TEST_EQ((be::convert_value(little, be::order::little, be::order::big)), big); BOOST_TEST_EQ((be::convert_value(little, be::order::little, be::order::native)), native); BOOST_TEST_EQ((be::convert_value(native, be::order::native, be::order::big)), big); BOOST_TEST_EQ((be::convert_value(native, be::order::native, be::order::little)), native); } } // unnamed namespace int cpp_main(int, char * []) { //std::cerr << std::hex; cout << "int16_t" << endl; test(); cout << "uint16_t" << endl; test(); cout << "int32_t" << endl; test(); cout << "uint32_t" << endl; test(); cout << "int64_t" << endl; test(); cout << "uint64_t" << endl; test(); cout << "float" << endl; test(); cout << "double" << endl; test(); return ::boost::report_errors(); } #include