summaryrefslogtreecommitdiffstats
path: root/core/io/buffer.hh
diff options
context:
space:
mode:
Diffstat (limited to 'core/io/buffer.hh')
-rw-r--r--core/io/buffer.hh221
1 files changed, 27 insertions, 194 deletions
diff --git a/core/io/buffer.hh b/core/io/buffer.hh
index 205381f..c301204 100644
--- a/core/io/buffer.hh
+++ b/core/io/buffer.hh
@@ -1,13 +1,12 @@
#ifndef CORE_IO_BUFFER_HH
#define CORE_IO_BUFFER_HH 1
-#include "core/math/floathacks.hh"
-
namespace io
{
class ReadBuffer final {
public:
ReadBuffer(void) = default;
+ explicit ReadBuffer(const ReadBuffer& other);
explicit ReadBuffer(const void* data, std::size_t size);
explicit ReadBuffer(const ENetPacket* packet);
explicit ReadBuffer(PHYSFS_File* file);
@@ -20,28 +19,16 @@ public:
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);
+ constexpr void rewind(void);
+ constexpr bool is_ended(void) const;
+
+ void read(void* buffer, std::size_t size);
- 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);
+ template<typename T>
+ T read(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);
+ template<typename T>
+ ReadBuffer& operator>>(T& value);
private:
std::vector<std::byte> m_vector;
@@ -54,6 +41,7 @@ namespace io
class WriteBuffer final {
public:
WriteBuffer(void) = default;
+ explicit WriteBuffer(const WriteBuffer& other);
virtual ~WriteBuffer(void) = default;
std::size_t size(void) const;
@@ -61,30 +49,16 @@ public:
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);
+ void write(const WriteBuffer& other);
+ void write(const void* data, std::size_t size);
- 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);
+ template<typename T>
+ void write(const 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);
+ template<typename T>
+ WriteBuffer& operator<<(const T value);
- PHYSFS_File* to_file(const char* path, bool append = false) const;
+ PHYSFS_File* to_file(const std::string& path, bool append = false) const;
ENetPacket* to_packet(enet_uint32 flags = ENET_PACKET_FLAG_RELIABLE) const;
private:
@@ -92,168 +66,27 @@ private:
};
} // namespace io
-inline std::int8_t io::ReadBuffer::read_I8(void)
-{
- return static_cast<std::int8_t>(read_UI8());
-}
-
-inline std::int16_t io::ReadBuffer::read_I16(void)
-{
- return static_cast<std::int16_t>(read_UI16());
-}
-
-inline std::int32_t io::ReadBuffer::read_I32(void)
-{
- return static_cast<std::int32_t>(read_UI32());
-}
-
-inline std::int64_t io::ReadBuffer::read_I64(void)
-{
- return static_cast<std::int64_t>(read_UI64());
-}
-
-inline io::ReadBuffer& io::ReadBuffer::operator>>(float& value)
-{
- value = read_FP32();
- return *this;
-}
-
-inline io::ReadBuffer& io::ReadBuffer::operator>>(std::int8_t& value)
-{
- value = read_I8();
- return *this;
-}
-
-inline io::ReadBuffer& io::ReadBuffer::operator>>(std::int16_t& value)
-{
- value = read_I16();
- return *this;
-}
-
-inline io::ReadBuffer& io::ReadBuffer::operator>>(std::int32_t& value)
-{
- value = read_I32();
- return *this;
-}
-
-inline io::ReadBuffer& io::ReadBuffer::operator>>(std::int64_t& value)
-{
- value = read_I64();
- return *this;
-}
-
-inline io::ReadBuffer& io::ReadBuffer::operator>>(std::uint8_t& value)
-{
- value = read_UI8();
- return *this;
-}
-
-inline io::ReadBuffer& io::ReadBuffer::operator>>(std::uint16_t& value)
-{
- value = read_UI16();
- return *this;
-}
-
-inline io::ReadBuffer& io::ReadBuffer::operator>>(std::uint32_t& value)
+constexpr void io::ReadBuffer::rewind(void)
{
- value = read_UI32();
- return *this;
-}
-
-inline io::ReadBuffer& io::ReadBuffer::operator>>(std::uint64_t& value)
-{
- value = read_UI64();
- return *this;
+ m_position = 0;
}
-inline io::ReadBuffer& io::ReadBuffer::operator>>(std::string& value)
+constexpr bool io::ReadBuffer::is_ended(void) const
{
- value = read_string();
- return *this;
-}
-
-inline void io::WriteBuffer::write_FP32(float value)
-{
- write_UI32(math::float_to_uint32(value));
-}
-
-inline void io::WriteBuffer::write_I8(std::int8_t value)
-{
- write_UI8(static_cast<std::uint8_t>(value));
-}
-
-inline void io::WriteBuffer::write_I16(std::int16_t value)
-{
- write_UI16(static_cast<std::uint16_t>(value));
-}
-
-inline void io::WriteBuffer::write_I32(std::int32_t value)
-{
- write_UI32(static_cast<std::uint32_t>(value));
-}
-
-inline void io::WriteBuffer::write_I64(std::int64_t value)
-{
- write_UI64(static_cast<std::uint64_t>(value));
-}
-
-inline io::WriteBuffer& io::WriteBuffer::operator<<(float value)
-{
- write_FP32(value);
- return *this;
-}
-
-inline io::WriteBuffer& io::WriteBuffer::operator<<(std::int8_t value)
-{
- write_I8(value);
- return *this;
-}
-
-inline io::WriteBuffer& io::WriteBuffer::operator<<(std::int16_t value)
-{
- write_I16(value);
- return *this;
-}
-
-inline io::WriteBuffer& io::WriteBuffer::operator<<(std::int32_t value)
-{
- write_I32(value);
- return *this;
-}
-
-inline io::WriteBuffer& io::WriteBuffer::operator<<(std::int64_t value)
-{
- write_I64(value);
- return *this;
-}
-
-inline io::WriteBuffer& io::WriteBuffer::operator<<(std::uint8_t value)
-{
- write_UI8(value);
- return *this;
-}
-
-inline io::WriteBuffer& io::WriteBuffer::operator<<(std::uint16_t value)
-{
- write_UI16(value);
- return *this;
-}
-
-inline io::WriteBuffer& io::WriteBuffer::operator<<(std::uint32_t value)
-{
- write_UI32(value);
- return *this;
+ return m_position >= m_vector.size();
}
-inline io::WriteBuffer& io::WriteBuffer::operator<<(std::uint64_t value)
+template<typename T>
+io::ReadBuffer& io::ReadBuffer::operator>>(T& value)
{
- write_UI64(value);
+ value = read<T>();
return *this;
}
-inline io::WriteBuffer& io::WriteBuffer::operator<<(const std::string& value)
+template<typename T>
+io::WriteBuffer& io::WriteBuffer::operator<<(const T value)
{
- write_string(value);
+ write<T>(value);
return *this;
}