6 #ifndef JBSON_ENDIAN_HPP
7 #define JBSON_ENDIAN_HPP
11 #include "./config.hpp"
13 JBSON_PUSH_DISABLE_DOCUMENTATION_WARNING
14 #include <boost/predef/other/endian.h>
15 JBSON_CLANG_POP_WARNINGS
21 template <
typename T,
typename ForwardIterator> T little_endian_to_native(ForwardIterator first, ForwardIterator last) {
22 static_assert(std::is_pod<T>::value,
"Can only byte swap POD types");
23 assert(std::distance(first, last) >= static_cast<ptrdiff_t>(
sizeof(T)));
24 last = std::next(first,
sizeof(T));
25 assert(std::distance(first, last) == static_cast<ptrdiff_t>(
sizeof(T)));
28 unsigned char u8[
sizeof(T)];
31 std::copy(first, last, source.u8);
33 #if BOOST_ENDIAN_BIG_BYTE
34 #warning "big endian untested"
35 std::reverse(std::begin(source.u8), std::end(source.u8));
36 #elif !BOOST_ENDIAN_LITTLE_BYTE
37 #error "unsupported endianness"
42 template <
typename T> std::array<char, sizeof(T)> native_to_little_endian(T val) {
43 using T2 = std::decay_t<T>;
44 static_assert(std::is_pod<T2>::value,
"Can only byte swap POD types");
48 std::array<char, sizeof(T2)> u8;
53 #if BOOST_ENDIAN_BIG_BYTE
54 #warning "big endian untested"
55 std::reverse(std::begin(source.u8), std::end(source.u8));
56 #elif !BOOST_ENDIAN_LITTLE_BYTE
57 #error "unsupported endianness"
65 #endif // JBSON_ENDIAN_HPP