From 96bd73ae020ecca1f94698744c77498a89ad19f7 Mon Sep 17 00:00:00 2001 From: untodesu Date: Thu, 11 Sep 2025 13:10:52 +0500 Subject: Graft build scripts and buffer code from QFengine --- core/io/buffer.cc | 213 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 175 insertions(+), 38 deletions(-) (limited to 'core/io/buffer.cc') diff --git a/core/io/buffer.cc b/core/io/buffer.cc index 62f981c..02b810e 100644 --- a/core/io/buffer.cc +++ b/core/io/buffer.cc @@ -4,18 +4,29 @@ #include "core/math/constexpr.hh" +io::ReadBuffer::ReadBuffer(const ReadBuffer& other) +{ + reset(other.data(), other.size()); +} + io::ReadBuffer::ReadBuffer(const void* data, std::size_t size) { + assert(data); + reset(data, size); } io::ReadBuffer::ReadBuffer(const ENetPacket* packet) { + assert(packet); + reset(packet); } io::ReadBuffer::ReadBuffer(PHYSFS_File* file) { + assert(file); + reset(file); } @@ -31,6 +42,8 @@ const std::byte* io::ReadBuffer::data(void) const void io::ReadBuffer::reset(const void* data, std::size_t size) { + assert(data); + auto bytes = reinterpret_cast(data); m_vector.assign(bytes, bytes + size); m_position = 0U; @@ -38,6 +51,8 @@ void io::ReadBuffer::reset(const void* data, std::size_t size) void io::ReadBuffer::reset(const ENetPacket* packet) { + assert(packet); + auto bytes_ptr = reinterpret_cast(packet->data); m_vector.assign(bytes_ptr, bytes_ptr + packet->dataLength); m_position = 0; @@ -45,6 +60,8 @@ void io::ReadBuffer::reset(const ENetPacket* packet) void io::ReadBuffer::reset(PHYSFS_File* file) { + assert(file); + m_vector.resize(PHYSFS_fileLength(file)); m_position = 0; @@ -52,12 +69,21 @@ void io::ReadBuffer::reset(PHYSFS_File* file) PHYSFS_readBytes(file, m_vector.data(), m_vector.size()); } -float io::ReadBuffer::read_FP32(void) +template<> +std::byte io::ReadBuffer::read(void) { - return math::uint32_to_float(read_UI32()); + if(m_position < m_vector.size()) { + auto result = m_vector[m_position]; + m_position += 1U; + return result; + } + + m_position += 1U; + return static_cast(0x00); } -std::uint8_t io::ReadBuffer::read_UI8(void) +template<> +std::uint8_t io::ReadBuffer::read(void) { if((m_position + 1U) <= m_vector.size()) { auto result = static_cast(m_vector[m_position]); @@ -69,12 +95,13 @@ std::uint8_t io::ReadBuffer::read_UI8(void) return 0; } -std::uint16_t io::ReadBuffer::read_UI16(void) +template<> +std::uint16_t io::ReadBuffer::read(void) { if((m_position + 2U) <= m_vector.size()) { auto result = UINT16_C(0x0000); - result |= static_cast(m_vector[m_position + 0U]) << 8U; - result |= static_cast(m_vector[m_position + 1U]) << 0U; + result |= (UINT16_C(0x00FF) & static_cast(m_vector[m_position + 0U])) << 8U; + result |= (UINT16_C(0x00FF) & static_cast(m_vector[m_position + 1U])) << 0U; m_position += 2U; return result; } @@ -83,14 +110,15 @@ std::uint16_t io::ReadBuffer::read_UI16(void) return 0; } -std::uint32_t io::ReadBuffer::read_UI32(void) +template<> +std::uint32_t io::ReadBuffer::read(void) { if((m_position + 4U) <= m_vector.size()) { auto result = UINT32_C(0x00000000); - result |= static_cast(m_vector[m_position + 0U]) << 24U; - result |= static_cast(m_vector[m_position + 1U]) << 16U; - result |= static_cast(m_vector[m_position + 2U]) << 8U; - result |= static_cast(m_vector[m_position + 3U]) << 0U; + result |= (UINT32_C(0x000000FF) & static_cast(m_vector[m_position + 0U])) << 24U; + result |= (UINT32_C(0x000000FF) & static_cast(m_vector[m_position + 1U])) << 16U; + result |= (UINT32_C(0x000000FF) & static_cast(m_vector[m_position + 2U])) << 8U; + result |= (UINT32_C(0x000000FF) & static_cast(m_vector[m_position + 3U])) << 0U; m_position += 4U; return result; } @@ -99,18 +127,19 @@ std::uint32_t io::ReadBuffer::read_UI32(void) return 0; } -std::uint64_t io::ReadBuffer::read_UI64(void) +template<> +std::uint64_t io::ReadBuffer::read(void) { if((m_position + 8U) <= m_vector.size()) { auto result = UINT64_C(0x0000000000000000); - result |= (0x00000000000000FF & static_cast(m_vector[m_position + 0U])) << 56U; - result |= (0x00000000000000FF & static_cast(m_vector[m_position + 1U])) << 48U; - result |= (0x00000000000000FF & static_cast(m_vector[m_position + 2U])) << 40U; - result |= (0x00000000000000FF & static_cast(m_vector[m_position + 3U])) << 32U; - result |= (0x00000000000000FF & static_cast(m_vector[m_position + 4U])) << 24U; - result |= (0x00000000000000FF & static_cast(m_vector[m_position + 5U])) << 16U; - result |= (0x00000000000000FF & static_cast(m_vector[m_position + 6U])) << 8U; - result |= (0x00000000000000FF & static_cast(m_vector[m_position + 7U])) << 0U; + result |= (UINT64_C(0x00000000000000FF) & static_cast(m_vector[m_position + 0U])) << 56U; + result |= (UINT64_C(0x00000000000000FF) & static_cast(m_vector[m_position + 1U])) << 48U; + result |= (UINT64_C(0x00000000000000FF) & static_cast(m_vector[m_position + 2U])) << 40U; + result |= (UINT64_C(0x00000000000000FF) & static_cast(m_vector[m_position + 3U])) << 32U; + result |= (UINT64_C(0x00000000000000FF) & static_cast(m_vector[m_position + 4U])) << 24U; + result |= (UINT64_C(0x00000000000000FF) & static_cast(m_vector[m_position + 5U])) << 16U; + result |= (UINT64_C(0x00000000000000FF) & static_cast(m_vector[m_position + 6U])) << 8U; + result |= (UINT64_C(0x00000000000000FF) & static_cast(m_vector[m_position + 7U])) << 0U; m_position += 8U; return result; } @@ -119,14 +148,45 @@ std::uint64_t io::ReadBuffer::read_UI64(void) return 0; } -std::string io::ReadBuffer::read_string(void) +template<> +float io::ReadBuffer::read(void) +{ + return std::bit_cast(read()); +} + +template<> +std::int8_t io::ReadBuffer::read(void) { - auto size = static_cast(read_UI16()); - auto result = std::string(); + return std::bit_cast(read()); +} - for(std::size_t i = 0; i < size; ++i) { +template<> +std::int16_t io::ReadBuffer::read(void) +{ + return std::bit_cast(read()); +} + +template<> +std::int32_t io::ReadBuffer::read(void) +{ + return std::bit_cast(read()); +} + +template<> +std::int64_t io::ReadBuffer::read(void) +{ + return std::bit_cast(read()); +} + +template<> +std::string io::ReadBuffer::read(void) +{ + std::string result; + result.resize(read()); + + for(std::size_t i = 0; i < result.size(); ++i) { if(m_position < m_vector.size()) { - result.push_back(static_cast(m_vector[m_position])); + result[i] = static_cast(m_vector[m_position]); } m_position += 1U; @@ -135,6 +195,23 @@ std::string io::ReadBuffer::read_string(void) return result; } +void io::ReadBuffer::read(void* buffer, std::size_t size) +{ + auto bytes = reinterpret_cast(buffer); + auto amount_to_read = std::min(size, m_vector.size() - m_position); + + if(amount_to_read > 0) { + std::copy(m_vector.cbegin() + m_position, m_vector.cbegin() + m_position + amount_to_read, bytes); + } + + m_position += size; +} + +io::WriteBuffer::WriteBuffer(const WriteBuffer& other) +{ + m_vector = other.m_vector; +} + std::size_t io::WriteBuffer::size(void) const { return m_vector.size(); @@ -150,18 +227,40 @@ void io::WriteBuffer::reset(void) m_vector.clear(); } -void io::WriteBuffer::write_UI8(std::uint8_t value) +void io::WriteBuffer::write(const WriteBuffer& other) +{ + m_vector.insert(m_vector.end(), other.m_vector.begin(), other.m_vector.end()); +} + +void io::WriteBuffer::write(const void* data, std::size_t size) +{ + assert(data); + + auto bytes = reinterpret_cast(data); + m_vector.insert(m_vector.end(), bytes, bytes + size); +} + +template<> +void io::WriteBuffer::write(const std::byte value) +{ + m_vector.push_back(value); +} + +template<> +void io::WriteBuffer::write(const std::uint8_t value) { m_vector.push_back(static_cast(value)); } -void io::WriteBuffer::write_UI16(std::uint16_t value) +template<> +void io::WriteBuffer::write(const std::uint16_t value) { m_vector.push_back(static_cast(UINT16_C(0xFF) & ((value & UINT16_C(0xFF00)) >> 8U))); m_vector.push_back(static_cast(UINT16_C(0xFF) & ((value & UINT16_C(0x00FF)) >> 0U))); } -void io::WriteBuffer::write_UI32(std::uint32_t value) +template<> +void io::WriteBuffer::write(const std::uint32_t value) { m_vector.push_back(static_cast(UINT32_C(0xFF) & ((value & UINT32_C(0xFF000000)) >> 24U))); m_vector.push_back(static_cast(UINT32_C(0xFF) & ((value & UINT32_C(0x00FF0000)) >> 16U))); @@ -169,7 +268,8 @@ void io::WriteBuffer::write_UI32(std::uint32_t value) m_vector.push_back(static_cast(UINT32_C(0xFF) & ((value & UINT32_C(0x000000FF)) >> 0U))); } -void io::WriteBuffer::write_UI64(std::uint64_t value) +template<> +void io::WriteBuffer::write(const std::uint64_t value) { m_vector.push_back(static_cast(UINT64_C(0xFF) & ((value & UINT64_C(0xFF00000000000000)) >> 56U))); m_vector.push_back(static_cast(UINT64_C(0xFF) & ((value & UINT64_C(0x00FF000000000000)) >> 48U))); @@ -181,25 +281,62 @@ void io::WriteBuffer::write_UI64(std::uint64_t value) m_vector.push_back(static_cast(UINT64_C(0xFF) & ((value & UINT64_C(0x00000000000000FF)) >> 0U))); } -void io::WriteBuffer::write_string(const std::string& value) +template<> +void io::WriteBuffer::write(const float value) { - const std::size_t size = math::min(UINT16_MAX, value.size()); + write(std::bit_cast(value)); +} - write_UI16(static_cast(size)); +template<> +void io::WriteBuffer::write(const std::int8_t value) +{ + write(std::bit_cast(value)); +} + +template<> +void io::WriteBuffer::write(const std::int16_t value) +{ + write(std::bit_cast(value)); +} + +template<> +void io::WriteBuffer::write(const std::int32_t value) +{ + write(std::bit_cast(value)); +} + +template<> +void io::WriteBuffer::write(const std::int64_t value) +{ + write(std::bit_cast(value)); +} + +template<> +void io::WriteBuffer::write(const std::string_view value) +{ + write(value.size()); - for(std::size_t i = 0; i < size; m_vector.push_back(static_cast(value[i++]))) { - // empty + for(const auto& character : value) { + m_vector.push_back(static_cast(character)); } } -PHYSFS_File* io::WriteBuffer::to_file(const char* path, bool append) const +PHYSFS_File* io::WriteBuffer::to_file(const std::string& path, bool append) const { - if(auto file = (append ? PHYSFS_openAppend(path) : PHYSFS_openWrite(path))) { + PHYSFS_File* file = nullptr; + + if(append) { + file = PHYSFS_openAppend(path.c_str()); + } + else { + file = PHYSFS_openWrite(path.c_str()); + } + + if(file) { PHYSFS_writeBytes(file, m_vector.data(), m_vector.size()); - return file; } - return nullptr; + return file; } ENetPacket* io::WriteBuffer::to_packet(enet_uint32 flags) const -- cgit