| | |
| | |
| |
|
| | #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; |
| | } |
| |
|
| | } |
| |
|