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) {
37 u64 strlen = s.size();
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) {
44 stream_read<u64>(stream, strlen);
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>
58 struct has_serialize<Container, std::void_t<serialize_t<Container>>> : std::true_type {};
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>
71 struct has_deserialize<Container, std::void_t<deserialize_t<Container>>> : std::true_type {
74 template<
typename Container>
77 enum VALIDATION_FLAGS {
81 class bytestreamException :
public std::exception {
83 explicit bytestreamException(
const char *message) : msg_(message) {}
85 explicit bytestreamException(
const std::string &message) : msg_(message) {}
87 virtual ~bytestreamException()
noexcept {}
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);
112 u64 len = vec.size();
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);
140 for (
u64 i = 0; i < len; i++) {
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);
152 u64 len = vec.size();
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 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 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