libfly  6.2.2
C++20 utility library for Linux, macOS, and Windows
concepts.hpp
1 #pragma once
2 
3 #include "fly/concepts/concepts.hpp"
4 
5 #include <memory>
6 
7 namespace fly::net {
8 
9 class IPv4Address;
10 class IPv6Address;
11 
15 template <typename T>
16 concept IPAddress = fly::SameAsAny<T, IPv4Address, IPv6Address>;
17 
18 template <IPAddress IPAddressType>
19 class Endpoint;
20 
24 template <typename T>
25 concept IPEndpoint = fly::SameAsAny<T, Endpoint<IPv4Address>, Endpoint<IPv6Address>>;
26 
27 template <IPEndpoint EndpointType>
28 class ListenSocket;
29 
30 template <IPEndpoint EndpointType>
31 class TcpSocket;
32 
33 template <IPEndpoint EndpointType>
34 class UdpSocket;
35 
39 template <typename T>
40 concept Socket = fly::SameAsAny<
41  T,
42  ListenSocket<Endpoint<IPv4Address>>,
43  ListenSocket<Endpoint<IPv6Address>>,
44  TcpSocket<Endpoint<IPv4Address>>,
45  TcpSocket<Endpoint<IPv6Address>>,
46  UdpSocket<Endpoint<IPv4Address>>,
47  UdpSocket<Endpoint<IPv6Address>>>;
48 
53 template <typename T, typename SocketType>
54 concept SocketNotification = requires(T callback)
55 {
56  requires Socket<SocketType>;
57  callback(std::declval<std::shared_ptr<SocketType>>());
58 };
59 
60 } // namespace fly::net