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