FastEngine 0.9.5
A multiplayer oriented 2D engine made with Vulkan.
Loading...
Searching...
No Matches
C_packet.hpp
1/*
2 * Copyright 2026 Guillaume Guillet
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef _FGE_C_PACKET_HPP_INCLUDED_
18#define _FGE_C_PACKET_HPP_INCLUDED_
19
20/*
21 * Original from : https://github.com/SFML/SFML
22 * Copyright (C) 2007-2022 Laurent Gomila
23 *
24 * Altered/Modified by Guillaume Guillet
25 */
26
27#include "FastEngine/fge_extern.hpp"
28#include "FastEngine/C_matrix.hpp"
29#include "FastEngine/network/C_error.hpp"
30#include "tinyutf8.h"
31#include <cstdint>
32#include <forward_list>
33#include <list>
34#include <span>
35#include <string>
36#include <vector>
37
38#include "FastEngine/C_vector.hpp"
39#include "FastEngine/graphic/C_color.hpp"
40
41#define FGE_PACKET_DEFAULT_RESERVESIZE 4096
42
43namespace fge::net
44{
45
46class SocketTcp;
47class SocketUdp;
48
49using SizeType = uint16_t;
50
51class FGE_API Packet
52{
53public:
54 Packet();
55 Packet(Packet&& pck) noexcept;
56 Packet(Packet const& pck) = default;
57 explicit Packet(std::size_t reserveSize);
58 virtual ~Packet() = default;
59
60 Packet& operator=(Packet const& pck) = default;
61 Packet& operator=(Packet&& pck) noexcept;
62
63 void clear();
64 void flush();
65 void reserve(std::size_t reserveSize);
66
67 Packet& append(std::size_t size); //Will push to host byte order without data (increasing size)
68 Packet& append(void const* data, std::size_t size); //Will push to host byte order
69 Packet& pack(void const* data, std::size_t size); //Will push and auto convert to network byte order
70
71 bool write(std::size_t pos, void const* data, std::size_t size); //Will write to host byte order
72 bool pack(std::size_t pos, void const* data, std::size_t size); //Will write and auto convert to network byte order
73
74 Packet const& read(void* buff, std::size_t size) const; //Will read to network byte order
75 Packet const& unpack(void* buff, std::size_t size) const; //Will read and auto convert to host byte order
76
77 bool read(std::size_t pos, void* buff, std::size_t size) const; //Will read to network byte order
78 bool unpack(std::size_t pos, void* buff, std::size_t size) const; //Will read and auto convert to host byte order
79
80 Packet& shrink(std::size_t size);
81 bool erase(std::size_t pos, std::size_t size);
82 Packet const& skip(std::size_t size) const;
83
84 void setReadPos(std::size_t pos) const;
85 [[nodiscard]] std::size_t getReadPos() const;
86 [[nodiscard]] bool isExtractable(std::size_t size) const;
87
88 [[nodiscard]] uint8_t const* getData(std::size_t pos) const; //Get data pointer to pos
89 [[nodiscard]] uint8_t* getData(std::size_t pos);
90 [[nodiscard]] uint8_t const* getData() const; //Get data pointer to pos 0
91 [[nodiscard]] uint8_t* getData();
92
93 [[nodiscard]] std::size_t getDataSize() const;
94 [[nodiscard]] uint32_t getLength() const; //Get length of a string or others at the read position
95 //can be useful to allocate a char buffer before reading
96 void invalidate() const;
97 void setValidity(bool validity) const;
98 [[nodiscard]] bool isValid() const;
99 [[nodiscard]] explicit operator bool() const;
100 [[nodiscard]] bool endReached() const;
101
102 [[nodiscard]] std::vector<uint8_t> const& getTransmitCache() const;
103 [[nodiscard]] std::size_t getTransmitPos() const;
104 [[nodiscard]] bool isTransmitCacheValid() const;
105 void invalidateTransmitCache();
106
107 inline Packet& operator<<(bool data);
108
109 inline Packet& operator<<(int8_t data);
110 inline Packet& operator<<(int16_t data);
111 inline Packet& operator<<(int32_t data);
112 inline Packet& operator<<(int64_t data);
113
114 inline Packet& operator<<(uint8_t data);
115 inline Packet& operator<<(uint16_t data);
116 inline Packet& operator<<(uint32_t data);
117 inline Packet& operator<<(uint64_t data);
118
119 inline Packet& operator<<(float data);
120 inline Packet& operator<<(double data);
121 inline Packet& operator<<(long double data);
122
123 Packet& operator<<(std::string_view const& data);
124 Packet& operator<<(char const* data);
125 Packet& operator<<(std::string const& data);
126 Packet& operator<<(tiny_utf8::string const& data);
127 Packet& operator<<(wchar_t const* data);
128 Packet& operator<<(std::wstring const& data);
129
130 template<typename T>
131 Packet& operator<<(std::forward_list<T> const& data);
132 template<typename T>
133 Packet& operator<<(std::list<T> const& data);
134 template<typename T>
135 Packet& operator<<(std::vector<T> const& data);
136
137 template<typename T>
138 Packet& operator<<(fge::Vector2<T> const& data);
139 template<typename T>
140 Packet& operator<<(fge::Vector3<T> const& data);
141
142 template<typename T>
143 Packet& operator<<(fge::Matrix<T> const& data);
144
145 inline Packet& operator<<(fge::Color const& data);
146
147 template<class TEnum, typename = std::enable_if_t<std::is_enum_v<TEnum>>>
148 inline Packet& operator<<(TEnum const& data);
149
150 template<class TData>
151 inline Packet& operator<<(std::unique_ptr<TData> const& data);
152
154
155 inline Packet const& operator>>(bool& data) const;
156
157 inline Packet const& operator>>(int8_t& data) const;
158 inline Packet const& operator>>(int16_t& data) const;
159 inline Packet const& operator>>(int32_t& data) const;
160 inline Packet const& operator>>(int64_t& data) const;
161
162 inline Packet const& operator>>(uint8_t& data) const;
163 inline Packet const& operator>>(uint16_t& data) const;
164 inline Packet const& operator>>(uint32_t& data) const;
165 inline Packet const& operator>>(uint64_t& data) const;
166
167 inline Packet const& operator>>(float& data) const;
168 inline Packet const& operator>>(double& data) const;
169 inline Packet const& operator>>(long double& data) const;
170
171 Packet const& operator>>(char* data) const;
172 Packet const& operator>>(std::string& data) const;
173 Packet const& operator>>(tiny_utf8::string& data) const;
174 Packet const& operator>>(wchar_t* data) const;
175 Packet const& operator>>(std::wstring& data) const;
176
177 template<typename T>
178 Packet const& operator>>(std::forward_list<T>& data) const;
179 template<typename T>
180 Packet const& operator>>(std::list<T>& data) const;
181 template<typename T>
182 Packet const& operator>>(std::vector<T>& data) const;
183
184 template<typename T>
185 Packet const& operator>>(fge::Vector2<T>& data) const;
186 template<typename T>
187 Packet const& operator>>(fge::Vector3<T>& data) const;
188
189 template<typename T>
190 Packet const& operator>>(fge::Matrix<T>& data) const;
191
192 inline Packet const& operator>>(fge::Color& data) const;
193
194 template<class TEnum, typename = std::enable_if_t<std::is_enum_v<TEnum>>>
195 inline Packet const& operator>>(TEnum& data) const;
196
197 template<class TData>
198 inline Packet const& operator>>(std::unique_ptr<TData>& data) const;
199
200 bool operator==(Packet const& right) const = delete;
201 bool operator!=(Packet const& right) const = delete;
202
203 [[nodiscard]] virtual bool onSend(std::size_t offset);
204 virtual void onReceive(std::span<uint8_t const> const& data);
205
206protected:
207 friend class SocketTcp;
208 friend class SocketUdp;
209
210 std::vector<uint8_t> _g_transmitCache;
211 std::size_t _g_transmitPos;
212 bool _g_transmitCacheValid;
213
214private:
215 std::vector<uint8_t> g_data;
216 mutable std::size_t g_readPos;
217 mutable bool g_valid;
218};
219
220} // namespace fge::net
221
222#include "C_packet.inl"
223
224#endif // _FGE_C_PACKET_HPP_INCLUDED_
Definition C_color.hpp:35
A container to store a 2D matrix of any type.
Definition C_matrix.hpp:40
A wrapper for TCP sockets inheriting from Socket.
Definition C_socket.hpp:500
A wrapper for UDP sockets inheriting from Socket.
Definition C_socket.hpp:355