14 #if __cplusplus >= 202002L
20 #if __cplusplus >= 202002L
34 little = __ORDER_LITTLE_ENDIAN__,
35 big = __ORDER_BIG_ENDIAN__,
46 if (
sizeof(
T) > nBytes)
48 throw std::out_of_range(
"buffer too small");
51 std::memcpy(ptr, &val,
sizeof(
T));
58 std::memcpy(&r, ptr,
sizeof(
T));
64 template <
typename TAlias,
typename T>
76 return byteswapAlias<std::uint8_t>(val);
81 return byteswapAlias<std::uint8_t>(val);
86 inline std::uint16_t
byteswap(std::uint16_t val)
88 return (
static_cast<std::uint16_t
>(val << 8) & 0xFF00u) | (
static_cast<std::uint16_t
>(val >> 8) & 0x00FFu);
93 return byteswapAlias<std::uint16_t>(val);
98 inline std::uint32_t
byteswap(std::uint32_t val)
100 val = ((val << 8) & 0xFF00FF00u) | ((val >> 8) & 0x00FF00FFu);
101 return ((val << 16) & 0xFFFF0000u) | ((val >> 16) & 0x0000FFFFu);
106 return byteswapAlias<std::uint32_t>(val);
126 val = ((val << 8) & 0xFF00FF00FF00FF00ull) | ((val >> 8) & 0x00FF00FF00FF00FFull);
127 val = ((val << 16) & 0xFFFF0000FFFF0000ull) | ((val >> 16) & 0x0000FFFF0000FFFFull);
128 return ((val << 32) & 0xFFFFFFFF00000000ull) | ((val >> 32) & 0x00000000FFFFFFFFull);
133 return byteswapAlias<std::uint64_t>(val);
151 template <
typename TAlias,
typename T>
154 return static_cast<T>(
byteswap(
static_cast<TAlias
>(val)));
161 template <endian frompar, endian topar>
164 static constexpr
auto from = frompar;
165 static constexpr
auto to = topar;
169 template <
typename T>
175 template <
typename T>
176 static void convertTo(
void* pDest,
size_t nSize,
const T& val)
178 writeUnaligned<T>(pDest, nSize,
convert(val));
181 template <
typename T>
184 return convert<T>(readUnaligned<T>(pSrc));
187 template <
typename T>
191 vec.reserve(std::max(
sizeof(
T), capacity));
192 vec.resize(
sizeof(
T));
193 convertTo<T>(vec.data(), vec.size(), val);
198 template <
typename T,
class TInputIt>
199 static bool convertFrom(
T& rval, TInputIt& first,
const TInputIt& last)
201 uint8_t buf[
sizeof(
T)];
203 while (idx <
sizeof(
T))
214 rval = convertFrom<T>(buf);
220 template <endian frompar>
223 static constexpr
auto from = frompar;
224 static constexpr
auto to = frompar;
228 template <
typename T>
234 template <
typename T>
235 static void convertTo(
void* pDest,
size_t nSize,
const T& val)
240 template <
typename T>
243 return readUnaligned<T>(pSrc);
246 template <
typename T>
250 vec.reserve(std::max(
sizeof(
T), capacity));
251 vec.resize(
sizeof(
T));
252 convertTo<T>(vec.data(), vec.size(), val);
257 template <
typename T,
class TInputIt>
260 uint8_t buf[
sizeof(
T)] = {0};
264 while ((idx <
sizeof(
T)) && (first < last))
275 rval = convertFrom<T>(buf);
283 template <
typename T>
289 template <
typename T>
295 template <
typename T>
301 template <
typename T>
309 template <
typename T>
315 template <
typename T>
321 template <
typename T>
324 const std::uint8_t* ptr8 =
static_cast<const std::uint8_t*
>(ptr);
329 template <
typename T>
332 const std::uint8_t* ptr8 =
static_cast<const std::uint8_t*
>(ptr);