2#include "../utility/assert.h"
3#include "../utility/bits.h"
4#include "../utility/meta.h"
5#include "../utility/parameter.h"
7#include "../stream/serialize_traits.h"
19 template<
typename T, T = (std::numeric_limits<T>::min)(), T = (std::numeric_limits<T>::max)()>
22#pragma region const integral types
29 template<
typename T, T Min, T Max>
32 static_assert(
sizeof(T) <= 8,
"Integers larger than 8 bytes are currently not supported. You will have to write this functionality yourself");
40 template<
typename Stream>
44 static_assert(Min < Max);
50 static_assert(num_bits <=
sizeof(T) * 8);
52 if constexpr (
sizeof(T) > 4 && num_bits > 32)
55 uint32_t unsigned_value =
static_cast<uint32_t
>(value - Min);
56 BS_ASSERT(writer.serialize_bits(unsigned_value, 32));
58 unsigned_value =
static_cast<uint32_t
>((value - Min) >> 32);
59 BS_ASSERT(writer.serialize_bits(unsigned_value, num_bits - 32));
64 uint32_t unsigned_value =
static_cast<uint32_t
>(value - Min);
65 BS_ASSERT(writer.serialize_bits(unsigned_value, num_bits));
77 template<
typename Stream>
81 static_assert(Min < Max);
85 static_assert(num_bits <=
sizeof(T) * 8);
87 if constexpr (
sizeof(T) > 4 && num_bits > 32)
91 uint32_t unsigned_value;
93 BS_ASSERT(reader.serialize_bits(unsigned_value, 32));
94 value |=
static_cast<T
>(unsigned_value);
96 BS_ASSERT(reader.serialize_bits(unsigned_value, num_bits - 32));
97 value |=
static_cast<T
>(unsigned_value) << 32;
104 uint32_t unsigned_value;
105 BS_ASSERT(reader.serialize_bits(unsigned_value, num_bits));
107 value =
static_cast<T
>(unsigned_value) + Min;
117#pragma region integral types
123 struct serialize_traits<T, typename std::enable_if_t<std::is_integral_v<T> && !std::is_const_v<T>>>
125 static_assert(
sizeof(T) <= 8,
"Integers larger than 8 bytes are currently not supported. You will have to write this functionality yourself");
135 template<
typename Stream>
147 if constexpr (
sizeof(T) > 4)
152 uint32_t unsigned_value =
static_cast<uint32_t
>(value - min);
153 BS_ASSERT(writer.serialize_bits(unsigned_value, 32));
155 unsigned_value =
static_cast<uint32_t
>((value - min) >> 32);
156 BS_ASSERT(writer.serialize_bits(unsigned_value, num_bits - 32));
163 uint32_t unsigned_value =
static_cast<uint32_t
>(value - min);
164 BS_ASSERT(writer.serialize_bits(unsigned_value, num_bits));
177 template<
typename Stream>
179 static serialize(Stream& reader, T& value, T min, T max)
noexcept
187 if constexpr (
sizeof(T) > 4)
193 uint32_t unsigned_value;
195 BS_ASSERT(reader.serialize_bits(unsigned_value, 32));
196 value |=
static_cast<T
>(unsigned_value);
198 BS_ASSERT(reader.serialize_bits(unsigned_value, num_bits - 32));
199 value |=
static_cast<T
>(unsigned_value) << 32;
210 uint32_t unsigned_value;
211 BS_ASSERT(reader.serialize_bits(unsigned_value, num_bits));
213 value =
static_cast<T
>(unsigned_value) + min;
226 template<
typename Stream,
typename U>
227 static bool serialize(Stream& stream, U&& value)
noexcept
#define BS_ASSERT(...)
Definition assert.h:15
constexpr uint32_t bits_in_range(intmax_t min, intmax_t max)
Definition bits.h:22
std::enable_if_t< T::writing, R > is_writing_t
Definition meta.h:25
std::enable_if_t< T::reading, R > is_reading_t
Definition meta.h:28
Definition bounded_range.h:28
std::conditional_t<(sizeof(T)<=16 &&std::is_trivially_copy_constructible_v< T >), std::add_const_t< T >, std::add_lvalue_reference_t< std::add_const_t< T > > > in
Passes by const or const reference depending on size.
Definition parameter.h:89
Wrapper type for compiletime known integer bounds.
Definition integral_traits.h:20
static utility::is_writing_t< Stream > serialize(Stream &writer, in< T > value, T min, T max) noexcept
Writes an integer into the writer.
Definition integral_traits.h:137
static utility::is_reading_t< Stream > serialize(Stream &reader, T &value, T min, T max) noexcept
Reads an integer from the reader into value.
Definition integral_traits.h:179
static bool serialize(Stream &stream, U &&value) noexcept
Writes or reads an integer into the stream.
Definition integral_traits.h:227
static utility::is_writing_t< Stream > serialize(Stream &writer, in< T > value) noexcept
Writes an integer into the writer.
Definition integral_traits.h:42
static utility::is_reading_t< Stream > serialize(Stream &reader, T &value) noexcept
Reads an integer from the writer into value.
Definition integral_traits.h:79
A class for specializing trait serialization functions.
Definition serialize_traits.h:11