Skip to content

Commit 66611b0

Browse files
committed
the template/constexpr was a cool/dynamic swap version, but not needed. move to leverage the fast built in versions
1 parent f1d7ac6 commit 66611b0

File tree

2 files changed

+40
-11
lines changed

2 files changed

+40
-11
lines changed

src/sfeTk/sfeToolkit.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2424
*/
2525
#include "sfeToolkit.h"
2626

27+
//---------------------------------------------------------------------------------
2728
/**
2829
* @brief C function - Runtime check for system byte order
2930
*/
@@ -32,3 +33,39 @@ sfeTKByteOrder sfeToolkit::systemByteOrder(void)
3233
uint16_t i = 1;
3334
return *((uint8_t *)&i) == 0 ? sfeTKByteOrder::BigEndian : sfeTKByteOrder::LittleEndian;
3435
}
36+
37+
//---------------------------------------------------------------------------------
38+
/**
39+
* @brief to catch 8 bit calls for byte swap
40+
*
41+
*/
42+
uint8_t sfeToolkit::byte_swap(uint8_t i)
43+
{
44+
return i;
45+
}
46+
//---------------------------------------------------------------------------------
47+
/**
48+
* @brief function - Byte swap a 16 bit value
49+
*/
50+
uint16_t sfeToolkit::byte_swap(uint16_t i)
51+
{
52+
// Use the fast intrinsic if available
53+
#if defined(__clang__) || defined(__GNUC__)
54+
return __builtin_bswap16(i);
55+
#else
56+
return (i << 8) | (i >> 8);
57+
#endif
58+
}
59+
60+
//---------------------------------------------------------------------------------
61+
/**
62+
* @brief function - Byte swap a 32 bit value
63+
*/
64+
uint32_t sfeToolkit::byte_swap(uint32_t i)
65+
{
66+
#if defined(__clang__) || defined(__GNUC__)
67+
return __builtin_bswap32(i);
68+
#else
69+
return ((i << 24) & 0xff000000) | ((i << 8) & 0x00ff0000) | ((i >> 8) & 0x0000ff00) | ((i >> 24) & 0x000000ff);
70+
#endif
71+
}

src/sfeTk/sfeToolkit.h

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,8 @@ namespace sfeToolkit
4747
// Function to determine the byte order of the system
4848
sfeTKByteOrder systemByteOrder(void);
4949

50-
// Method to swap the byte order of any unsigned integer - you pick the size. Uses constexpr so it's a compile time
51-
// operation/inline/optimized
52-
//
53-
// from
54-
// https://stackoverflow.com/questions/36936584/how-to-write-constexpr-swap-function-to-change-endianess-of-an-integer
55-
//
56-
template <class T>
57-
constexpr typename std::enable_if<std::is_unsigned<T>::value, T>::type byte_swap(T i, T j = 0u, std::size_t n = 0u)
58-
{
59-
return n == sizeof(T) ? j : byte_swap<T>(i >> CHAR_BIT, (j << CHAR_BIT) | (i & (T)(unsigned char)(-1)), n + 1);
60-
}
50+
uint8_t byte_swap(uint8_t i);
51+
uint16_t byte_swap(uint16_t i);
52+
uint32_t byte_swap(uint32_t i);
6153

6254
}; // namespace sfeToolkit

0 commit comments

Comments
 (0)