ArkScript
A small, fast, functional and scripting language for video games
IntegerSerializer.hpp
Go to the documentation of this file.
1#ifndef ARK_COMPILER_SERIALIZATION_INTEGERSERIALIZER_HPP
2#define ARK_COMPILER_SERIALIZATION_INTEGERSERIALIZER_HPP
3
4#include <span>
5#include <vector>
6#include <concepts>
7
8namespace Ark::internal
9{
10 void serializeToVecLE(std::integral auto number, std::vector<uint8_t>& out)
11 {
12 constexpr auto mask = static_cast<decltype(number)>(0xff);
13
14 for (std::size_t i = 0; i < sizeof(decltype(number)); ++i)
15 out.push_back(static_cast<uint8_t>((number & (mask << (8 * i))) >> (8 * i)));
16 }
17
18 void serializeToVecBE(std::integral auto number, std::vector<uint8_t>& out)
19 {
20 constexpr auto pad = sizeof(decltype(number)) - 1;
21 constexpr auto mask = static_cast<decltype(number)>(0xff);
22
23 for (std::size_t i = 0; i < sizeof(decltype(number)); ++i)
24 {
25 const auto shift = 8 * (pad - i);
26 out.push_back(static_cast<uint8_t>((number & (mask << shift)) >> shift));
27 }
28 }
29
30 void serializeOn2BytesToVecLE(std::integral auto number, std::vector<uint8_t>& out)
31 {
32 constexpr auto mask = static_cast<decltype(number)>(0xff);
33 out.push_back(static_cast<uint8_t>(number & mask));
34 out.push_back(static_cast<uint8_t>((number & (mask << 8)) >> 8));
35 }
36
37 void serializeOn2BytesToVecBE(std::integral auto number, std::vector<uint8_t>& out)
38 {
39 constexpr auto mask = static_cast<decltype(number)>(0xff);
40 out.push_back(static_cast<uint8_t>((number & (mask << 8)) >> 8));
41 out.push_back(static_cast<uint8_t>(number & mask));
42 }
43
44 template <std::integral T>
45 T deserializeLE(std::vector<uint8_t>::const_iterator begin, std::vector<uint8_t>::const_iterator end)
46 {
47 constexpr std::size_t length = sizeof(T);
48 T result {};
49 for (std::size_t i = 0; i < length && begin != end; ++i, ++begin)
50 result += static_cast<T>(*begin) << (8 * i);
51
52 return result;
53 }
54
55 template <std::integral T>
56 T deserializeBE(std::vector<uint8_t>::const_iterator begin, std::vector<uint8_t>::const_iterator end)
57 {
58 constexpr std::size_t length = sizeof(T);
59 T result {};
60 for (std::size_t i = 0; i < length && begin != end; ++i, ++begin)
61 result += static_cast<T>(*begin) << (8 * (length - i - 1));
62
63 return result;
64 }
65}
66
67#endif // ARK_COMPILER_SERIALIZATION_INTEGERSERIALIZER_HPP
void serializeOn2BytesToVecLE(std::integral auto number, std::vector< uint8_t > &out)
void serializeToVecBE(std::integral auto number, std::vector< uint8_t > &out)
T deserializeBE(std::vector< uint8_t >::const_iterator begin, std::vector< uint8_t >::const_iterator end)
void serializeToVecLE(std::integral auto number, std::vector< uint8_t > &out)
void serializeOn2BytesToVecBE(std::integral auto number, std::vector< uint8_t > &out)
T deserializeLE(std::vector< uint8_t >::const_iterator begin, std::vector< uint8_t >::const_iterator end)