From 62091e5d0c1923aa6893c2c1fd9005bff8ade0b7 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Tue, 5 May 2020 20:06:21 +0300 Subject: [PATCH] Add an overload of endian_reverse_inplace for arrays --- .../boost/endian/detail/endian_reverse.hpp | 11 +++ test/Jamfile.v2 | 5 ++ test/endian_reverse_test4.cpp | 67 +++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 test/endian_reverse_test4.cpp diff --git a/include/boost/endian/detail/endian_reverse.hpp b/include/boost/endian/detail/endian_reverse.hpp index 027ae81..977f9a8 100644 --- a/include/boost/endian/detail/endian_reverse.hpp +++ b/include/boost/endian/detail/endian_reverse.hpp @@ -161,6 +161,17 @@ template inline x = endian_reverse( x ); } +// endian_reverse_inplace for arrays + +template +inline void endian_reverse_inplace( T (&x)[ N ] ) +{ + for( std::size_t i = 0; i < N; ++i ) + { + endian_reverse_inplace( x[i] ); + } +} + } // namespace endian } // namespace boost diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index c635026..f5672bd 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -96,7 +96,12 @@ run-ni endian_hpp_test.cpp ; run order_test.cpp ; run endian_reverse_test2.cpp ; +run-ni endian_reverse_test2.cpp ; run is_scoped_enum_test.cpp ; run endian_reverse_test3.cpp ; +run-ni endian_reverse_test3.cpp ; + +run endian_reverse_test4.cpp ; +run-ni endian_reverse_test4.cpp ; diff --git a/test/endian_reverse_test4.cpp b/test/endian_reverse_test4.cpp new file mode 100644 index 0000000..64baaa0 --- /dev/null +++ b/test/endian_reverse_test4.cpp @@ -0,0 +1,67 @@ +// 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_inplace( T x ) +{ + using boost::endian::endian_reverse_inplace; + + T x2( x ); + + endian_reverse_inplace( x2 ); + endian_reverse_inplace( x2 ); + + BOOST_TEST( x == x2 ); +} + +struct X +{ + int v1_; + int v2_; +}; + +inline bool operator==( X const& x1, X const& x2 ) +{ + return x1.v1_ == x2.v1_ && x1.v2_ == x2.v2_; +} + +inline void endian_reverse_inplace( X & x ) +{ + using boost::endian::endian_reverse_inplace; + + endian_reverse_inplace( x.v1_ ); + endian_reverse_inplace( x.v2_ ); +} + +struct Y +{ + X x1_; + X x2_[ 2 ]; +}; + +inline bool operator==( Y const& y1, Y const& y2 ) +{ + return y1.x1_ == y2.x1_ && y1.x2_[0] == y2.x2_[0] && y1.x2_[1] == y2.x2_[1]; +} + +inline void endian_reverse_inplace( Y & y ) +{ + using boost::endian::endian_reverse_inplace; + + endian_reverse_inplace( y.x1_ ); + endian_reverse_inplace( y.x2_ ); +} + +int main() +{ + Y y = { { 1, 2 }, { { 3, 4 }, { 5, 6 } } }; + + test_reverse_inplace( y ); + + return boost::report_errors(); +}