From 5cdd4f883523520c768a5a387d723a504b4922f8 Mon Sep 17 00:00:00 2001 From: Luna Date: Fri, 18 Jul 2025 07:16:38 +0200 Subject: [PATCH] Namespaced everything --- src/buffer.h | 133 ++++++++++++++--------------- src/file_deserialising.h | 176 ++++++++++++++++++++------------------- src/file_read.h | 21 +++-- 3 files changed, 170 insertions(+), 160 deletions(-) diff --git a/src/buffer.h b/src/buffer.h index 8f3b21c..6cf5664 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -4,80 +4,83 @@ #include #define BUFFER_SIZE 1024 -template -struct buffer +namespace file_reader { - buffer() + template + struct buffer { - data = nullptr; - size = 0; - allocated = 0; - allocations = 0; + buffer() + { + data = nullptr; + size = 0; + allocated = 0; + allocations = 0; + } + T *data; + size_t size; + size_t allocated; + int allocations; + + void write(T *data_in, size_t data_size); + void remove(int offset, int remove_size); + void allocate(size_t s); + + buffer(const buffer&) = delete; + ~buffer() + { + if (allocated > 0) + free(data); + } + }; + + template + void buffer::write(T *data_in, size_t data_size) + { + if (data_size > allocated - size) + { + allocated += (size + data_size) + BUFFER_SIZE; + data = (T *)realloc(data, allocated); + allocations++; + if (!data) + { + throw std::runtime_error("Allocation failed"); + } + } + std::memcpy(&data[size], data_in, data_size); + size += data_size; } - T *data; - size_t size; - size_t allocated; - int allocations; - void write(T *data_in, size_t data_size); - void remove(int offset, int remove_size); - void allocate(size_t s); - - buffer(const buffer&) = delete; - ~buffer() + template + void buffer::remove(int offset, int remove_size) { - if (allocated > 0) - free(data); - } -}; - -template -void buffer::write(T *data_in, size_t data_size) -{ - if (data_size > allocated - size) - { - allocated += (size + data_size) + BUFFER_SIZE; - data = (T *)realloc(data, allocated); + if (offset + remove_size > size) + return ; + T *new_data = (T *)calloc(allocated, sizeof(T)); + if (!new_data) + { + throw std::runtime_error("Allocation failed"); + } + if (offset > 0) + { + std::memcpy(new_data, data, offset); + } + int new_size = size - remove_size; + std::memcpy(&new_data[offset], &data[offset + remove_size], new_size - offset); + free(data); + data = new_data; + size = new_size; allocations++; + } + + template + void buffer::allocate(size_t s) + { + data = (T *)realloc(data, allocated + s); if (!data) { throw std::runtime_error("Allocation failed"); } + allocations++; + allocated += s; } - std::memcpy(&data[size], data_in, data_size); - size += data_size; -} - -template -void buffer::remove(int offset, int remove_size) -{ - if (offset + remove_size > size) - return ; - T *new_data = (T *)calloc(allocated, sizeof(T)); - if (!new_data) - { - throw std::runtime_error("Allocation failed"); - } - if (offset > 0) - { - std::memcpy(new_data, data, offset); - } - int new_size = size - remove_size; - std::memcpy(&new_data[offset], &data[offset + remove_size], new_size - offset); - free(data); - data = new_data; - size = new_size; - allocations++; -} - -template -void buffer::allocate(size_t s) -{ - data = (T *)realloc(data, allocated + s); - if (!data) - { - throw std::runtime_error("Allocation failed"); - } - allocations++; - allocated += s; } diff --git a/src/file_deserialising.h b/src/file_deserialising.h index fefb141..cba7e1d 100644 --- a/src/file_deserialising.h +++ b/src/file_deserialising.h @@ -4,7 +4,7 @@ #include #include #include "buffer.h" -#define read_comp(size, ptr, t) const_for_([&](auto i){read_var>>::call(std::get(t), &ptr);}); +#define read_comp(size, ptr, t) ::file_reader::const_for_([&](auto i){::file_reader::read_var>>::call(std::get(t), &ptr);}); #ifdef __APPLE__ #include @@ -26,99 +26,103 @@ #define le64toh(x) OSSwapLittleToHostInt64(x) #endif -struct parsing_buffer -{ - parsing_buffer(buffer &b) - :buf(b) - {} - buffer &buf; - char *point; - int consumed_size; -}; -template -static void read_type(T& val, char *data) +namespace file_reader { - std::memcpy(&val, data, sizeof(T)); - switch (sizeof(T)) + struct parsing_buffer { - case 1: - break; - case 2: - val = be16toh(val); - break; - case 4: - val = be32toh(val); - break; - case 8: - val = be64toh(val); - break; - default: - std::println("This integer is not supported!"); - } -} + parsing_buffer(buffer &b) + :buf(b) + {} + buffer &buf; + char *point; + int consumed_size; + }; -template <> -inline void read_type(float &val, char *data) -{ - uint32_t num_as_uint32; - - memcpy(&num_as_uint32, data, sizeof(float)); - num_as_uint32 = be32toh(num_as_uint32); - memcpy(&val, &num_as_uint32, sizeof(float)); -} - -template <> -inline void read_type(double &val, char *data) -{ - uint64_t num_as_uint64; - - memcpy(&num_as_uint64, data, sizeof(double)); - num_as_uint64 = be64toh(num_as_uint64); - memcpy(&val, &num_as_uint64, sizeof(double)); -} - -template<> -inline void read_type>(buffer &val, char *data) -{ - val.allocated = val.size + 1; - val.data = (char *)calloc(val.size + 1,sizeof(char)); - std::memcpy(val.data, data, val.size); -} - -template -struct read_var -{ - static void call(T& val, parsing_buffer* v) + template + static void read_type(T& val, char *data) { - int size = 0; - if constexpr (typeid(T) == typeid(buffer)) - size = val.size; - else - size = sizeof(T); - if (size + v->consumed_size > v->buf.size) + std::memcpy(&val, data, sizeof(T)); + switch (sizeof(T)) { - if constexpr (typeid(T) == typeid(buffer)) - { - val.size = v->buf.size; - } - else - return ; + case 1: + break; + case 2: + val = be16toh(val); + break; + case 4: + val = be32toh(val); + break; + case 8: + val = be64toh(val); + break; + default: + std::println("This integer is not supported!"); } - read_type(val, v->point); - v->point += size; - v->consumed_size += size; } -}; + + template <> + inline void read_type(float &val, char *data) + { + uint32_t num_as_uint32; + + memcpy(&num_as_uint32, data, sizeof(float)); + num_as_uint32 = be32toh(num_as_uint32); + memcpy(&val, &num_as_uint32, sizeof(float)); + } + + template <> + inline void read_type(double &val, char *data) + { + uint64_t num_as_uint64; + + memcpy(&num_as_uint64, data, sizeof(double)); + num_as_uint64 = be64toh(num_as_uint64); + memcpy(&val, &num_as_uint64, sizeof(double)); + } + + template<> + inline void read_type>(buffer &val, char *data) + { + val.allocated = val.size + 1; + val.data = (char *)calloc(val.size + 1,sizeof(char)); + std::memcpy(val.data, data, val.size); + } + + template + struct read_var + { + static void call(T& val, parsing_buffer* v) + { + int size = 0; + if constexpr (typeid(T) == typeid(buffer)) + size = val.size; + else + size = sizeof(T); + if (size + v->consumed_size > v->buf.size) + { + if constexpr (typeid(T) == typeid(buffer)) + { + val.size = v->buf.size; + } + else + return ; + } + read_type(val, v->point); + v->point += size; + v->consumed_size += size; + } + }; -template constexpr void const_for_each_(std::integer_sequence, F&& func) -{ - (func(std::integral_constant{}), ...); -} - -template constexpr void const_for_(F&& func) -{ - if constexpr (N > 0) - const_for_each_(std::make_integer_sequence{}, std::forward(func)); + template constexpr void const_for_each_(std::integer_sequence, F&& func) + { + (func(std::integral_constant{}), ...); + } + + template constexpr void const_for_(F&& func) + { + if constexpr (N > 0) + const_for_each_(std::make_integer_sequence{}, std::forward(func)); + } } diff --git a/src/file_read.h b/src/file_read.h index 004cef1..edebb34 100644 --- a/src/file_read.h +++ b/src/file_read.h @@ -5,15 +5,17 @@ #include #include -enum RESULT +namespace file_reader { - READ_CORRECT, //read was as expected - READ_INCOMPLETE, //read is incomplete (probably because of the file ending) - READ_FILE_ENDED //cannot read because there's not more file to read -}; + enum RESULT + { + READ_CORRECT, //read was as expected + READ_INCOMPLETE, //read is incomplete (probably because of the file ending) + READ_FILE_ENDED //cannot read because there's not more file to read + }; -class file_reader -{ + class file_reader + { public: explicit file_reader(int file_fd) :fd(file_fd) @@ -75,7 +77,7 @@ class file_reader return std::make_pair(0, READ_FILE_ENDED); constexpr std::size_t size_tuple = sizeof...(T); int size = 0; - + size_t total_read_size = 0; const_for_([&](auto i) { @@ -192,4 +194,5 @@ class file_reader int fd; off_t file_size; off_t file_size_remaining; -}; + }; +}