1*9356374aSAndroid Build Coastguard Worker // Copyright 2022 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker //
15*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
16*9356374aSAndroid Build Coastguard Worker // File: log/die_if_null.h
17*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
18*9356374aSAndroid Build Coastguard Worker //
19*9356374aSAndroid Build Coastguard Worker // This header declares macro `ABSL_DIE_IF_NULL`.
20*9356374aSAndroid Build Coastguard Worker
21*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_LOG_DIE_IF_NULL_H_
22*9356374aSAndroid Build Coastguard Worker #define ABSL_LOG_DIE_IF_NULL_H_
23*9356374aSAndroid Build Coastguard Worker
24*9356374aSAndroid Build Coastguard Worker #include <stdint.h>
25*9356374aSAndroid Build Coastguard Worker
26*9356374aSAndroid Build Coastguard Worker #include <utility>
27*9356374aSAndroid Build Coastguard Worker
28*9356374aSAndroid Build Coastguard Worker #include "absl/base/attributes.h"
29*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
30*9356374aSAndroid Build Coastguard Worker #include "absl/base/optimization.h"
31*9356374aSAndroid Build Coastguard Worker
32*9356374aSAndroid Build Coastguard Worker // ABSL_DIE_IF_NULL()
33*9356374aSAndroid Build Coastguard Worker //
34*9356374aSAndroid Build Coastguard Worker // `ABSL_DIE_IF_NULL` behaves as `CHECK_NE` against `nullptr` but *also*
35*9356374aSAndroid Build Coastguard Worker // "returns" its argument. It is useful in initializers where statements (like
36*9356374aSAndroid Build Coastguard Worker // `CHECK_NE`) can't be used. Outside initializers, prefer `CHECK` or
37*9356374aSAndroid Build Coastguard Worker // `CHECK_NE`. `ABSL_DIE_IF_NULL` works for both raw pointers and (compatible)
38*9356374aSAndroid Build Coastguard Worker // smart pointers including `std::unique_ptr` and `std::shared_ptr`; more
39*9356374aSAndroid Build Coastguard Worker // generally, it works for any type that can be compared to nullptr_t. For
40*9356374aSAndroid Build Coastguard Worker // types that aren't raw pointers, `ABSL_DIE_IF_NULL` returns a reference to
41*9356374aSAndroid Build Coastguard Worker // its argument, preserving the value category. Example:
42*9356374aSAndroid Build Coastguard Worker //
43*9356374aSAndroid Build Coastguard Worker // Foo() : bar_(ABSL_DIE_IF_NULL(MethodReturningUniquePtr())) {}
44*9356374aSAndroid Build Coastguard Worker //
45*9356374aSAndroid Build Coastguard Worker // Use `CHECK(ptr)` or `CHECK(ptr != nullptr)` if the returned pointer is
46*9356374aSAndroid Build Coastguard Worker // unused.
47*9356374aSAndroid Build Coastguard Worker #define ABSL_DIE_IF_NULL(val) \
48*9356374aSAndroid Build Coastguard Worker ::absl::log_internal::DieIfNull(__FILE__, __LINE__, #val, (val))
49*9356374aSAndroid Build Coastguard Worker
50*9356374aSAndroid Build Coastguard Worker namespace absl {
51*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
52*9356374aSAndroid Build Coastguard Worker namespace log_internal {
53*9356374aSAndroid Build Coastguard Worker
54*9356374aSAndroid Build Coastguard Worker // Crashes the process after logging `exprtext` annotated at the `file` and
55*9356374aSAndroid Build Coastguard Worker // `line` location. Called when `ABSL_DIE_IF_NULL` fails. Calling this function
56*9356374aSAndroid Build Coastguard Worker // generates less code than its implementation would if inlined, for a slight
57*9356374aSAndroid Build Coastguard Worker // code size reduction each time `ABSL_DIE_IF_NULL` is called.
58*9356374aSAndroid Build Coastguard Worker [[noreturn]] ABSL_ATTRIBUTE_NOINLINE void DieBecauseNull(
59*9356374aSAndroid Build Coastguard Worker const char* file, int line, const char* exprtext);
60*9356374aSAndroid Build Coastguard Worker
61*9356374aSAndroid Build Coastguard Worker // Helper for `ABSL_DIE_IF_NULL`.
62*9356374aSAndroid Build Coastguard Worker template <typename T>
DieIfNull(const char * file,int line,const char * exprtext,T && t)63*9356374aSAndroid Build Coastguard Worker ABSL_MUST_USE_RESULT T DieIfNull(const char* file, int line,
64*9356374aSAndroid Build Coastguard Worker const char* exprtext, T&& t) {
65*9356374aSAndroid Build Coastguard Worker if (ABSL_PREDICT_FALSE(t == nullptr)) {
66*9356374aSAndroid Build Coastguard Worker // Call a non-inline helper function for a small code size improvement.
67*9356374aSAndroid Build Coastguard Worker DieBecauseNull(file, line, exprtext);
68*9356374aSAndroid Build Coastguard Worker }
69*9356374aSAndroid Build Coastguard Worker return std::forward<T>(t);
70*9356374aSAndroid Build Coastguard Worker }
71*9356374aSAndroid Build Coastguard Worker
72*9356374aSAndroid Build Coastguard Worker } // namespace log_internal
73*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
74*9356374aSAndroid Build Coastguard Worker } // namespace absl
75*9356374aSAndroid Build Coastguard Worker
76*9356374aSAndroid Build Coastguard Worker #endif // ABSL_LOG_DIE_IF_NULL_H_
77