22#include "fmt/format.h"
23#include "tl/expected.hpp"
48#define CF_ERR(MSG) tl::unexpected(CF_STACK_TRACE_ENTRY("") << MSG)
49#define CF_ERRNO(MSG) tl::unexpected(CF_STACK_TRACE_ENTRY("") << MSG)
50#define CF_ERRF(MSG, ...) \
51 tl::unexpected(CF_STACK_TRACE_ENTRY("") \
52 << fmt::format(FMT_STRING(MSG), __VA_ARGS__))
56 return std::move(*value);
63 return std::move(*result);
67typename std::enable_if<std::is_convertible_v<T, bool>, T>
::type
69 return std::forward<T>(value);
76 return value.has_value();
81 return value.has_value();
96#define CF_EXPECT_OVERLOAD(_1, _2, NAME, ...) NAME
98#define CF_EXPECT2(RESULT, MSG) \
100 decltype(RESULT)&& macro_intermediate_result = RESULT; \
101 if (!TypeIsSuccess(macro_intermediate_result)) { \
102 auto current_entry = CF_STACK_TRACE_ENTRY(#RESULT); \
103 current_entry << MSG; \
104 auto error = ErrorFromType(macro_intermediate_result); \
105 error.PushEntry(std::move(current_entry)); \
106 return tl::unexpected(std::move(error)); \
108 OutcomeDereference(std::move(macro_intermediate_result)); \
111#define CF_EXPECT1(RESULT) CF_EXPECT2(RESULT, "")
149#define CF_EXPECT(...) \
150 CF_EXPECT_OVERLOAD(__VA_ARGS__, CF_EXPECT2, CF_EXPECT1)(__VA_ARGS__)
152#define CF_EXPECTF(RESULT, MSG, ...) \
153 CF_EXPECT(RESULT, fmt::format(FMT_STRING(MSG), __VA_ARGS__))
155#define CF_COMPARE_EXPECT4(COMPARE_OP, LHS_RESULT, RHS_RESULT, MSG) \
157 auto&& lhs_macro_intermediate_result = LHS_RESULT; \
158 auto&& rhs_macro_intermediate_result = RHS_RESULT; \
159 bool comparison_result = lhs_macro_intermediate_result COMPARE_OP \
160 rhs_macro_intermediate_result; \
161 if (!comparison_result) { \
162 auto current_entry = CF_STACK_TRACE_ENTRY(""); \
163 current_entry << "Expected \"" << #LHS_RESULT << "\" " << #COMPARE_OP \
164 << " \"" << #RHS_RESULT << "\" but was " \
165 << lhs_macro_intermediate_result << " vs " \
166 << rhs_macro_intermediate_result << ". "; \
167 current_entry << MSG; \
168 auto error = ErrorFromType(false); \
169 error.PushEntry(std::move(current_entry)); \
170 return tl::unexpected(std::move(error)); \
175#define CF_COMPARE_EXPECT3(COMPARE_OP, LHS_RESULT, RHS_RESULT) \
176 CF_COMPARE_EXPECT4(COMPARE_OP, LHS_RESULT, RHS_RESULT, "")
178#define CF_COMPARE_EXPECT_OVERLOAD(_1, _2, _3, _4, NAME, ...) NAME
180#define CF_COMPARE_EXPECT(...) \
181 CF_COMPARE_EXPECT_OVERLOAD(__VA_ARGS__, CF_COMPARE_EXPECT4, \
182 CF_COMPARE_EXPECT3) \
185#define CF_EXPECT_EQ(LHS_RESULT, RHS_RESULT, ...) \
186 CF_COMPARE_EXPECT(==, LHS_RESULT, RHS_RESULT, ##__VA_ARGS__)
187#define CF_EXPECT_NE(LHS_RESULT, RHS_RESULT, ...) \
188 CF_COMPARE_EXPECT(!=, LHS_RESULT, RHS_RESULT, ##__VA_ARGS__)
189#define CF_EXPECT_LE(LHS_RESULT, RHS_RESULT, ...) \
190 CF_COMPARE_EXPECT(<=, LHS_RESULT, RHS_RESULT, ##__VA_ARGS__)
191#define CF_EXPECT_LT(LHS_RESULT, RHS_RESULT, ...) \
192 CF_COMPARE_EXPECT(<, LHS_RESULT, RHS_RESULT, ##__VA_ARGS__)
193#define CF_EXPECT_GE(LHS_RESULT, RHS_RESULT, ...) \
194 CF_COMPARE_EXPECT(>=, LHS_RESULT, RHS_RESULT, ##__VA_ARGS__)
195#define CF_EXPECT_GT(LHS_RESULT, RHS_RESULT, ...) \
196 CF_COMPARE_EXPECT(>, LHS_RESULT, RHS_RESULT, ##__VA_ARGS__)
Definition: error_type.h:85
Definition: alloc_driver.h:20
T OutcomeDereference(std::optional< T > &&value)
Definition: expect.h:55
auto ErrorFromType(bool)
Definition: expect.h:84
tl::expected< T, StackTraceError > Result
Definition: result_type.h:30
bool TypeIsSuccess(bool value)
Definition: expect.h:72
uint8_t type
Definition: pairing_connection.h:0