xref: /aosp_15_r20/external/cronet/third_party/anonymous_tokens/src/anonymous_tokens/cpp/shared/status_utils.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2023 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //    https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef ANONYMOUS_TOKENS_CPP_SHARED_STATUS_UTILS_H_
16 #define ANONYMOUS_TOKENS_CPP_SHARED_STATUS_UTILS_H_
17 
18 #include "absl/base/optimization.h"
19 #include "absl/status/status.h"
20 
21 namespace anonymous_tokens {
22 
23 #define _ANON_TOKENS_STATUS_MACROS_CONCAT_NAME(x, y) \
24   _ANON_TOKENS_STATUS_MACROS_CONCAT_IMPL(x, y)
25 #define _ANON_TOKENS_STATUS_MACROS_CONCAT_IMPL(x, y) x##y
26 
27 #define ANON_TOKENS_ASSIGN_OR_RETURN(lhs, rexpr)                             \
28   _ANON_TOKENS_ASSIGN_OR_RETURN_IMPL(                                        \
29       _ANON_TOKENS_STATUS_MACROS_CONCAT_NAME(_status_or_val, __LINE__), lhs, \
30       rexpr)
31 
32 #define _ANON_TOKENS_ASSIGN_OR_RETURN_IMPL(statusor, lhs, rexpr) \
33   auto statusor = (rexpr);                                       \
34   if (ABSL_PREDICT_FALSE(!statusor.ok())) {                      \
35     return statusor.status();                                    \
36   }                                                              \
37   lhs = *std::move(statusor)
38 
39 #define ANON_TOKENS_RETURN_IF_ERROR(expr)                  \
40   do {                                                     \
41     auto _status = (expr);                                 \
42     if (ABSL_PREDICT_FALSE(!_status.ok())) return _status; \
43   } while (0)
44 
45 }  // namespace anonymous_tokens
46 
47 #endif  // ANONYMOUS_TOKENS_CPP_SHARED_STATUS_UTILS_H_
48