From 3944277f6dfb18db0fd16c8a6bcc59ede91e66be Mon Sep 17 00:00:00 2001 From: Luna Date: Mon, 30 Jun 2025 18:13:50 +0200 Subject: [PATCH] Very very experimental buffer read from deserializer --- CMakeLists.txt | 3 ++- buffer.h | 4 ++-- file_deserialising.h | 38 +++++++++++++++++++++++++------------- file_read.h | 21 +++++++++++++++++---- 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a40dc91..e74f44e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,4 +6,5 @@ set(CMAKE_CXX_STANDARD 23) add_library(file_read STATIC file_deserialising.h buffer.cpp - buffer.h) + buffer.h + file_read.h) diff --git a/buffer.h b/buffer.h index 9d33a87..9ed33ec 100644 --- a/buffer.h +++ b/buffer.h @@ -7,8 +7,8 @@ struct buffer { char *data; - int size; - int allocated; + size_t size; + size_t allocated; void write(char *data_in, int data_size); void remove(int offset, int remove_size); diff --git a/file_deserialising.h b/file_deserialising.h index a27c562..de0fbfa 100644 --- a/file_deserialising.h +++ b/file_deserialising.h @@ -2,10 +2,12 @@ #include #include #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]);}); #ifdef __APPLE__ #include -#define read_comp(size, ptr, t) const_for_([&](auto i){std::get(t) = read_var>::call(&ptr);}); + #define htobe16(x) OSSwapHostToBigInt16(x) @@ -35,13 +37,13 @@ struct parsing_buffer }; template -static T read_type(char *data) +static T read_type(char *data, size_t size) { T a; - std::memcpy(&a, data, sizeof(T)); + std::memcpy(&a, data, size); - switch (sizeof(T)) + switch (size) { case 1: break; @@ -61,40 +63,50 @@ static T read_type(char *data) } template <> -float read_type(char *data) +float read_type(char *data, size_t size) { uint32_t num_as_uint32; float num; - memcpy(&num_as_uint32, data, sizeof(uint32_t)); + memcpy(&num_as_uint32, data, size); num_as_uint32 = be32toh(num_as_uint32); - memcpy(&num, &num_as_uint32, sizeof(float)); + memcpy(&num, &num_as_uint32, size); return num; } template <> -double read_type(char *data) +double read_type(char *data, size_t size) { uint64_t num_as_uint64; double num; - memcpy(&num_as_uint64, data, sizeof(uint64_t)); + memcpy(&num_as_uint64, data, size); num_as_uint64 = be64toh(num_as_uint64); - memcpy(&num, &num_as_uint64, sizeof(double)); + memcpy(&num, &num_as_uint64, size); return num; } +template<> +buffer read_type(char *data, size_t size) +{ + buffer ret; + ret.allocated = size + 1; + ret.size = size; + ret.data = (char *)malloc(size * sizeof(char) + 1); + + return ret; +} template struct read_var { - static T call(parsing_buffer* v) + static T call(parsing_buffer* v, size_t size) { - if (sizeof(T) + v->consumed_size > v->buf.size) + if (size + v->consumed_size > v->buf.size) return T{}; - T ret = read_type(v->point); + T ret = read_type(v->point, size); v->point += sizeof(T); v->consumed_size += sizeof(T); return ret; diff --git a/file_read.h b/file_read.h index d27a599..cace9b3 100644 --- a/file_read.h +++ b/file_read.h @@ -17,11 +17,24 @@ class file_reader } template - std::tuple read_from_tuple(std::tuple in) + std::tuple read_from_tuple(std::tuple &in) { - constexpr std::size_t size_tuple = std::tuple_size_v; + constexpr std::size_t size_tuple = sizeof...(T); int size = 0; - const_for_([&](auto i){size += sizeof(std::get(in));}); + std::array sizes; + const_for_([&](auto i) + { + if (typeid(std::get(in)) == typeid(buffer)) + { + size += std::get(in).size; + sizes[i.value] = std::get(in).size; + } + else + { + size += sizeof(std::get(in)); + sizes[i.value] = sizeof(std::get(in)); + } + }); if (size > buf.size) { int extra_size = 0; @@ -47,7 +60,7 @@ class file_reader parsing_buffer par_buf(buf); par_buf.point = buf.data; par_buf.consumed_size = 0; - read_comp(size_tuple, par_buf, in); + read_comp(size_tuple, par_buf, in, sizes); buf.remove(0, size); return in; }