mirror of
https://github.com/boostorg/endian.git
synced 2025-07-30 20:47:26 +02:00
Add __int128 support to endian_reverse
This commit is contained in:
@ -62,7 +62,7 @@ inline uint16_t BOOST_ENDIAN_CONSTEXPR endian_reverse_impl( uint16_t x ) BOOST_N
|
||||
#endif
|
||||
}
|
||||
|
||||
inline uint32_t BOOST_ENDIAN_CONSTEXPR endian_reverse_impl(uint32_t x) BOOST_NOEXCEPT
|
||||
inline uint32_t BOOST_ENDIAN_CONSTEXPR endian_reverse_impl( uint32_t x ) BOOST_NOEXCEPT
|
||||
{
|
||||
#ifdef BOOST_ENDIAN_NO_INTRINSICS
|
||||
|
||||
@ -76,7 +76,7 @@ inline uint32_t BOOST_ENDIAN_CONSTEXPR endian_reverse_impl(uint32_t x) BOOST_NOE
|
||||
#endif
|
||||
}
|
||||
|
||||
inline uint64_t BOOST_ENDIAN_CONSTEXPR endian_reverse_impl(uint64_t x) BOOST_NOEXCEPT
|
||||
inline uint64_t BOOST_ENDIAN_CONSTEXPR endian_reverse_impl( uint64_t x ) BOOST_NOEXCEPT
|
||||
{
|
||||
#ifdef BOOST_ENDIAN_NO_INTRINSICS
|
||||
|
||||
@ -91,6 +91,16 @@ inline uint64_t BOOST_ENDIAN_CONSTEXPR endian_reverse_impl(uint64_t x) BOOST_NOE
|
||||
# endif
|
||||
}
|
||||
|
||||
#if defined(BOOST_HAS_INT128)
|
||||
|
||||
inline uint128_type BOOST_ENDIAN_CONSTEXPR endian_reverse_impl( uint128_type x ) BOOST_NOEXCEPT
|
||||
{
|
||||
return endian_reverse_impl( static_cast<uint64_t>( x >> 64 ) ) |
|
||||
static_cast<uint128_type>( endian_reverse_impl( static_cast<uint64_t>( x ) ) ) << 64;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
} // namespace detail
|
||||
|
||||
// Requires:
|
||||
|
@ -7,6 +7,7 @@
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/config.hpp>
|
||||
#include <cstddef>
|
||||
|
||||
namespace boost
|
||||
@ -40,6 +41,15 @@ template<> struct integral_by_size<8>
|
||||
typedef uint64_t type;
|
||||
};
|
||||
|
||||
#if defined(BOOST_HAS_INT128)
|
||||
|
||||
template<> struct integral_by_size<16>
|
||||
{
|
||||
typedef uint128_type type;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
} // namespace detail
|
||||
} // namespace endian
|
||||
} // namespace boost
|
||||
|
@ -72,6 +72,24 @@ template<class T> T const test_value<T, 8>::w1;
|
||||
template<class T> T const test_value<T, 8>::v2;
|
||||
template<class T> T const test_value<T, 8>::w2;
|
||||
|
||||
#if defined(BOOST_HAS_INT128)
|
||||
|
||||
template<class T> struct test_value<T, 16>
|
||||
{
|
||||
static const T v1 = static_cast<T>( 0x1F2E3D4C5B6A7988ull ) << 64 | static_cast<T>( 0xF1E2D3C4B5A69780ull );
|
||||
static const T w1 = static_cast<T>( 0x8097A6B5C4D3E2F1ull ) << 64 | static_cast<T>( 0x88796A5B4C3D2E1Full );
|
||||
|
||||
static const T v2 = static_cast<T>( 0xF1E2D3C4B5A69788ull ) << 64 | static_cast<T>( 0x1F2E3D4C5B6A7980ull );
|
||||
static const T w2 = static_cast<T>( 0x80796A5B4C3D2E1Full ) << 64 | static_cast<T>( 0x8897A6B5C4D3E2F1ull );
|
||||
};
|
||||
|
||||
template<class T> T const test_value<T, 16>::v1;
|
||||
template<class T> T const test_value<T, 16>::w1;
|
||||
template<class T> T const test_value<T, 16>::v2;
|
||||
template<class T> T const test_value<T, 16>::w2;
|
||||
|
||||
#endif // #if defined(BOOST_HAS_INT128)
|
||||
|
||||
template<class T> void test()
|
||||
{
|
||||
using boost::endian::endian_reverse;
|
||||
@ -114,6 +132,48 @@ template<class T> void test()
|
||||
}
|
||||
}
|
||||
|
||||
template<class T> void test_np()
|
||||
{
|
||||
using boost::endian::endian_reverse;
|
||||
using boost::endian::endian_reverse_inplace;
|
||||
|
||||
{
|
||||
T t1 = test_value<T>::v1;
|
||||
|
||||
T t2 = endian_reverse( t1 );
|
||||
BOOST_TEST( t2 == test_value<T>::w1 );
|
||||
|
||||
T t3 = endian_reverse( t2 );
|
||||
BOOST_TEST( t3 == t1 );
|
||||
|
||||
T t4 = t1;
|
||||
|
||||
endian_reverse_inplace( t4 );
|
||||
BOOST_TEST( t4 == test_value<T>::w1 );
|
||||
|
||||
endian_reverse_inplace( t4 );
|
||||
BOOST_TEST( t4 == t1 );
|
||||
}
|
||||
|
||||
{
|
||||
T t1 = test_value<T>::v2;
|
||||
|
||||
T t2 = endian_reverse( t1 );
|
||||
BOOST_TEST( t2 == test_value<T>::w2 );
|
||||
|
||||
T t3 = endian_reverse( t2 );
|
||||
BOOST_TEST( t3 == t1 );
|
||||
|
||||
T t4 = t1;
|
||||
|
||||
endian_reverse_inplace( t4 );
|
||||
BOOST_TEST( t4 == test_value<T>::w2 );
|
||||
|
||||
endian_reverse_inplace( t4 );
|
||||
BOOST_TEST( t4 == t1 );
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test<boost::int8_t>();
|
||||
@ -152,5 +212,12 @@ int main()
|
||||
test<char32_t>();
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_HAS_INT128)
|
||||
|
||||
test_np<boost::int128_type>();
|
||||
test_np<boost::uint128_type>();
|
||||
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
Reference in New Issue
Block a user