diff options
| author | untodesu <kirill@untode.su> | 2025-06-29 22:24:42 +0500 |
|---|---|---|
| committer | untodesu <kirill@untode.su> | 2025-06-29 22:24:42 +0500 |
| commit | 6cd00aacfa22fed6a54a9b812f6b069ad16feec0 (patch) | |
| tree | b77f4e665da3dd235cdb01e7e6ea78c1c02ecf2e /src/core/buffer.hh | |
| parent | f440914e1ae453768d09383f332bc7844e0a700e (diff) | |
| download | voxelius-6cd00aacfa22fed6a54a9b812f6b069ad16feec0.tar.bz2 voxelius-6cd00aacfa22fed6a54a9b812f6b069ad16feec0.zip | |
Move game sources into src subdirectory
Diffstat (limited to 'src/core/buffer.hh')
| -rw-r--r-- | src/core/buffer.hh | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/src/core/buffer.hh b/src/core/buffer.hh new file mode 100644 index 0000000..1397e16 --- /dev/null +++ b/src/core/buffer.hh @@ -0,0 +1,255 @@ +#ifndef CORE_BUFFER_HH +#define CORE_BUFFER_HH 1 + +#include "core/floathacks.hh" +#include "core/macros.hh" + +class ReadBuffer final { +public: + DECLARE_DEFAULT_CONSTRUCTOR(ReadBuffer); + explicit ReadBuffer(const void* data, std::size_t size); + explicit ReadBuffer(const ENetPacket* packet); + explicit ReadBuffer(PHYSFS_File* file); + virtual ~ReadBuffer(void) = default; + + std::size_t size(void) const; + const std::byte* data(void) const; + + void reset(const void* data, std::size_t size); + void reset(const ENetPacket* packet); + void reset(PHYSFS_File* file); + + float read_FP32(void); + std::uint8_t read_UI8(void); + std::uint16_t read_UI16(void); + std::uint32_t read_UI32(void); + std::uint64_t read_UI64(void); + std::string read_string(void); + + inline std::int8_t read_I8(void); + inline std::int16_t read_I16(void); + inline std::int32_t read_I32(void); + inline std::int64_t read_I64(void); + + inline ReadBuffer& operator>>(float& value); + inline ReadBuffer& operator>>(std::int8_t& value); + inline ReadBuffer& operator>>(std::int16_t& value); + inline ReadBuffer& operator>>(std::int32_t& value); + inline ReadBuffer& operator>>(std::int64_t& value); + inline ReadBuffer& operator>>(std::uint8_t& value); + inline ReadBuffer& operator>>(std::uint16_t& value); + inline ReadBuffer& operator>>(std::uint32_t& value); + inline ReadBuffer& operator>>(std::uint64_t& value); + inline ReadBuffer& operator>>(std::string& value); + +private: + std::vector<std::byte> m_vector; + std::size_t m_position; +}; + +class WriteBuffer final { +public: + DECLARE_DEFAULT_CONSTRUCTOR(WriteBuffer); + virtual ~WriteBuffer(void) = default; + + std::size_t size(void) const; + const std::byte* data(void) const; + + void reset(void); + + void write_FP32(float value); + void write_UI8(std::uint8_t value); + void write_UI16(std::uint16_t value); + void write_UI32(std::uint32_t value); + void write_UI64(std::uint64_t value); + void write_string(const std::string& value); + + inline void write_I8(std::int8_t value); + inline void write_I16(std::int16_t value); + inline void write_I32(std::int32_t value); + inline void write_I64(std::int64_t value); + + inline WriteBuffer& operator<<(float value); + inline WriteBuffer& operator<<(std::int8_t value); + inline WriteBuffer& operator<<(std::int16_t value); + inline WriteBuffer& operator<<(std::int32_t value); + inline WriteBuffer& operator<<(std::int64_t value); + inline WriteBuffer& operator<<(std::uint8_t value); + inline WriteBuffer& operator<<(std::uint16_t value); + inline WriteBuffer& operator<<(std::uint32_t value); + inline WriteBuffer& operator<<(std::uint64_t value); + inline WriteBuffer& operator<<(const std::string& value); + + PHYSFS_File* to_file(const char* path, bool append = false) const; + ENetPacket* to_packet(enet_uint32 flags = ENET_PACKET_FLAG_RELIABLE) const; + +private: + std::vector<std::byte> m_vector; +}; + +inline std::int8_t ReadBuffer::read_I8(void) +{ + return static_cast<std::int8_t>(read_UI8()); +} + +inline std::int16_t ReadBuffer::read_I16(void) +{ + return static_cast<std::int16_t>(read_UI16()); +} + +inline std::int32_t ReadBuffer::read_I32(void) +{ + return static_cast<std::int32_t>(read_UI32()); +} + +inline std::int64_t ReadBuffer::read_I64(void) +{ + return static_cast<std::int64_t>(read_UI64()); +} + +inline ReadBuffer& ReadBuffer::operator>>(float& value) +{ + value = read_FP32(); + return *this; +} + +inline ReadBuffer& ReadBuffer::operator>>(std::int8_t& value) +{ + value = read_I8(); + return *this; +} + +inline ReadBuffer& ReadBuffer::operator>>(std::int16_t& value) +{ + value = read_I16(); + return *this; +} + +inline ReadBuffer& ReadBuffer::operator>>(std::int32_t& value) +{ + value = read_I32(); + return *this; +} + +inline ReadBuffer& ReadBuffer::operator>>(std::int64_t& value) +{ + value = read_I64(); + return *this; +} + +inline ReadBuffer& ReadBuffer::operator>>(std::uint8_t& value) +{ + value = read_UI8(); + return *this; +} + +inline ReadBuffer& ReadBuffer::operator>>(std::uint16_t& value) +{ + value = read_UI16(); + return *this; +} + +inline ReadBuffer& ReadBuffer::operator>>(std::uint32_t& value) +{ + value = read_UI32(); + return *this; +} + +inline ReadBuffer& ReadBuffer::operator>>(std::uint64_t& value) +{ + value = read_UI64(); + return *this; +} + +inline ReadBuffer& ReadBuffer::operator>>(std::string& value) +{ + value = read_string(); + return *this; +} + +inline void WriteBuffer::write_FP32(float value) +{ + write_UI32(floathacks::float_to_uint32(value)); +} + +inline void WriteBuffer::write_I8(std::int8_t value) +{ + write_UI8(static_cast<std::uint8_t>(value)); +} + +inline void WriteBuffer::write_I16(std::int16_t value) +{ + write_UI16(static_cast<std::uint16_t>(value)); +} + +inline void WriteBuffer::write_I32(std::int32_t value) +{ + write_UI32(static_cast<std::uint32_t>(value)); +} + +inline void WriteBuffer::write_I64(std::int64_t value) +{ + write_UI64(static_cast<std::uint64_t>(value)); +} + +inline WriteBuffer& WriteBuffer::operator<<(float value) +{ + write_FP32(value); + return *this; +} + +inline WriteBuffer& WriteBuffer::operator<<(std::int8_t value) +{ + write_I8(value); + return *this; +} + +inline WriteBuffer& WriteBuffer::operator<<(std::int16_t value) +{ + write_I16(value); + return *this; +} + +inline WriteBuffer& WriteBuffer::operator<<(std::int32_t value) +{ + write_I32(value); + return *this; +} + +inline WriteBuffer& WriteBuffer::operator<<(std::int64_t value) +{ + write_I64(value); + return *this; +} + +inline WriteBuffer& WriteBuffer::operator<<(std::uint8_t value) +{ + write_UI8(value); + return *this; +} + +inline WriteBuffer& WriteBuffer::operator<<(std::uint16_t value) +{ + write_UI16(value); + return *this; +} + +inline WriteBuffer& WriteBuffer::operator<<(std::uint32_t value) +{ + write_UI32(value); + return *this; +} + +inline WriteBuffer& WriteBuffer::operator<<(std::uint64_t value) +{ + write_UI64(value); + return *this; +} + +inline WriteBuffer& WriteBuffer::operator<<(const std::string& value) +{ + write_string(value); + return *this; +} + +#endif /* CORE_BUFFER_HH */ |
