| |
| |
|
|
| #pragma once |
|
|
| #include <array> |
| #include <vector> |
| #include "common/common_types.h" |
|
|
| namespace Network { |
|
|
| |
| class Packet { |
| public: |
| Packet() = default; |
| ~Packet() = default; |
|
|
| |
| |
| |
| |
| |
| void Append(const void* data, std::size_t size_in_bytes); |
|
|
| |
| |
| |
| |
| |
| void Read(void* out_data, std::size_t size_in_bytes); |
|
|
| |
| |
| |
| |
| void Clear(); |
|
|
| |
| |
| |
| |
| void IgnoreBytes(u32 length); |
|
|
| |
| |
| |
| |
| const void* GetData() const; |
|
|
| |
| |
| |
| |
| |
| std::size_t GetDataSize() const; |
|
|
| |
| |
| |
| |
| |
| bool EndOfPacket() const; |
|
|
| explicit operator bool() const; |
|
|
| |
| Packet& Read(bool& out_data); |
| Packet& Read(s8& out_data); |
| Packet& Read(u8& out_data); |
| Packet& Read(s16& out_data); |
| Packet& Read(u16& out_data); |
| Packet& Read(s32& out_data); |
| Packet& Read(u32& out_data); |
| Packet& Read(s64& out_data); |
| Packet& Read(u64& out_data); |
| Packet& Read(float& out_data); |
| Packet& Read(double& out_data); |
| Packet& Read(char* out_data); |
| Packet& Read(std::string& out_data); |
| template <typename T> |
| Packet& Read(std::vector<T>& out_data); |
| template <typename T, std::size_t S> |
| Packet& Read(std::array<T, S>& out_data); |
|
|
| |
| Packet& Write(bool in_data); |
| Packet& Write(s8 in_data); |
| Packet& Write(u8 in_data); |
| Packet& Write(s16 in_data); |
| Packet& Write(u16 in_data); |
| Packet& Write(s32 in_data); |
| Packet& Write(u32 in_data); |
| Packet& Write(s64 in_data); |
| Packet& Write(u64 in_data); |
| Packet& Write(float in_data); |
| Packet& Write(double in_data); |
| Packet& Write(const char* in_data); |
| Packet& Write(const std::string& in_data); |
| template <typename T> |
| Packet& Write(const std::vector<T>& in_data); |
| template <typename T, std::size_t S> |
| Packet& Write(const std::array<T, S>& data); |
|
|
| private: |
| |
| |
| |
| |
| |
| |
| bool CheckSize(std::size_t size); |
|
|
| |
| std::vector<char> data; |
| std::size_t read_pos = 0; |
| bool is_valid = true; |
| }; |
|
|
| template <typename T> |
| Packet& Packet::Read(std::vector<T>& out_data) { |
| |
| u32 size = 0; |
| Read(size); |
| out_data.resize(size); |
|
|
| |
| for (std::size_t i = 0; i < out_data.size(); ++i) { |
| T character; |
| Read(character); |
| out_data[i] = character; |
| } |
| return *this; |
| } |
|
|
| template <typename T, std::size_t S> |
| Packet& Packet::Read(std::array<T, S>& out_data) { |
| for (std::size_t i = 0; i < out_data.size(); ++i) { |
| T character; |
| Read(character); |
| out_data[i] = character; |
| } |
| return *this; |
| } |
|
|
| template <typename T> |
| Packet& Packet::Write(const std::vector<T>& in_data) { |
| |
| Write(static_cast<u32>(in_data.size())); |
|
|
| |
| for (std::size_t i = 0; i < in_data.size(); ++i) { |
| Write(in_data[i]); |
| } |
| return *this; |
| } |
|
|
| template <typename T, std::size_t S> |
| Packet& Packet::Write(const std::array<T, S>& in_data) { |
| for (std::size_t i = 0; i < in_data.size(); ++i) { |
| Write(in_data[i]); |
| } |
| return *this; |
| } |
|
|
| } |
|
|