diff --git a/file_deserialising.h b/file_deserialising.h index de0fbfa..5955c3f 100644 --- a/file_deserialising.h +++ b/file_deserialising.h @@ -4,7 +4,7 @@ #include #include #include "buffer.h" -#define read_comp(size, ptr, t, sizes) const_for_([&](auto i){std::get(t) = read_var>>::call(&ptr, sizes[i.value]);}); +#define read_comp(size, ptr, t, sizes) const_for_([&](auto i){read_var>>::call(std::get(t), &ptr, sizes[i.value]);}); #ifdef __APPLE__ #include @@ -37,79 +37,65 @@ struct parsing_buffer }; template -static T read_type(char *data, size_t size) +static void read_type(T& val, char *data, size_t size) { - T a; - - std::memcpy(&a, data, size); - switch (size) { case 1: break; case 2: - a = be16toh(a); + val = be16toh(val); break; case 4: - a = be32toh(a); + val = be32toh(val); break; case 8: - a = be64toh(a); + val = be64toh(val); break; default: std::println("This integer is not supported!"); } - return a; } template <> -float read_type(char *data, size_t size) +void read_type(float &val, char *data, size_t size) { uint32_t num_as_uint32; - float num; memcpy(&num_as_uint32, data, size); num_as_uint32 = be32toh(num_as_uint32); - memcpy(&num, &num_as_uint32, size); - - return num; + memcpy(&val, &num_as_uint32, size); } template <> -double read_type(char *data, size_t size) +void read_type(double &val, char *data, size_t size) { uint64_t num_as_uint64; - double num; memcpy(&num_as_uint64, data, size); num_as_uint64 = be64toh(num_as_uint64); - memcpy(&num, &num_as_uint64, size); - - return num; + memcpy(&val, &num_as_uint64, size); } template<> -buffer read_type(char *data, size_t size) +void read_type(buffer &val, char *data, size_t size) { - buffer ret; - ret.allocated = size + 1; - ret.size = size; - ret.data = (char *)malloc(size * sizeof(char) + 1); - - return ret; + val.allocated = size + 1; + val.size = size; + val.data = (char *)malloc(size * sizeof(char) + 1); + std::memcpy(val.data, data, size); } template struct read_var { - static T call(parsing_buffer* v, size_t size) + static void call(T& val, parsing_buffer* v, size_t size) { if (size + v->consumed_size > v->buf.size) - return T{}; - T ret = read_type(v->point, size); - v->point += sizeof(T); - v->consumed_size += sizeof(T); - return ret; + return ; + read_type(val, v->point, size); + v->point += size; + v->consumed_size += size; } }; diff --git a/file_read.h b/file_read.h index cace9b3..376cec4 100644 --- a/file_read.h +++ b/file_read.h @@ -17,14 +17,14 @@ class file_reader } template - std::tuple read_from_tuple(std::tuple &in) + void read_from_tuple(std::tuple &in) { constexpr std::size_t size_tuple = sizeof...(T); int size = 0; std::array sizes; const_for_([&](auto i) { - if (typeid(std::get(in)) == typeid(buffer)) + if constexpr (typeid(std::get(in)) == typeid(buffer)) { size += std::get(in).size; sizes[i.value] = std::get(in).size; @@ -62,7 +62,6 @@ class file_reader par_buf.consumed_size = 0; read_comp(size_tuple, par_buf, in, sizes); buf.remove(0, size); - return in; } buffer buf; int fd;