27 inline void stream_write(std::basic_stringstream<byte> &stream, T &
obj) {
28 stream.write(
reinterpret_cast<byte const *
>(&
obj),
sizeof(
obj));
32 inline void stream_read(std::basic_stringstream<byte> &stream, T &
obj) {
33 stream.read(
reinterpret_cast<byte *
>(&
obj),
sizeof(
obj));
36 inline void stream_write_string(std::basic_stringstream<byte> &stream, std::string &s) {
38 stream_write(stream,
strlen);
39 stream.write(
reinterpret_cast<byte const *
>(s.data()),
strlen *
sizeof(
char));
42 inline void stream_read_string(std::basic_stringstream<byte> &stream, std::string &s) {
46 stream.read(
reinterpret_cast<byte *
>(s.data()),
strlen *
sizeof(
char));
51 using serialize_t =
decltype(std::declval<T>().serialize(
52 std::declval<std::basic_stringstream<byte> &>()));
54 template<
typename Container,
typename = std::
void_t<>>
57 template<
typename Container>
60 template<
typename Container>
65 =
decltype(T::deserialize(std::declval<std::basic_stringstream<byte> &>()));
67 template<
typename Container,
typename = std::
void_t<>>
70 template<
typename Container>
74 template<
typename Container>
77 enum VALIDATION_FLAGS {
89 virtual const char *what()
const noexcept {
return msg_.c_str(); }
107 details::has_serialize_v<T>,
"the template class must have serialize implemented");
109 u32 flag = details::VALIDATION_FLAGS::VECTOR;
110 stream_write(stream,
flag);
113 stream_write(stream,
len);
130 details::has_serialize_v<T>,
"the template class must have deserialize implemented");
133 stream_read(stream,
flag);
134 if (
flag != details::VALIDATION_FLAGS::VECTOR) {
139 stream_read(stream,
len);
141 vec.push_back(T::deserialize(stream));
146 inline void stream_write_vector_trivial(
147 std::basic_stringstream<byte> &stream, std::vector<T> &vec) {
149 u32 flag = details::VALIDATION_FLAGS::VECTOR;
150 stream_write(stream,
flag);
153 stream_write(stream,
len);
155 stream.write(
reinterpret_cast<byte const *
>(vec.data()),
len *
sizeof(T));
168 std::basic_stringstream<byte> &stream, std::vector<T> &vec) {
171 stream_read(stream,
flag);
172 if (
flag != details::VALIDATION_FLAGS::VECTOR) {
177 stream_read(stream,
len);
180 stream.read(
reinterpret_cast<byte *
>(vec.data()),
len *
sizeof(T));
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
Namespace for internal details of the logs module.
namespace for basic c++ utilities
void stream_read_vector(std::basic_stringstream< byte > &stream, std::vector< T > &vec)
read a vector from the bytestream Note : this appends read objects to the vector without resetting it
void throw_with_loc(std::string message, SourceLocation loc=SourceLocation{})
Throw an exception and append the source location to it.
void stream_read_vector_trivial(std::basic_stringstream< byte > &stream, std::vector< T > &vec)
read a vector from the bytestream Note : this appends read objects to the vector without resetting it
void stream_write_vector(std::basic_stringstream< byte > &stream, std::vector< T > &vec)
write the vector into the bytestream