From 44d166181eae8727dddbdaf8462098802af6e8c1 Mon Sep 17 00:00:00 2001 From: rtk0c Date: Sun, 22 Aug 2021 13:46:36 -0700 Subject: Split DataStream into InputDataStream and OutputDataStream --- core/src/Utils/IO/DataStream.cpp | 283 ++++++++++++++++++++------------------- 1 file changed, 144 insertions(+), 139 deletions(-) (limited to 'core/src/Utils/IO/DataStream.cpp') diff --git a/core/src/Utils/IO/DataStream.cpp b/core/src/Utils/IO/DataStream.cpp index 4880901..7fee881 100644 --- a/core/src/Utils/IO/DataStream.cpp +++ b/core/src/Utils/IO/DataStream.cpp @@ -2,78 +2,23 @@ #include #include +#include static_assert(std::numeric_limits::is_iec559, "Non IEE754/IEC559 'float' is not supported."); static_assert(std::numeric_limits::is_iec559, "Non IEE754/IEC559 'double' is not supported."); static_assert(std::endian::native == std::endian::little || std::endian::native == std::endian::big, "Mixed endian is not supported."); -DataStream::DataStream(std::fstream stream) - : mBackend{ std::move(stream) } - , mEndian{ std::endian::big } -{ -} - -std::endian DataStream::GetEndianness() const -{ - return mEndian; -} - -void DataStream::SetEndianness(std::endian endianness) -{ - mEndian = endianness; -} - -void DataStream::ReadBytes(size_t byteCount, std::byte* buffer) -{ - mBackend.read(reinterpret_cast(buffer), static_cast(byteCount)); -} - -void DataStream::ReadBytes(size_t byteCount, char* buffer) -{ - mBackend.read(reinterpret_cast(buffer), static_cast(byteCount)); -} - -void DataStream::ReadBytes(size_t byteCount, signed char* buffer) -{ - mBackend.read(reinterpret_cast(buffer), static_cast(byteCount)); -} - -void DataStream::ReadBytes(size_t byteCount, unsigned char* buffer) -{ - mBackend.read(reinterpret_cast(buffer), static_cast(byteCount)); -} - -void DataStream::WriteBytes(size_t byteCount, const std::byte* buffer) -{ - mBackend.write(reinterpret_cast(buffer), static_cast(byteCount)); -} - -void DataStream::WriteBytes(size_t byteCount, const char* buffer) -{ - mBackend.write(reinterpret_cast(buffer), static_cast(byteCount)); -} - -void DataStream::WriteBytes(size_t byteCount, const signed char* buffer) -{ - mBackend.write(reinterpret_cast(buffer), static_cast(byteCount)); -} - -void DataStream::WriteBytes(size_t byteCount, const unsigned char* buffer) -{ - mBackend.write(reinterpret_cast(buffer), static_cast(byteCount)); -} - // Reading/writing signed integer byte-by-byte is fine, since the representation got fixed to 2's complements in C++20 -uint16_t ByteSwap(uint16_t n) +static uint16_t ByteSwap(uint16_t n) { auto bytes = reinterpret_cast(n); std::swap(bytes[0], bytes[1]); return n; } -uint32_t ByteSwap(uint32_t n) +static uint32_t ByteSwap(uint32_t n) { #ifdef _MSC_VER // TODO @@ -82,7 +27,7 @@ uint32_t ByteSwap(uint32_t n) #endif } -uint64_t ByteSwap(uint64_t n) +static uint64_t ByteSwap(uint64_t n) { #ifdef _MSC_VER // TODO @@ -92,7 +37,7 @@ uint64_t ByteSwap(uint64_t n) } template -TSigned ByteSwap(TSigned n) +static TSigned ByteSwap(TSigned n) { using Unsigned = std::make_unsigned_t; @@ -100,179 +45,239 @@ TSigned ByteSwap(TSigned n) return std::bit_cast(swapped); } -void DataStream::Write(int8_t n) +std::endian BaseDataStream::GetEndianness() const { - mBackend.write(reinterpret_cast(&n), sizeof(n)); + return mEndian; } -void DataStream::Write(int16_t n) +void BaseDataStream::SetEndianness(std::endian endianness) { - if (mEndian != std::endian::native) { - n = ::ByteSwap(n); - } - mBackend.write(reinterpret_cast(&n), sizeof(n)); + mEndian = endianness; } -void DataStream::Write(int32_t n) +InputDataStream::InputDataStream(std::fstream stream) + : mBackend{ std::move(stream) } { - if (mEndian != std::endian::native) { - n = ::ByteSwap(n); - } - mBackend.write(reinterpret_cast(&n), sizeof(n)); } -void DataStream::Write(int64_t n) +void InputDataStream::ReadBytes(size_t byteCount, std::byte* buffer) { - if (mEndian != std::endian::native) { - n = ::ByteSwap(n); - } - mBackend.write(reinterpret_cast(&n), sizeof(n)); + mBackend.read(reinterpret_cast(buffer), static_cast(byteCount)); +} + +void InputDataStream::ReadBytes(size_t byteCount, char* buffer) +{ + mBackend.read(reinterpret_cast(buffer), static_cast(byteCount)); +} + +void InputDataStream::ReadBytes(size_t byteCount, signed char* buffer) +{ + mBackend.read(reinterpret_cast(buffer), static_cast(byteCount)); +} + +void InputDataStream::ReadBytes(size_t byteCount, unsigned char* buffer) +{ + mBackend.read(reinterpret_cast(buffer), static_cast(byteCount)); } -void DataStream::Read(int8_t& n) +void InputDataStream::Read(int8_t& n) { // sizeof() of a reference type yields the size of the reference mBackend.read(reinterpret_cast(&n), sizeof(n)); } -void DataStream::Read(int16_t& n) +void InputDataStream::Read(int16_t& n) { int16_t tmp; mBackend.read(reinterpret_cast(&tmp), sizeof(tmp)); - if (mEndian != std::endian::native) { + if (GetEndianness() != std::endian::native) { n = ::ByteSwap(tmp); } else { n = tmp; } } -void DataStream::Read(int32_t& n) +void InputDataStream::Read(int32_t& n) { int32_t tmp; mBackend.read(reinterpret_cast(&tmp), sizeof(tmp)); - if (mEndian != std::endian::native) { + if (GetEndianness() != std::endian::native) { n = ::ByteSwap(tmp); } else { n = tmp; } } -void DataStream::Read(int64_t& n) +void InputDataStream::Read(int64_t& n) { int64_t tmp; mBackend.read(reinterpret_cast(&tmp), sizeof(tmp)); - if (mEndian != std::endian::native) { + if (GetEndianness() != std::endian::native) { n = ::ByteSwap(tmp); } else { n = tmp; } } -void DataStream::Write(uint8_t n) -{ - mBackend.write(reinterpret_cast(&n), sizeof(n)); -} - -void DataStream::Write(uint16_t n) -{ - if (mEndian != std::endian::native) { - n = ::ByteSwap(n); - } - mBackend.write(reinterpret_cast(&n), sizeof(n)); -} - -void DataStream::Write(uint32_t n) -{ - if (mEndian != std::endian::native) { - n = ::ByteSwap(n); - } - mBackend.write(reinterpret_cast(&n), sizeof(n)); -} - -void DataStream::Write(uint64_t n) -{ - if (mEndian != std::endian::native) { - n = ::ByteSwap(n); - } - mBackend.write(reinterpret_cast(&n), sizeof(n)); -} - -void DataStream::Read(uint8_t& n) +void InputDataStream::Read(uint8_t& n) { mBackend.read(reinterpret_cast(&n), sizeof(n)); } -void DataStream::Read(uint16_t& n) +void InputDataStream::Read(uint16_t& n) { uint16_t tmp; mBackend.read(reinterpret_cast(&tmp), sizeof(tmp)); - if (mEndian != std::endian::native) { + if (GetEndianness() != std::endian::native) { n = ::ByteSwap(tmp); } else { n = tmp; } } -void DataStream::Read(uint32_t& n) +void InputDataStream::Read(uint32_t& n) { uint32_t tmp; mBackend.read(reinterpret_cast(&tmp), sizeof(tmp)); - if (mEndian != std::endian::native) { + if (GetEndianness() != std::endian::native) { n = ::ByteSwap(tmp); } else { n = tmp; } } -void DataStream::Read(uint64_t& n) +void InputDataStream::Read(uint64_t& n) { uint64_t tmp; mBackend.read(reinterpret_cast(&tmp), sizeof(tmp)); - if (mEndian != std::endian::native) { + if (GetEndianness() != std::endian::native) { n = ::ByteSwap(tmp); } else { n = tmp; } } -void DataStream::Write(float n) +void InputDataStream::Read(float& n) { - auto buffer = std::bit_cast(n); - if (mEndian != std::endian::native) { + uint32_t buffer; + Read(buffer); + + if (GetEndianness() != std::endian::native) { buffer = ::ByteSwap(buffer); } - mBackend.read(reinterpret_cast(&buffer), sizeof(buffer)); + + n = std::bit_cast(buffer); } -void DataStream::Write(double n) +void InputDataStream::Read(double& n) { - auto buffer = std::bit_cast(n); - if (mEndian != std::endian::native) { + uint64_t buffer; + Read(buffer); + + if (GetEndianness() != std::endian::native) { buffer = ::ByteSwap(buffer); } - mBackend.read(reinterpret_cast(&buffer), sizeof(buffer)); + + n = std::bit_cast(buffer); } -void DataStream::Read(float& n) +OutputDataStream::OutputDataStream(std::fstream stream) + : mBackend{ std::move(stream) } { - uint32_t buffer; - Read(buffer); +} - if (mEndian != std::endian::native) { - buffer = ::ByteSwap(buffer); +void OutputDataStream::WriteBytes(size_t byteCount, const std::byte* buffer) +{ + mBackend.write(reinterpret_cast(buffer), static_cast(byteCount)); +} + +void OutputDataStream::WriteBytes(size_t byteCount, const char* buffer) +{ + mBackend.write(reinterpret_cast(buffer), static_cast(byteCount)); +} + +void OutputDataStream::WriteBytes(size_t byteCount, const signed char* buffer) +{ + mBackend.write(reinterpret_cast(buffer), static_cast(byteCount)); +} + +void OutputDataStream::WriteBytes(size_t byteCount, const unsigned char* buffer) +{ + mBackend.write(reinterpret_cast(buffer), static_cast(byteCount)); +} + +void OutputDataStream::Write(int8_t n) +{ + mBackend.write(reinterpret_cast(&n), sizeof(n)); +} + +void OutputDataStream::Write(int16_t n) +{ + if (GetEndianness() != std::endian::native) { + n = ::ByteSwap(n); } + mBackend.write(reinterpret_cast(&n), sizeof(n)); +} - n = std::bit_cast(buffer); +void OutputDataStream::Write(int32_t n) +{ + if (GetEndianness() != std::endian::native) { + n = ::ByteSwap(n); + } + mBackend.write(reinterpret_cast(&n), sizeof(n)); } -void DataStream::Read(double& n) +void OutputDataStream::Write(int64_t n) { - uint64_t buffer; - Read(buffer); + if (GetEndianness() != std::endian::native) { + n = ::ByteSwap(n); + } + mBackend.write(reinterpret_cast(&n), sizeof(n)); +} + +void OutputDataStream::Write(uint8_t n) +{ + mBackend.write(reinterpret_cast(&n), sizeof(n)); +} + +void OutputDataStream::Write(uint16_t n) +{ + if (GetEndianness() != std::endian::native) { + n = ::ByteSwap(n); + } + mBackend.write(reinterpret_cast(&n), sizeof(n)); +} - if (mEndian != std::endian::native) { +void OutputDataStream::Write(uint32_t n) +{ + if (GetEndianness() != std::endian::native) { + n = ::ByteSwap(n); + } + mBackend.write(reinterpret_cast(&n), sizeof(n)); +} + +void OutputDataStream::Write(uint64_t n) +{ + if (GetEndianness() != std::endian::native) { + n = ::ByteSwap(n); + } + mBackend.write(reinterpret_cast(&n), sizeof(n)); +} + +void OutputDataStream::Write(float n) +{ + auto buffer = std::bit_cast(n); + if (GetEndianness() != std::endian::native) { buffer = ::ByteSwap(buffer); } + mBackend.read(reinterpret_cast(&buffer), sizeof(buffer)); +} - n = std::bit_cast(buffer); +void OutputDataStream::Write(double n) +{ + auto buffer = std::bit_cast(n); + if (GetEndianness() != std::endian::native) { + buffer = ::ByteSwap(buffer); + } + mBackend.read(reinterpret_cast(&buffer), sizeof(buffer)); } -- cgit v1.2.3-70-g09d2