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