aboutsummaryrefslogtreecommitdiff
path: root/core/src/Utils/IO/DataStream.hpp
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2021-08-15 17:14:06 -0700
committerrtk0c <[email protected]>2021-08-15 17:14:06 -0700
commitc51a61c0f0de65a3e64f589816a56f21ed4e8528 (patch)
treeba1737b64d5307f9dedc934d9398297d3fb8ee82 /core/src/Utils/IO/DataStream.hpp
parent64a6dbcfdb89a5f57d93d47a2be0c741dda4662d (diff)
Initial work on data streams
Diffstat (limited to 'core/src/Utils/IO/DataStream.hpp')
-rw-r--r--core/src/Utils/IO/DataStream.hpp123
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);
+ }
+};