17#ifndef ACTIONENGINE_UTIL_STATUS_MACROS_H_ 
   18#define ACTIONENGINE_UTIL_STATUS_MACROS_H_ 
   20#include "status_builder.h" 
   77#define RETURN_IF_ERROR(expr)                                           \ 
   78  STATUS_MACROS_IMPL_ELSE_BLOCKER_                                      \ 
   79  if (act::util::status_macro_internal::StatusAdaptorForMacros          \ 
   80          status_macro_internal_adaptor = {(expr), ACTIONENGINE_LOC}) { \ 
   82    return status_macro_internal_adaptor.Consume() 
  130#define ASSIGN_OR_RETURN(...)                                                \ 
  131  STATUS_MACROS_IMPL_GET_VARIADIC_((__VA_ARGS__,                             \ 
  132                                    STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_3_,  \ 
  133                                    STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_2_)) \ 
  142#define STATUS_MACROS_IMPL_GET_VARIADIC_HELPER_(_1, _2, _3, NAME, ...) NAME 
  143#define STATUS_MACROS_IMPL_GET_VARIADIC_(args) \ 
  144  STATUS_MACROS_IMPL_GET_VARIADIC_HELPER_ args 
  146#define STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_2_(lhs, rexpr)                  \ 
  147  STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_(                                     \ 
  148      STATUS_MACROS_IMPL_CONCAT_(_status_or_value, __LINE__), lhs, rexpr,   \ 
  149      return act::util::StatusBuilder(                                      \ 
  150          std::move(STATUS_MACROS_IMPL_CONCAT_(_status_or_value, __LINE__)) \ 
  153#define STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_3_(lhs, rexpr, error_expression) \ 
  154  STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_(                                      \ 
  155      STATUS_MACROS_IMPL_CONCAT_(_status_or_value, __LINE__), lhs, rexpr,    \ 
  156      act::util::StatusBuilder _(                                            \ 
  157          std::move(STATUS_MACROS_IMPL_CONCAT_(_status_or_value, __LINE__))  \ 
  161      return (error_expression)) 
  162#define STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_(statusor, lhs, rexpr, \ 
  164  auto statusor = (rexpr);                                         \ 
  165  if (ABSL_PREDICT_FALSE(!statusor.ok())) {                        \ 
  168  lhs = std::move(statusor).value() 
  171#define STATUS_MACROS_IMPL_CONCAT_INNER_(x, y) x##y 
  172#define STATUS_MACROS_IMPL_CONCAT_(x, y) STATUS_MACROS_IMPL_CONCAT_INNER_(x, y) 
  185#define STATUS_MACROS_IMPL_ELSE_BLOCKER_ \ 
  191namespace status_macro_internal {
 
  195class StatusAdaptorForMacros {
 
  197  StatusAdaptorForMacros(
const absl::Status& status, source_location location)
 
  198      : builder_(status, location) {}
 
  200  StatusAdaptorForMacros(absl::Status&& status, source_location location)
 
  201      : builder_(std::move(status), location) {}
 
  203  StatusAdaptorForMacros(
const StatusBuilder& builder,
 
  205      : builder_(builder) {}
 
  207  StatusAdaptorForMacros(StatusBuilder&& builder, source_location )
 
  208      : builder_(std::move(builder)) {}
 
  210  StatusAdaptorForMacros(
const StatusAdaptorForMacros&) = 
delete;
 
  211  StatusAdaptorForMacros& operator=(
const StatusAdaptorForMacros&) = 
delete;
 
  213  explicit operator bool()
 const { 
return ABSL_PREDICT_TRUE(builder_.ok()); }
 
  215  StatusBuilder&& Consume() { 
return std::move(builder_); }
 
  218  StatusBuilder builder_;