18#include "pw_status/status.h"
19#include "pw_status/status_with_size.h"
25#define PW_TRY(expr) _PW_TRY(_PW_TRY_UNIQUE(__LINE__), expr)
27#define _PW_TRY(result, expr) \
29 if (auto result = (expr); !result.ok()) { \
30 return ::pw::internal::ConvertToStatus(result); \
36#define PW_TRY_ASSIGN(lhs, expression) \
37 _PW_TRY_ASSIGN(_PW_TRY_UNIQUE(__LINE__), lhs, expression)
39#define _PW_TRY_ASSIGN(result, lhs, expr) \
40 auto result = (expr); \
42 return ::pw::internal::ConvertToStatus(result); \
44 lhs = ::pw::internal::ConvertToValue(result)
49#define PW_TRY_WITH_SIZE(expr) _PW_TRY_WITH_SIZE(_PW_TRY_UNIQUE(__LINE__), expr)
51#define _PW_TRY_WITH_SIZE(result, expr) \
53 if (auto result = (expr); !result.ok()) { \
54 return ::pw::internal::ConvertToStatusWithSize(result); \
58#define _PW_TRY_UNIQUE(line) _PW_TRY_UNIQUE_EXPANDED(line)
59#define _PW_TRY_UNIQUE_EXPANDED(line) _pw_try_unique_name_##line
66#define PW_CO_TRY(expr) _PW_CO_TRY(_PW_TRY_UNIQUE(__LINE__), expr)
68#define _PW_CO_TRY(result, expr) \
70 if (auto result = (expr); !result.ok()) { \
71 co_return ::pw::internal::ConvertToStatus(result); \
80#define PW_CO_TRY_ASSIGN(lhs, expression) \
81 _PW_CO_TRY_ASSIGN(_PW_TRY_UNIQUE(__LINE__), lhs, expression)
83#define _PW_CO_TRY_ASSIGN(result, lhs, expr) \
84 auto result = (expr); \
86 co_return ::pw::internal::ConvertToStatus(result); \
88 lhs = ::pw::internal::ConvertToValue(result);
90namespace pw::internal {
92constexpr Status ConvertToStatus(Status status) {
return status; }
94constexpr Status ConvertToStatus(StatusWithSize status_with_size) {
95 return status_with_size.status();
98constexpr size_t ConvertToValue(StatusWithSize status_with_size) {
99 return status_with_size.size();
102constexpr StatusWithSize ConvertToStatusWithSize(Status status) {
103 return StatusWithSize(status, 0);
106constexpr StatusWithSize ConvertToStatusWithSize(
107 StatusWithSize status_with_size) {
108 return status_with_size;