12#ifndef ROC_CORE_ENDIAN_OPS_H_
13#define ROC_CORE_ENDIAN_OPS_H_
15#include "roc_core/cpu_traits.h"
26 return reverse_octets_(v);
37 return reverse_octets_(v);
44 return reverse_octets_(v);
54 static inline uint8_t reverse_octets_(uint8_t v) {
58 static inline int8_t reverse_octets_(int8_t v) {
62 static inline uint16_t reverse_octets_(uint16_t v) {
63 return uint16_t((v >> 8) & 0xffu) | uint16_t((v & 0xffu) << 8);
66 static inline int16_t reverse_octets_(int16_t v) {
67 return (int16_t)reverse_octets_((uint16_t)v);
70 static inline uint32_t reverse_octets_(uint32_t v) {
71 return (((v & 0xff000000u) >> 24) | ((v & 0x00ff0000u) >> 8)
72 | ((v & 0x0000ff00u) << 8) | ((v & 0x000000ffu) << 24));
75 static inline int32_t reverse_octets_(int32_t v) {
76 return (int32_t)reverse_octets_((uint32_t)v);
79 static inline uint64_t reverse_octets_(uint64_t v) {
80 return ((v & 0x00000000ffffffffu) << 32) | ((v & 0xffffffff00000000u) >> 32)
81 | ((v & 0x0000ffff0000ffffu) << 16) | ((v & 0xffff0000ffff0000u) >> 16)
82 | ((v & 0x00ff00ff00ff00ffu) << 8) | ((v & 0xff00ff00ff00ff00u) >> 8);
85 static inline int64_t reverse_octets_(int64_t v) {
86 return (int64_t)reverse_octets_((uint64_t)v);
89 template <
class T>
static inline T reverse_octets_(T v) {
90 enum { NumOctets =
sizeof(T) };
94 char octets[
sizeof(T)];
105 std::swap(u.octets[0], u.octets[1]);
109 std::swap(u.octets[0], u.octets[2]);
113 std::swap(u.octets[0], u.octets[3]);
114 std::swap(u.octets[1], u.octets[2]);
118 std::swap(u.octets[0], u.octets[4]);
119 std::swap(u.octets[1], u.octets[3]);
123 std::swap(u.octets[0], u.octets[5]);
124 std::swap(u.octets[1], u.octets[4]);
125 std::swap(u.octets[2], u.octets[3]);
129 std::swap(u.octets[0], u.octets[6]);
130 std::swap(u.octets[1], u.octets[5]);
131 std::swap(u.octets[2], u.octets[4]);
135 std::swap(u.octets[0], u.octets[7]);
136 std::swap(u.octets[1], u.octets[6]);
137 std::swap(u.octets[2], u.octets[5]);
138 std::swap(u.octets[3], u.octets[4]);
142 for (
size_t n = 0; n < NumOctets / 2; n++) {
143 std::swap(u.octets[n], u.octets[NumOctets - n - 1]);
static T swap_native_be(T v)
Swap between native endian and big endian.
static T swap_native_le(T v)
Swap between native endian and little endian.
static T swap_endian(T v)
Swap between endians.
Commonly used types and functions.