From 100eabbc0824488c9cd148d9c90d053ee69022e4 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Wed, 12 Jul 2023 09:05:59 -0700 Subject: [PATCH] add std::byteswap support Signed-off-by: Rosen Penev --- src/image.cpp | 12 ++++++++++++ src/pgfimage.cpp | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/src/image.cpp b/src/image.cpp index a439ee15..eee9720a 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -196,6 +196,9 @@ bool Image::isLittleEndianPlatform() { } uint64_t Image::byteSwap(uint64_t value, bool bSwap) { +#ifdef __cpp_lib_byteswap + return bSwap ? std::byteswap(value) : value; +#else uint64_t result = 0; auto source_value = reinterpret_cast(&value); auto destination_value = reinterpret_cast(&result); @@ -204,22 +207,31 @@ uint64_t Image::byteSwap(uint64_t value, bool bSwap) { destination_value[i] = source_value[8 - i - 1]; return bSwap ? result : value; +#endif } uint32_t Image::byteSwap(uint32_t value, bool bSwap) { +#ifdef __cpp_lib_byteswap + return bSwap ? std::byteswap(value) : value; +#else uint32_t result = 0; result |= (value & 0x000000FFU) << 24; result |= (value & 0x0000FF00U) << 8; result |= (value & 0x00FF0000U) >> 8; result |= (value & 0xFF000000U) >> 24; return bSwap ? result : value; +#endif } uint16_t Image::byteSwap(uint16_t value, bool bSwap) { +#ifdef __cpp_lib_byteswap + return bSwap ? std::byteswap(value) : value; +#else uint16_t result = 0; result |= (value & 0x00FFU) << 8; result |= (value & 0xFF00U) >> 8; return bSwap ? result : value; +#endif } uint16_t Image::byteSwap2(const DataBuf& buf, size_t offset, bool bSwap) { diff --git a/src/pgfimage.cpp b/src/pgfimage.cpp index 5c5c2c12..538b5bd9 100644 --- a/src/pgfimage.cpp +++ b/src/pgfimage.cpp @@ -28,12 +28,16 @@ const unsigned char pgfBlank[] = { namespace Exiv2 { static uint32_t byteSwap_(uint32_t value, bool bSwap) { +#ifdef __cpp_lib_byteswap + return bSwap ? std::byteswap(value) : value; +#else uint32_t result = 0; result |= (value & 0x000000FF) << 24; result |= (value & 0x0000FF00) << 8; result |= (value & 0x00FF0000) >> 8; result |= (value & 0xFF000000) >> 24; return bSwap ? result : value; +#endif } static uint32_t byteSwap_(Exiv2::DataBuf& buf, size_t offset, bool bSwap) {