StormByte-Network 2.0.0
C++26 networking module of the StormByte suite
 
Loading...
Searching...
No Matches
typedefs.hxx
Go to the documentation of this file.
1/*
2 * Copyright (C) 2024-2026 David C. Manuelda (StormBytePP)
3 *
4 * This file is part of StormByte-Network.
5 *
6 * StormByte-Network original source is dual-licensed:
7 *
8 * 1. GNU Lesser General Public License v3.0 (or later)
9 * You may redistribute and/or modify this file under the terms of the
10 * GNU Lesser General Public License as published by the Free Software
11 * Foundation, either version 3 of the License, or (at your option)
12 * any later version.
13 *
14 * 2. Commercial license
15 * Alternatively, this file may be used under the terms of a commercial
16 * license agreement with the copyright holder
17 * (David C. Manuelda <StormByte@gmail.com>).
18 *
19 * Both licenses apply only to original StormByte-Network source in this
20 * repository. They do not cover other StormByte modules or any third-party
21 * material shipped with this repository (including everything under
22 * thirdparty/, and in particular the bundled StormByte Buffer tree), which
23 * remains under its own license.
24 *
25 * Neither license grants any patent rights. Any patent licenses required
26 * to use this software or third-party components must be obtained separately
27 * from the patent holders.
28 *
29 * StormByte-Network is distributed in the hope that it will be useful,
30 * but WITHOUT ANY WARRANTY; without even the implied warranty of
31 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
32 * GNU Lesser General Public License for more details.
33 *
34 * You should have received a copy of the GNU Lesser General Public License
35 * version 3 along with StormByte-Network. If not, see
36 * <https://www.gnu.org/licenses/lgpl-3.0.html>.
37 *
38 * SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-StormByte-Commercial
39 */
40
41#pragma once
42
54
55#ifdef WINDOWS
56#include <winsock2.h>
57#endif
58
59#include <memory>
60#include <utility>
61
65namespace StormByte::Network {
66 namespace Socket {
67 class Socket;
68 class Client;
69 }
70
71 namespace Connection {
72 #ifdef UNIX
73 using HandlerType = int;
74 #else
75 using HandlerType = SOCKET;
76 #endif
77 }
78
83 using PacketPointer = std::shared_ptr<Transport::Packet>;
84
95 public:
98 using CloneFunction = void* (*)(const void*);
99 using DestroyFunction = void (*)(void*) noexcept;
100
102 DeserializePacketFunction() noexcept = default;
103
109 template<typename Callable>
110 requires (!StormByte::Type::SameAs<std::decay_t<Callable>, DeserializePacketFunction>
111 && StormByte::Type::CopyConstructible<std::decay_t<Callable>>)
112 DeserializePacketFunction(Callable&& callable):
113 m_context(new std::decay_t<Callable>(std::forward<Callable>(callable))),
114 m_invoke(&Invoke<std::decay_t<Callable>>),
115 m_clone(&Clone<std::decay_t<Callable>>),
116 m_destroy(&Destroy<std::decay_t<Callable>>) {}
117
123
129
132
139
146
154 STORMBYTE_NETWORK_PUBLIC PacketPointer operator()(OpcodeType opcode, Buffer::Consumer payload,
155 StormByte::Safe::Shared<Logger::Log> logger) const;
156
158 explicit operator bool() const noexcept {
159 return m_context != nullptr;
160 }
161
162 private:
172 template<typename Callable>
173 static PacketPointer Invoke(void* context, OpcodeType opcode, Buffer::Consumer payload,
175 return (*static_cast<Callable*>(context))(opcode, std::move(payload), std::move(logger));
176 }
177
184 template<typename Callable>
185 static void* Clone(const void* context) {
186 return new Callable(*static_cast<const Callable*>(context));
187 }
188
194 template<typename Callable>
195 static void Destroy(void* context) noexcept {
196 delete static_cast<Callable*>(context);
197 }
198
199 void* m_context = nullptr;
200 InvokeFunction m_invoke = nullptr;
201 CloneFunction m_clone = nullptr;
202 DestroyFunction m_destroy = nullptr;
203 };
204}
Connection or socket operation failed.
Definition exception.hxx:118
Caller-owned callback that builds a packet from opcode and payload.
Definition typedefs.hxx:94
~DeserializePacketFunction() noexcept
Destroy through the caller's destruction trampoline.
Transport::Packet::OpcodeType OpcodeType
Wire opcode type.
Definition typedefs.hxx:96
DeserializePacketFunction(DeserializePacketFunction &&other) noexcept
Transfer callback ownership without touching its target.
void(*)(void *) noexcept DestroyFunction
Caller-allocator destroy trampoline.
Definition typedefs.hxx:99
void *(*)(const void *) CloneFunction
Caller-allocator clone trampoline.
Definition typedefs.hxx:98
PacketPointer(*)(void *, OpcodeType, Buffer::Consumer, StormByte::Safe::Shared< Logger::Log >) InvokeFunction
Invocation trampoline.
Definition typedefs.hxx:97
DeserializePacketFunction() noexcept=default
Empty callback.
DeserializePacketFunction(const DeserializePacketFunction &other)
Clone using the caller's target allocator trampoline.
unsigned short OpcodeType
Opcode storage type.
Definition packet.hxx:61
int HandlerType
Native socket handle (POSIX)
Definition typedefs.hxx:73
Network module of the StormByte suite.
Definition client.hxx:54
StormByte::Expected< std::shared_ptr< Socket::Client >, ConnectionError > ExpectedClient
Accept result.
Definition typedefs.hxx:81
StormByte::Expected< Connection::Read::Result, ConnectionClosed > ExpectedReadResult
Wait-for-data result.
Definition typedefs.hxx:82
std::shared_ptr< Transport::Packet > PacketPointer
Shared packet.
Definition typedefs.hxx:83
StormByte::Expected< void, ConnectionError > ExpectedVoid
Void operation result.
Definition typedefs.hxx:80
StormByte::Expected< Buffer::FIFO, ConnectionError > ExpectedBuffer
Receive buffer result.
Definition typedefs.hxx:79
Root namespace of the StormByte suite.
std::conditional_t< Type::Reference< T >, std::expected< std::reference_wrapper< std::remove_reference_t< T > >, Safe::Shared< E > >, std::expected< T, Safe::Shared< E > > > Expected
STL namespace.
#define STORMBYTE_NETWORK_PUBLIC
Definition visibility.h:51