From c51a61c0f0de65a3e64f589816a56f21ed4e8528 Mon Sep 17 00:00:00 2001 From: rtk0c Date: Sun, 15 Aug 2021 17:14:06 -0700 Subject: Initial work on data streams --- core/src/Utils/IO/DataStream.hpp | 123 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 core/src/Utils/IO/DataStream.hpp (limited to 'core/src/Utils/IO/DataStream.hpp') diff --git a/core/src/Utils/IO/DataStream.hpp b/core/src/Utils/IO/DataStream.hpp new file mode 100644 index 0000000..6babf63 --- /dev/null +++ b/core/src/Utils/IO/DataStream.hpp @@ -0,0 +1,123 @@ +#pragma once + +#include +#include +#include + +class DataStream +{ +public: + enum Endianness + { + BigEndian, + LittleEndian, + }; + +private: + Endianness mEndian; + +public: + DataStream(); + ~DataStream(); + + Endianness GetEndianness() const; + void SetEndianness(Endianness endianness); + + void ReadBytes(size_t byteCount, std::byte* buffer); + void ReadBytes(size_t byteCount, char* buffer); + void ReadBytes(size_t byteCount, signed char* buffer); + void ReadBytes(size_t byteCount, unsigned char* buffer); + + template + void ReadBytes(size_t byteCount, TInserter&& inserter) + { + for (size_t i = 0; i < byteCount; ++i) { + uint8_t byte; + Read(byte); + + inserter = byte; + } + } + + void WriteBytes(size_t byteCount, const std::byte* buffer); + void WriteBytes(size_t byteCount, const char* buffer); + void WriteBytes(size_t byteCount, const signed char* buffer); + void WriteBytes(size_t byteCount, const unsigned char* buffer); + + template + void WriteBytes(TIterator&& begin, TIterator&& end) + { + for (; begin != end; ++begin) { + uint8_t byte = *begin; + Write(byte); + } + } + + void Write(int8_t n); + void Write(int16_t n); + void Write(int32_t n); + void Write(int64_t n); + + void Read(int8_t& n); + void Read(int16_t& n); + void Read(int32_t& n); + void Read(int64_t& n); + + void Write(uint8_t n); + void Write(uint16_t n); + void Write(uint32_t n); + void Write(uint64_t n); + + void Read(uint8_t& n); + void Read(uint16_t& n); + void Read(uint32_t& n); + void Read(uint64_t& n); + + void Write(float n); + void Write(double n); + + void Read(float& n); + void Read(double& n); + + template + requires requires(TObject obj) + { + obj.ReadFromDataStream(std::declval()); + } + void ReadObject(TObject& obj) + { + obj.ReadFromDataStream(*this); + } + + template + requires requires(TObject obj) + { + // Let ADL happen + ReadFromDataStream(std::declval(), obj); + } + void ReadObject(TObject& obj) + { + ReadFromDataStream(*this, obj); + } + + template + requires requires(TObject obj) + { + obj.WriteToDataStream(std::declval()); + } + void WriteObject(TObject& obj) + { + obj.ReadFromDataStream(*this); + } + + template + requires requires(TObject obj) + { + // Let ADL happen + WriteToDataStream(std::declval(), obj); + } + void WriteObject(TObject& obj) + { + WriteToDataStream(*this, obj); + } +}; -- cgit v1.2.3-70-g09d2