endian: add convenience selectable convertor
This commit is contained in:
parent
14fd62a64a
commit
a3dcdeb7a3
37
endian.hpp
37
endian.hpp
@ -20,8 +20,17 @@
|
|||||||
#ifndef __UTIL_ENDIAN_HPP
|
#ifndef __UTIL_ENDIAN_HPP
|
||||||
#define __UTIL_ENDIAN_HPP
|
#define __UTIL_ENDIAN_HPP
|
||||||
|
|
||||||
#include <cstdint>
|
#include "types/bits.hpp"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Uses the TIFF header values. Just because. Don't rely on this.
|
||||||
|
enum class endian : uint16_t {
|
||||||
|
BIG = 0x4D4D,
|
||||||
|
LITTLE = 0x4949,
|
||||||
|
};
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -68,5 +77,31 @@ template <typename T> constexpr T btoh (T v) { return bswap (v); }
|
|||||||
template <typename T> constexpr T ltoh (T v) { return v; }
|
template <typename T> constexpr T ltoh (T v) { return v; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
struct from_endian {
|
||||||
|
from_endian (endian _endian):
|
||||||
|
src (_endian)
|
||||||
|
{ ; }
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T operator() (const T v) const {
|
||||||
|
static_assert (std::is_integral<T>::value || std::is_enum<T>::value,
|
||||||
|
"endian conversion is only defined for integrals currently");
|
||||||
|
|
||||||
|
auto u = static_cast<
|
||||||
|
typename std::conditional<
|
||||||
|
std::is_signed<T>::value,
|
||||||
|
typename sized_type<T>::sint,
|
||||||
|
typename sized_type<T>::uint
|
||||||
|
>::type
|
||||||
|
> (v);
|
||||||
|
|
||||||
|
return static_cast<T> (
|
||||||
|
(src == endian::LITTLE) ? ltoh (u) : btoh (u)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
endian src;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user