diff options
author | rtk0c <[email protected]> | 2021-08-15 17:14:06 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2021-08-15 17:14:06 -0700 |
commit | c51a61c0f0de65a3e64f589816a56f21ed4e8528 (patch) | |
tree | ba1737b64d5307f9dedc934d9398297d3fb8ee82 /core/src/Utils/IO/DataStream.hpp | |
parent | 64a6dbcfdb89a5f57d93d47a2be0c741dda4662d (diff) |
Initial work on data streams
Diffstat (limited to 'core/src/Utils/IO/DataStream.hpp')
-rw-r--r-- | core/src/Utils/IO/DataStream.hpp | 123 |
1 files changed, 123 insertions, 0 deletions
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 <cstddef> +#include <cstdint> +#include <span> + +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 <class TInserter> + 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 <class TIterator> + 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 <class TObject> + requires requires(TObject obj) + { + obj.ReadFromDataStream(std::declval<DataStream>()); + } + void ReadObject(TObject& obj) + { + obj.ReadFromDataStream(*this); + } + + template <class TObject> + requires requires(TObject obj) + { + // Let ADL happen + ReadFromDataStream(std::declval<DataStream>(), obj); + } + void ReadObject(TObject& obj) + { + ReadFromDataStream(*this, obj); + } + + template <class TObject> + requires requires(TObject obj) + { + obj.WriteToDataStream(std::declval<DataStream>()); + } + void WriteObject(TObject& obj) + { + obj.ReadFromDataStream(*this); + } + + template <class TObject> + requires requires(TObject obj) + { + // Let ADL happen + WriteToDataStream(std::declval<DataStream>(), obj); + } + void WriteObject(TObject& obj) + { + WriteToDataStream(*this, obj); + } +}; |