TLA Line data Source code
1 : //
2 : // Copyright (c) 2026 Steve Gerbino
3 : //
4 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 : //
7 : // Official repository: https://github.com/cppalliance/corosio
8 : //
9 :
10 : /** @file native_tcp.hpp
11 :
12 : Inline TCP protocol type using platform-specific constants.
13 : All methods are `constexpr` or trivially inlined, giving zero
14 : overhead compared to hand-written socket creation calls.
15 :
16 : This header includes platform socket headers
17 : (`<sys/socket.h>`, `<netinet/in.h>`, etc.).
18 : For a version that avoids platform includes, use
19 : `<boost/corosio/tcp.hpp>` (`boost::corosio::tcp`).
20 :
21 : Both variants satisfy the same protocol-type interface and work
22 : interchangeably with `tcp_socket::open` / `tcp_acceptor::open`.
23 :
24 : @see boost::corosio::tcp
25 : */
26 :
27 : #ifndef BOOST_COROSIO_NATIVE_NATIVE_TCP_HPP
28 : #define BOOST_COROSIO_NATIVE_NATIVE_TCP_HPP
29 :
30 : #ifdef _WIN32
31 : #include <winsock2.h>
32 : #include <ws2tcpip.h>
33 : #else
34 : #include <netinet/in.h>
35 : #include <sys/socket.h>
36 : #endif
37 :
38 : namespace boost::corosio {
39 :
40 : class tcp_socket;
41 : class tcp_acceptor;
42 :
43 : } // namespace boost::corosio
44 :
45 : namespace boost::corosio {
46 :
47 : /** Inline TCP protocol type with platform constants.
48 :
49 : Same shape as @ref boost::corosio::tcp but with inline
50 : `family()`, `type()`, and `protocol()` methods that
51 : resolve to compile-time constants.
52 :
53 : @see boost::corosio::tcp
54 : */
55 : class native_tcp
56 : {
57 : bool v6_;
58 HIT 7862 : explicit constexpr native_tcp( bool v6 ) noexcept : v6_( v6 ) {}
59 :
60 : public:
61 : /// Construct an IPv4 TCP protocol.
62 7836 : static constexpr native_tcp v4() noexcept { return native_tcp( false ); }
63 :
64 : /// Construct an IPv6 TCP protocol.
65 26 : static constexpr native_tcp v6() noexcept { return native_tcp( true ); }
66 :
67 : /// Return true if this is IPv6.
68 : constexpr bool is_v6() const noexcept { return v6_; }
69 :
70 : /// Return the address family (AF_INET or AF_INET6).
71 7862 : int family() const noexcept
72 : {
73 7862 : return v6_ ? AF_INET6 : AF_INET;
74 : }
75 :
76 : /// Return the socket type (SOCK_STREAM).
77 7862 : static constexpr int type() noexcept { return SOCK_STREAM; }
78 :
79 : /// Return the IP protocol (IPPROTO_TCP).
80 7862 : static constexpr int protocol() noexcept { return IPPROTO_TCP; }
81 :
82 : /// The associated socket type.
83 : using socket = tcp_socket;
84 :
85 : /// The associated acceptor type.
86 : using acceptor = tcp_acceptor;
87 :
88 : friend constexpr bool operator==( native_tcp a, native_tcp b ) noexcept
89 : {
90 : return a.v6_ == b.v6_;
91 : }
92 :
93 : friend constexpr bool operator!=( native_tcp a, native_tcp b ) noexcept
94 : {
95 : return a.v6_ != b.v6_;
96 : }
97 : };
98 :
99 : } // namespace boost::corosio
100 :
101 : #endif // BOOST_COROSIO_NATIVE_NATIVE_TCP_HPP
|