include/boost/capy/cond.hpp

100.0% Lines (3/3) 100.0% Functions (1/1)
Line TLA Hits Source Code
1 //
2 // Copyright (c) 2025 Vinnie Falco (vinnie.falco@gmail.com)
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/capy
8 //
9
10 #ifndef BOOST_CAPY_COND_HPP
11 #define BOOST_CAPY_COND_HPP
12
13 #include <boost/capy/detail/config.hpp>
14 #include <system_error>
15
16 namespace boost {
17 namespace capy {
18
19 /** Portable error conditions for capy I/O operations.
20
21 These are the conditions callers should compare against when
22 handling errors from capy operations. The @ref error enum values
23 map to these conditions, as do platform-specific error codes
24 (e.g., `ECANCELED`, SSL EOF errors).
25
26 @par Example
27
28 @code
29 auto [ec, n] = co_await stream.read_some( bufs );
30 if( ec == cond::canceled )
31 // handle cancellation
32 else if( ec == cond::eof )
33 // handle end of stream
34 else if( ec )
35 // handle other errors
36 @endcode
37
38 @see error
39 */
40 enum class cond
41 {
42 /** End-of-stream condition.
43
44 An `error_code` compares equal to `eof` when the stream
45 reached its natural end, such as when a peer sends TCP FIN
46 or a file reaches EOF.
47 */
48 eof = 1,
49
50 /** Operation cancelled condition.
51
52 An `error_code` compares equal to `canceled` when the
53 operation's stop token was activated, the I/O object's
54 `cancel()` was called, or a platform cancellation error
55 occurred.
56 */
57 canceled = 2,
58
59 /** Stream truncated condition.
60
61 An `error_code` compares equal to `stream_truncated` when
62 a TLS peer closed the connection without sending a proper
63 shutdown alert.
64 */
65 stream_truncated = 3,
66
67 /** Item not found condition.
68
69 An `error_code` compares equal to `not_found` when a
70 lookup operation failed to find the requested item.
71 */
72 not_found = 4
73 };
74
75 } // capy
76 } // boost
77
78 namespace std {
79 template<>
80 struct is_error_condition_enum<
81 ::boost::capy::cond>
82 : std::true_type {};
83 } // std
84
85 namespace boost {
86 namespace capy {
87
88 namespace detail {
89
90 struct BOOST_CAPY_SYMBOL_VISIBLE
91 cond_cat_type
92 : std::error_category
93 {
94 BOOST_CAPY_DECL const char* name(
95 ) const noexcept override;
96 BOOST_CAPY_DECL std::string message(
97 int) const override;
98 BOOST_CAPY_DECL bool equivalent(
99 std::error_code const& ec,
100 int condition) const noexcept override;
101 constexpr cond_cat_type() noexcept = default;
102 };
103
104 BOOST_CAPY_DECL extern cond_cat_type cond_cat;
105
106 } // detail
107
108 /// Create an error_condition from a cond value.
109 inline
110 std::error_condition
111 1395x make_error_condition(
112 cond ev) noexcept
113 {
114 1395x return std::error_condition{
115 static_cast<std::underlying_type<
116 cond>::type>(ev),
117 1395x detail::cond_cat};
118 }
119
120 } // capy
121 } // boost
122
123 #endif
124