TeaPacket v0.0.1
Multiplatform Game Engine
Loading...
Searching...
No Matches
Endianness.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <bit>
4#include <cstdint>
5
7{
8
9 constexpr bool IsBigEndian()
10 {
11 return std::endian::native == std::endian::big;
12 }
13
14 constexpr uint16_t SwapEndian16(uint16_t v)
15 {
16#if defined(__GNUG__)
17 return __builtin_bswap16(v);
18#elif __cplusplus >= 202302L
19 return std::byteswap(v);
20#else
21 return (v>>8) | (v<<8);
22#endif
23 }
24
25 constexpr uint32_t SwapEndian32(uint32_t v)
26 {
27#if defined(__GNUG__)
28 return __builtin_bswap32(v);
29#elif __cplusplus >= 202302L
30 return std::byteswap(v);
31#else
32 return ((v>>24)&0xff) | ((v<<8)&0xff0000) | ((v>>8)&0xff00) | ((v<<24)&0xff000000);
33#endif
34 }
35
36 constexpr uint64_t SwapEndian64(uint64_t v)
37 {
38#if defined(__GNUG__)
39 return __builtin_bswap64(v);
40#elif __cplusplus >= 202302L
41 return std::byteswap(v);
42#else
43 return SwapEndian32(v&0xFFFFFFFF) | SwapEndian32((v>>32)&0xFFFFFFFF);
44#endif
45 }
46
47
48 template<typename T>
49 T SwapEndian(T val) = delete;
50
51 template<>
52 inline uint16_t SwapEndian(uint16_t val)
53 {
54 return SwapEndian16(val);
55 }
56
57 template<>
58 inline uint32_t SwapEndian(uint32_t val)
59 {
60 return SwapEndian32(val);
61 }
62
63 template<>
64 inline uint64_t SwapEndian(uint64_t val)
65 {
66 return SwapEndian64(val);
67 }
68
69 template<>
70 inline int16_t SwapEndian(int16_t val)
71 {
72 return std::bit_cast<int16_t, uint16_t>(SwapEndian16(std::bit_cast<uint16_t, int16_t>(val)));
73 }
74
75 template<>
76 inline int32_t SwapEndian(int32_t val)
77 {
78 return std::bit_cast<int32_t, uint32_t>(SwapEndian32(std::bit_cast<uint32_t, int32_t>(val)));
79 }
80
81 template<>
82 inline int64_t SwapEndian(int64_t val)
83 {
84 return std::bit_cast<int64_t, uint64_t>(SwapEndian64(std::bit_cast<uint64_t, int64_t>(val)));
85 }
86
87}
Definition Endianness.hpp:7
T SwapEndian(T val)=delete
constexpr uint32_t SwapEndian32(uint32_t v)
Definition Endianness.hpp:25
constexpr bool IsBigEndian()
Definition Endianness.hpp:9
constexpr uint16_t SwapEndian16(uint16_t v)
Definition Endianness.hpp:14
constexpr uint64_t SwapEndian64(uint64_t v)
Definition Endianness.hpp:36