From 8e617a69d11b7e3f1e248631142fd63edfc84125 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sun, 3 May 2020 00:10:06 +0300 Subject: [PATCH] Enable scoped enums in endian_reverse --- .../boost/endian/detail/endian_reverse.hpp | 5 +- test/Jamfile.v2 | 2 + test/endian_reverse_test3.cpp | 62 +++++++++++++++++++ 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 test/endian_reverse_test3.cpp diff --git a/include/boost/endian/detail/endian_reverse.hpp b/include/boost/endian/detail/endian_reverse.hpp index 74e59e6..52f5c0d 100644 --- a/include/boost/endian/detail/endian_reverse.hpp +++ b/include/boost/endian/detail/endian_reverse.hpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -107,14 +108,14 @@ inline uint128_type BOOST_ENDIAN_CONSTEXPR endian_reverse_impl( uint128_type x ) // is_endian_reversible template struct is_endian_reversible: boost::integral_constant::value && !boost::is_same::value> + (boost::is_integral::value && !boost::is_same::value) || is_scoped_enum::value> { }; // is_endian_reversible_inplace template struct is_endian_reversible_inplace: boost::integral_constant::value && !boost::is_same::value> + (boost::is_integral::value && !boost::is_same::value) || is_scoped_enum::value> { }; diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index fd71770..c635026 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -98,3 +98,5 @@ run order_test.cpp ; run endian_reverse_test2.cpp ; run is_scoped_enum_test.cpp ; + +run endian_reverse_test3.cpp ; diff --git a/test/endian_reverse_test3.cpp b/test/endian_reverse_test3.cpp new file mode 100644 index 0000000..c417fea --- /dev/null +++ b/test/endian_reverse_test3.cpp @@ -0,0 +1,62 @@ +// Copyright 2020 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include + +template void test_reverse( T x ) +{ + using boost::endian::endian_reverse; + + T x2 = endian_reverse( endian_reverse( x ) ); + + BOOST_TEST( x == x2 ); +} + +template void test_reverse_inplace( T x ) +{ + using boost::endian::endian_reverse_inplace; + + T x2( x ); + + endian_reverse_inplace( x2 ); + endian_reverse_inplace( x2 ); + + BOOST_TEST( x == x2 ); +} + +enum E1 { e1 }; + +#if !defined(BOOST_NO_CXX11_SCOPED_ENUMS) + +enum E2: long { e2 }; +enum class E3 { e3 }; +enum class E4: long { e4 }; + +#endif + +int main() +{ + test_reverse( 1 ); + +#if !defined(BOOST_NO_CXX11_SCOPED_ENUMS) + + test_reverse( E3::e3 ); + test_reverse( E4::e4 ); + +#endif + + test_reverse_inplace( 1 ); + +#if !defined(BOOST_NO_CXX11_SCOPED_ENUMS) + + test_reverse_inplace( E3::e3 ); + test_reverse_inplace( E4::e4 ); + +#endif + + return boost::report_errors(); +}