From 3f301ae2fd4bf2a882cfe632083eedcd87407d18 Mon Sep 17 00:00:00 2001 From: anulax1225 Date: Mon, 25 Mar 2024 22:37:24 +0100 Subject: [PATCH] Added the packet class from bakanet and renamed it for general use --- src/bakatools/data_struct/data_stream.h | 58 +++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/bakatools/data_struct/data_stream.h diff --git a/src/bakatools/data_struct/data_stream.h b/src/bakatools/data_struct/data_stream.h new file mode 100644 index 0000000..4db2f2c --- /dev/null +++ b/src/bakatools/data_struct/data_stream.h @@ -0,0 +1,58 @@ +#pragma once + +namespace Bk::Net { + class DataStream + { + public: + DataStream() = default; + DataStream(std::vector data) + : payload(data) {} + + int size() { return payload.size(); } + + template + void push(const T& data) + { + static_assert(std::is_standard_layout::value, "Data is too complex to be pushed into vector"); + size_t i = payload.size(); + payload.resize(i + sizeof(T)); + std::memcpy(payload.data() + i, &data, sizeof(T)); + } + + template + void push(const T* data, int size) + { + for(int i = 0; i < size; i++) push(data[i]); + } + + template + T pull() + { + static_assert(std::is_standard_layout::value, "Data is too complex to be pulled from vector"); + T data; + size_t i = payload.size() - sizeof(T); + std::memcpy(&data, payload.data() + i, sizeof(T)); + payload.resize(i); + return data; + } + + template + std::unique_ptr pull(int size) + { + std::unique_ptr data(new T[size]); + for(int i = size - 1; i >= 0; i--) data[i] = pull(); + return data; + } + + bool append_data(std::vector data) + { + if (!data.size()) return false; + size_t i = payload.size(); + payload.resize(i + data.size()); + std::memcpy(payload.data() + i, data.data(), sizeof(char) * data.size()); + return true; + } + + std::vector payload; + }; +} \ No newline at end of file