| |
| |
| |
|
|
| #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& operator>>(bool& out_data); |
| Packet& operator>>(s8& out_data); |
| Packet& operator>>(u8& out_data); |
| Packet& operator>>(s16& out_data); |
| Packet& operator>>(u16& out_data); |
| Packet& operator>>(s32& out_data); |
| Packet& operator>>(u32& out_data); |
| Packet& operator>>(s64& out_data); |
| Packet& operator>>(u64& out_data); |
| Packet& operator>>(float& out_data); |
| Packet& operator>>(double& out_data); |
| Packet& operator>>(char* out_data); |
| Packet& operator>>(std::string& out_data); |
| template <typename T> |
| Packet& operator>>(std::vector<T>& out_data); |
| template <typename T, std::size_t S> |
| Packet& operator>>(std::array<T, S>& out_data); |
|
|
| |
| Packet& operator<<(bool in_data); |
| Packet& operator<<(s8 in_data); |
| Packet& operator<<(u8 in_data); |
| Packet& operator<<(s16 in_data); |
| Packet& operator<<(u16 in_data); |
| Packet& operator<<(s32 in_data); |
| Packet& operator<<(u32 in_data); |
| Packet& operator<<(s64 in_data); |
| Packet& operator<<(u64 in_data); |
| Packet& operator<<(float in_data); |
| Packet& operator<<(double in_data); |
| Packet& operator<<(const char* in_data); |
| Packet& operator<<(const std::string& in_data); |
| template <typename T> |
| Packet& operator<<(const std::vector<T>& in_data); |
| template <typename T, std::size_t S> |
| Packet& operator<<(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::operator>>(std::vector<T>& out_data) { |
| |
| u32 size = 0; |
| *this >> size; |
| out_data.resize(size); |
|
|
| |
| for (std::size_t i = 0; i < out_data.size(); ++i) { |
| T character; |
| *this >> character; |
| out_data[i] = character; |
| } |
| return *this; |
| } |
|
|
| template <typename T, std::size_t S> |
| Packet& Packet::operator>>(std::array<T, S>& out_data) { |
| for (std::size_t i = 0; i < out_data.size(); ++i) { |
| T character; |
| *this >> character; |
| out_data[i] = character; |
| } |
| return *this; |
| } |
|
|
| template <typename T> |
| Packet& Packet::operator<<(const std::vector<T>& in_data) { |
| |
| *this << static_cast<u32>(in_data.size()); |
|
|
| |
| for (std::size_t i = 0; i < in_data.size(); ++i) { |
| *this << in_data[i]; |
| } |
| return *this; |
| } |
|
|
| template <typename T, std::size_t S> |
| Packet& Packet::operator<<(const std::array<T, S>& in_data) { |
| for (std::size_t i = 0; i < in_data.size(); ++i) { |
| *this << in_data[i]; |
| } |
| return *this; |
| } |
|
|
| } |
|
|