So something like this:
#if defined(_MSC_VER)
#include <intrin.h>
#endif
#include <cstdint>
template<typename T>
struct big_endian
{
T operator =( T value );
operator T();
private:
big_endian();
};
template<>
struct big_endian<std::uint32_t>
{
big_endian() = default;
big_endian( std::uint32_t value );
std::uint32_t operator =( std::uint32_t value );
operator std::uint32_t();
private:
std::uint32_t swap( std::uint32_t value );
std::uint32_t m_value;
};
inline
big_endian<std::uint32_t>::big_endian( std::uint32_t value )
{
m_value = swap( value );
}
inline
std::uint32_t big_endian<std::uint32_t>::operator =( std::uint32_t value )
{
m_value = swap( value );
return value;
}
inline
big_endian<std::uint32_t>::operator std::uint32_t()
{
return swap( m_value );
}
inline
std::uint32_t big_endian<std::uint32_t>::swap( std::uint32_t value )
{
#if defined(_MSC_VER)
return _byteswap_ulong( value );
#elif defined(__GNUC__)
return __builtin_bswap32( value );
#else
std::uint32_t swapA = (value & 0x0000FFFFu) << 16,
swapB = (value & 0xFFFF0000u) >> 16;
return (swapA & 0x00FF00FFu) << 8 | (swapA & 0xFF00FF00u) >> 8;
#endif
}