/proc/self/cwd/common/optional_ref.h
Line | Count | Source |
1 | | // Copyright 2024 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 THIRD_PARTY_CEL_CPP_OPTIONAL_REF_H_ |
16 | | #define THIRD_PARTY_CEL_CPP_OPTIONAL_REF_H_ |
17 | | |
18 | | #include <memory> |
19 | | #include <type_traits> |
20 | | |
21 | | #include "absl/base/attributes.h" |
22 | | #include "absl/base/macros.h" |
23 | | #include "absl/base/nullability.h" |
24 | | #include "absl/base/optimization.h" |
25 | | #include "absl/types/optional.h" |
26 | | #include "absl/utility/utility.h" |
27 | | |
28 | | namespace cel { |
29 | | |
30 | | // `optional_ref<T>` looks and feels like `absl::optional<T>`, but instead of |
31 | | // owning the underlying value, it retains a reference to the value it accepts |
32 | | // in its constructor. |
33 | | template <typename T> |
34 | | class optional_ref final { |
35 | | public: |
36 | | static_assert(!std::is_reference_v<T>, "T must not be a reference."); |
37 | | static_assert(!std::is_same_v<absl::nullopt_t, std::remove_cv_t<T>>, |
38 | | "optional_ref<absl::nullopt_t> is not allowed."); |
39 | | static_assert(!std::is_same_v<absl::in_place_t, std::remove_cv_t<T>>, |
40 | | "optional_ref<absl::in_place_t> is not allowed."); |
41 | | |
42 | | using value_type = T; |
43 | | |
44 | 276k | optional_ref() = default; Unexecuted instantiation: cel::optional_ref<cel::CustomListValue const>::optional_ref() Unexecuted instantiation: cel::optional_ref<cel::CustomMapValue const>::optional_ref() Unexecuted instantiation: cel::optional_ref<cel::OptionalValue const>::optional_ref() Unexecuted instantiation: cel::optional_ref<cel::ParsedMessageValue const>::optional_ref() cel::optional_ref<cel::BytesValue const>::optional_ref() Line | Count | Source | 44 | 181 | optional_ref() = default; |
cel::optional_ref<cel::ErrorValue const>::optional_ref() Line | Count | Source | 44 | 137k | optional_ref() = default; |
Unexecuted instantiation: cel::optional_ref<cel::OpaqueValue const>::optional_ref() Unexecuted instantiation: cel::optional_ref<cel::ParsedJsonListValue const>::optional_ref() Unexecuted instantiation: cel::optional_ref<cel::ParsedJsonMapValue const>::optional_ref() Unexecuted instantiation: cel::optional_ref<cel::ParsedMapFieldValue const>::optional_ref() Unexecuted instantiation: cel::optional_ref<cel::ParsedRepeatedFieldValue const>::optional_ref() Unexecuted instantiation: cel::optional_ref<cel::CustomStructValue const>::optional_ref() cel::optional_ref<cel::StringValue const>::optional_ref() Line | Count | Source | 44 | 81 | optional_ref() = default; |
cel::optional_ref<cel::TypeValue const>::optional_ref() Line | Count | Source | 44 | 79 | optional_ref() = default; |
cel::optional_ref<cel::UnknownValue const>::optional_ref() Line | Count | Source | 44 | 137k | optional_ref() = default; |
|
45 | | |
46 | | // NOLINTNEXTLINE(google-explicit-constructor) |
47 | 276k | constexpr optional_ref(absl::nullopt_t) : optional_ref() {}Unexecuted instantiation: cel::optional_ref<cel::CustomListValue const>::optional_ref(std::__1::nullopt_t) Unexecuted instantiation: cel::optional_ref<cel::CustomMapValue const>::optional_ref(std::__1::nullopt_t) Unexecuted instantiation: cel::optional_ref<cel::OptionalValue const>::optional_ref(std::__1::nullopt_t) Unexecuted instantiation: cel::optional_ref<cel::ParsedMessageValue const>::optional_ref(std::__1::nullopt_t) cel::optional_ref<cel::BytesValue const>::optional_ref(std::__1::nullopt_t) Line | Count | Source | 47 | 181 | constexpr optional_ref(absl::nullopt_t) : optional_ref() {} |
cel::optional_ref<cel::ErrorValue const>::optional_ref(std::__1::nullopt_t) Line | Count | Source | 47 | 137k | constexpr optional_ref(absl::nullopt_t) : optional_ref() {} |
Unexecuted instantiation: cel::optional_ref<cel::OpaqueValue const>::optional_ref(std::__1::nullopt_t) Unexecuted instantiation: cel::optional_ref<cel::ParsedJsonListValue const>::optional_ref(std::__1::nullopt_t) Unexecuted instantiation: cel::optional_ref<cel::ParsedJsonMapValue const>::optional_ref(std::__1::nullopt_t) Unexecuted instantiation: cel::optional_ref<cel::ParsedMapFieldValue const>::optional_ref(std::__1::nullopt_t) Unexecuted instantiation: cel::optional_ref<cel::ParsedRepeatedFieldValue const>::optional_ref(std::__1::nullopt_t) Unexecuted instantiation: cel::optional_ref<cel::CustomStructValue const>::optional_ref(std::__1::nullopt_t) cel::optional_ref<cel::StringValue const>::optional_ref(std::__1::nullopt_t) Line | Count | Source | 47 | 81 | constexpr optional_ref(absl::nullopt_t) : optional_ref() {} |
cel::optional_ref<cel::TypeValue const>::optional_ref(std::__1::nullopt_t) Line | Count | Source | 47 | 79 | constexpr optional_ref(absl::nullopt_t) : optional_ref() {} |
cel::optional_ref<cel::UnknownValue const>::optional_ref(std::__1::nullopt_t) Line | Count | Source | 47 | 137k | constexpr optional_ref(absl::nullopt_t) : optional_ref() {} |
|
48 | | |
49 | | // NOLINTNEXTLINE(google-explicit-constructor) |
50 | | constexpr optional_ref(T& value ABSL_ATTRIBUTE_LIFETIME_BOUND) |
51 | 1.00k | : value_(std::addressof(value)) {}cel::optional_ref<cel::CustomListValue const>::optional_ref(cel::CustomListValue const&) Line | Count | Source | 51 | 273 | : value_(std::addressof(value)) {} |
cel::optional_ref<cel::CustomMapValue const>::optional_ref(cel::CustomMapValue const&) Line | Count | Source | 51 | 43 | : value_(std::addressof(value)) {} |
Unexecuted instantiation: cel::optional_ref<cel::OptionalValue const>::optional_ref(cel::OptionalValue const&) Unexecuted instantiation: cel::optional_ref<cel::ParsedMessageValue const>::optional_ref(cel::ParsedMessageValue const&) cel::optional_ref<cel::BytesValue const>::optional_ref(cel::BytesValue const&) Line | Count | Source | 51 | 152 | : value_(std::addressof(value)) {} |
Unexecuted instantiation: cel::optional_ref<cel::ErrorValue const>::optional_ref(cel::ErrorValue const&) Unexecuted instantiation: cel::optional_ref<cel::OpaqueValue const>::optional_ref(cel::OpaqueValue const&) Unexecuted instantiation: cel::optional_ref<cel::ParsedJsonListValue const>::optional_ref(cel::ParsedJsonListValue const&) Unexecuted instantiation: cel::optional_ref<cel::ParsedJsonMapValue const>::optional_ref(cel::ParsedJsonMapValue const&) Unexecuted instantiation: cel::optional_ref<cel::ParsedMapFieldValue const>::optional_ref(cel::ParsedMapFieldValue const&) Unexecuted instantiation: cel::optional_ref<cel::ParsedRepeatedFieldValue const>::optional_ref(cel::ParsedRepeatedFieldValue const&) Unexecuted instantiation: cel::optional_ref<cel::CustomStructValue const>::optional_ref(cel::CustomStructValue const&) cel::optional_ref<cel::StringValue const>::optional_ref(cel::StringValue const&) Line | Count | Source | 51 | 538 | : value_(std::addressof(value)) {} |
Unexecuted instantiation: cel::optional_ref<cel::TypeValue const>::optional_ref(cel::TypeValue const&) Unexecuted instantiation: cel::optional_ref<cel::UnknownValue const>::optional_ref(cel::UnknownValue const&) |
52 | | |
53 | | template < |
54 | | typename U, |
55 | | typename = std::enable_if_t<std::conjunction_v< |
56 | | std::is_const<T>, std::is_same<std::decay_t<U>, std::decay_t<T>>>>> |
57 | | // NOLINTNEXTLINE(google-explicit-constructor) |
58 | | constexpr optional_ref( |
59 | | const absl::optional<U>& value ABSL_ATTRIBUTE_LIFETIME_BOUND) |
60 | | : value_(value.has_value() ? std::addressof(*value) : nullptr) {} |
61 | | |
62 | | template <typename U, typename = std::enable_if_t< |
63 | | std::is_same_v<std::decay_t<U>, std::decay_t<T>>>> |
64 | | // NOLINTNEXTLINE(google-explicit-constructor) |
65 | | constexpr optional_ref(absl::optional<U>& value ABSL_ATTRIBUTE_LIFETIME_BOUND) |
66 | | : value_(value.has_value() ? std::addressof(*value) : nullptr) {} |
67 | | |
68 | | template < |
69 | | typename U, |
70 | | typename = std::enable_if_t<std::conjunction_v< |
71 | | std::negation<std::is_same<U, T>>, |
72 | | std::is_convertible<std::add_pointer_t<U>, std::add_pointer_t<T>>>>> |
73 | | // NOLINTNEXTLINE(google-explicit-constructor) |
74 | | constexpr optional_ref(const optional_ref<U>& other) : value_(other.value_) {} |
75 | | |
76 | | optional_ref(const optional_ref<T>&) = default; |
77 | | |
78 | | optional_ref<T>& operator=(const optional_ref<T>&) = delete; |
79 | | |
80 | 277k | constexpr bool has_value() const { return value_ != nullptr; }cel::optional_ref<cel::CustomListValue const>::has_value() const Line | Count | Source | 80 | 273 | constexpr bool has_value() const { return value_ != nullptr; } |
cel::optional_ref<cel::CustomMapValue const>::has_value() const Line | Count | Source | 80 | 43 | constexpr bool has_value() const { return value_ != nullptr; } |
Unexecuted instantiation: cel::optional_ref<cel::ParsedMessageValue const>::has_value() const Unexecuted instantiation: cel::optional_ref<cel::OptionalValue const>::has_value() const cel::optional_ref<cel::BytesValue const>::has_value() const Line | Count | Source | 80 | 333 | constexpr bool has_value() const { return value_ != nullptr; } |
cel::optional_ref<cel::ErrorValue const>::has_value() const Line | Count | Source | 80 | 137k | constexpr bool has_value() const { return value_ != nullptr; } |
Unexecuted instantiation: cel::optional_ref<cel::OpaqueValue const>::has_value() const Unexecuted instantiation: cel::optional_ref<cel::ParsedJsonListValue const>::has_value() const Unexecuted instantiation: cel::optional_ref<cel::ParsedJsonMapValue const>::has_value() const Unexecuted instantiation: cel::optional_ref<cel::ParsedMapFieldValue const>::has_value() const Unexecuted instantiation: cel::optional_ref<cel::ParsedRepeatedFieldValue const>::has_value() const Unexecuted instantiation: cel::optional_ref<cel::CustomStructValue const>::has_value() const cel::optional_ref<cel::StringValue const>::has_value() const Line | Count | Source | 80 | 619 | constexpr bool has_value() const { return value_ != nullptr; } |
cel::optional_ref<cel::TypeValue const>::has_value() const Line | Count | Source | 80 | 79 | constexpr bool has_value() const { return value_ != nullptr; } |
cel::optional_ref<cel::UnknownValue const>::has_value() const Line | Count | Source | 80 | 137k | constexpr bool has_value() const { return value_ != nullptr; } |
|
81 | | |
82 | 276k | constexpr explicit operator bool() const { return has_value(); }cel::optional_ref<cel::CustomListValue const>::operator bool() const Line | Count | Source | 82 | 273 | constexpr explicit operator bool() const { return has_value(); } |
cel::optional_ref<cel::CustomMapValue const>::operator bool() const Line | Count | Source | 82 | 43 | constexpr explicit operator bool() const { return has_value(); } |
Unexecuted instantiation: cel::optional_ref<cel::ParsedMessageValue const>::operator bool() const Unexecuted instantiation: cel::optional_ref<cel::OptionalValue const>::operator bool() const Unexecuted instantiation: cel::optional_ref<cel::BytesValue const>::operator bool() const cel::optional_ref<cel::ErrorValue const>::operator bool() const Line | Count | Source | 82 | 137k | constexpr explicit operator bool() const { return has_value(); } |
Unexecuted instantiation: cel::optional_ref<cel::OpaqueValue const>::operator bool() const Unexecuted instantiation: cel::optional_ref<cel::ParsedJsonListValue const>::operator bool() const Unexecuted instantiation: cel::optional_ref<cel::ParsedJsonMapValue const>::operator bool() const Unexecuted instantiation: cel::optional_ref<cel::ParsedMapFieldValue const>::operator bool() const Unexecuted instantiation: cel::optional_ref<cel::ParsedRepeatedFieldValue const>::operator bool() const Unexecuted instantiation: cel::optional_ref<cel::CustomStructValue const>::operator bool() const Unexecuted instantiation: cel::optional_ref<cel::StringValue const>::operator bool() const Unexecuted instantiation: cel::optional_ref<cel::TypeValue const>::operator bool() const cel::optional_ref<cel::UnknownValue const>::operator bool() const Line | Count | Source | 82 | 137k | constexpr explicit operator bool() const { return has_value(); } |
|
83 | | |
84 | | constexpr T& value() const { |
85 | | return ABSL_PREDICT_TRUE(has_value()) |
86 | | ? *value_ |
87 | | // Replicate the same error logic as in `absl::optional`'s |
88 | | // `value()`. It either throws an exception or aborts the |
89 | | // program. We intentionally ignore the return value of |
90 | | // the constructed optional's value as we only need to run |
91 | | // the code for error checking. |
92 | | : ((void)absl::optional<T>().value(), *value_); |
93 | | } |
94 | | |
95 | 43 | constexpr T& operator*() const { |
96 | 43 | ABSL_ASSERT(has_value()); |
97 | 43 | return *value_; |
98 | 43 | } Unexecuted instantiation: cel::optional_ref<cel::CustomListValue const>::operator*() const cel::optional_ref<cel::CustomMapValue const>::operator*() const Line | Count | Source | 95 | 43 | constexpr T& operator*() const { | 96 | 43 | ABSL_ASSERT(has_value()); | 97 | 43 | return *value_; | 98 | 43 | } |
Unexecuted instantiation: cel::optional_ref<cel::ParsedMessageValue const>::operator*() const Unexecuted instantiation: cel::optional_ref<cel::OptionalValue const>::operator*() const Unexecuted instantiation: cel::optional_ref<cel::BytesValue const>::operator*() const Unexecuted instantiation: cel::optional_ref<cel::ErrorValue const>::operator*() const Unexecuted instantiation: cel::optional_ref<cel::OpaqueValue const>::operator*() const Unexecuted instantiation: cel::optional_ref<cel::ParsedJsonListValue const>::operator*() const Unexecuted instantiation: cel::optional_ref<cel::ParsedJsonMapValue const>::operator*() const Unexecuted instantiation: cel::optional_ref<cel::ParsedMapFieldValue const>::operator*() const Unexecuted instantiation: cel::optional_ref<cel::ParsedRepeatedFieldValue const>::operator*() const Unexecuted instantiation: cel::optional_ref<cel::CustomStructValue const>::operator*() const Unexecuted instantiation: cel::optional_ref<cel::StringValue const>::operator*() const Unexecuted instantiation: cel::optional_ref<cel::TypeValue const>::operator*() const Unexecuted instantiation: cel::optional_ref<cel::UnknownValue const>::operator*() const |
99 | | |
100 | 1.27k | constexpr T* absl_nonnull operator->() const { |
101 | 1.27k | ABSL_ASSERT(has_value()); |
102 | 1.27k | return value_; |
103 | 1.27k | } Unexecuted instantiation: cel::optional_ref<cel::OptionalValue const>::operator->() const cel::optional_ref<cel::StringValue const>::operator->() const Line | Count | Source | 100 | 538 | constexpr T* absl_nonnull operator->() const { | 101 | 538 | ABSL_ASSERT(has_value()); | 102 | 538 | return value_; | 103 | 538 | } |
cel::optional_ref<cel::BytesValue const>::operator->() const Line | Count | Source | 100 | 152 | constexpr T* absl_nonnull operator->() const { | 101 | 152 | ABSL_ASSERT(has_value()); | 102 | 152 | return value_; | 103 | 152 | } |
cel::optional_ref<cel::CustomListValue const>::operator->() const Line | Count | Source | 100 | 546 | constexpr T* absl_nonnull operator->() const { | 101 | 546 | ABSL_ASSERT(has_value()); | 102 | 546 | return value_; | 103 | 546 | } |
cel::optional_ref<cel::CustomMapValue const>::operator->() const Line | Count | Source | 100 | 43 | constexpr T* absl_nonnull operator->() const { | 101 | 43 | ABSL_ASSERT(has_value()); | 102 | 43 | return value_; | 103 | 43 | } |
Unexecuted instantiation: cel::optional_ref<cel::ParsedRepeatedFieldValue const>::operator->() const Unexecuted instantiation: cel::optional_ref<cel::ParsedMapFieldValue const>::operator->() const Unexecuted instantiation: cel::optional_ref<cel::ParsedJsonMapValue const>::operator->() const Unexecuted instantiation: cel::optional_ref<cel::ParsedJsonListValue const>::operator->() const Unexecuted instantiation: cel::optional_ref<cel::ErrorValue const>::operator->() const Unexecuted instantiation: cel::optional_ref<cel::ParsedMessageValue const>::operator->() const Unexecuted instantiation: cel::optional_ref<cel::TypeValue const>::operator->() const |
104 | | |
105 | | private: |
106 | | template <typename U> |
107 | | friend class optional_ref; |
108 | | |
109 | | T* const value_ = nullptr; |
110 | | }; |
111 | | |
112 | | template <typename T> |
113 | | optional_ref(const T&) -> optional_ref<const T>; |
114 | | |
115 | | template <typename T> |
116 | | optional_ref(T&) -> optional_ref<T>; |
117 | | |
118 | | template <typename T> |
119 | | optional_ref(const absl::optional<T>&) -> optional_ref<const T>; |
120 | | |
121 | | template <typename T> |
122 | | optional_ref(absl::optional<T>&) -> optional_ref<T>; |
123 | | |
124 | | template <typename T> |
125 | | constexpr bool operator==(const optional_ref<T>& lhs, absl::nullopt_t) { |
126 | | return !lhs.has_value(); |
127 | | } |
128 | | |
129 | | template <typename T> |
130 | | constexpr bool operator==(absl::nullopt_t, const optional_ref<T>& rhs) { |
131 | | return !rhs.has_value(); |
132 | | } |
133 | | |
134 | | template <typename T> |
135 | | constexpr bool operator!=(const optional_ref<T>& lhs, absl::nullopt_t) { |
136 | | return !operator==(lhs, absl::nullopt); |
137 | | } |
138 | | |
139 | | template <typename T> |
140 | | constexpr bool operator!=(absl::nullopt_t, const optional_ref<T>& rhs) { |
141 | | return !operator==(absl::nullopt, rhs); |
142 | | } |
143 | | |
144 | | namespace common_internal { |
145 | | |
146 | | template <typename T> |
147 | 0 | absl::optional<std::decay_t<T>> AsOptional(optional_ref<T> ref) { |
148 | 0 | if (ref) { |
149 | 0 | return *ref; |
150 | 0 | } |
151 | 0 | return absl::nullopt; |
152 | 0 | } Unexecuted instantiation: std::__1::optional<__decay, cel::CustomListValue const> cel::common_internal::AsOptional<cel::CustomListValue const>(cel::optional_ref<__decay>) Unexecuted instantiation: std::__1::optional<__decay, cel::CustomMapValue const> cel::common_internal::AsOptional<cel::CustomMapValue const>(cel::optional_ref<__decay>) Unexecuted instantiation: std::__1::optional<__decay, cel::ParsedMessageValue const> cel::common_internal::AsOptional<cel::ParsedMessageValue const>(cel::optional_ref<__decay>) Unexecuted instantiation: std::__1::optional<__decay, cel::OptionalValue const> cel::common_internal::AsOptional<cel::OptionalValue const>(cel::optional_ref<__decay>) Unexecuted instantiation: std::__1::optional<__decay, cel::BytesValue const> cel::common_internal::AsOptional<cel::BytesValue const>(cel::optional_ref<__decay>) Unexecuted instantiation: std::__1::optional<__decay, cel::ErrorValue const> cel::common_internal::AsOptional<cel::ErrorValue const>(cel::optional_ref<__decay>) Unexecuted instantiation: std::__1::optional<__decay, cel::OpaqueValue const> cel::common_internal::AsOptional<cel::OpaqueValue const>(cel::optional_ref<__decay>) Unexecuted instantiation: std::__1::optional<__decay, cel::ParsedJsonListValue const> cel::common_internal::AsOptional<cel::ParsedJsonListValue const>(cel::optional_ref<__decay>) Unexecuted instantiation: std::__1::optional<__decay, cel::ParsedJsonMapValue const> cel::common_internal::AsOptional<cel::ParsedJsonMapValue const>(cel::optional_ref<__decay>) Unexecuted instantiation: std::__1::optional<__decay, cel::ParsedMapFieldValue const> cel::common_internal::AsOptional<cel::ParsedMapFieldValue const>(cel::optional_ref<__decay>) Unexecuted instantiation: std::__1::optional<__decay, cel::ParsedRepeatedFieldValue const> cel::common_internal::AsOptional<cel::ParsedRepeatedFieldValue const>(cel::optional_ref<__decay>) Unexecuted instantiation: std::__1::optional<__decay, cel::CustomStructValue const> cel::common_internal::AsOptional<cel::CustomStructValue const>(cel::optional_ref<__decay>) Unexecuted instantiation: std::__1::optional<__decay, cel::StringValue const> cel::common_internal::AsOptional<cel::StringValue const>(cel::optional_ref<__decay>) Unexecuted instantiation: std::__1::optional<__decay, cel::TypeValue const> cel::common_internal::AsOptional<cel::TypeValue const>(cel::optional_ref<__decay>) Unexecuted instantiation: std::__1::optional<__decay, cel::UnknownValue const> cel::common_internal::AsOptional<cel::UnknownValue const>(cel::optional_ref<__decay>) |
153 | | |
154 | | template <typename T> |
155 | 0 | absl::optional<T> AsOptional(absl::optional<T> opt) { |
156 | 0 | return opt; |
157 | 0 | } Unexecuted instantiation: std::__1::optional<cel::ListValue> cel::common_internal::AsOptional<cel::ListValue>(std::__1::optional<cel::ListValue>) Unexecuted instantiation: std::__1::optional<cel::MapValue> cel::common_internal::AsOptional<cel::MapValue>(std::__1::optional<cel::MapValue>) Unexecuted instantiation: std::__1::optional<cel::MessageValue> cel::common_internal::AsOptional<cel::MessageValue>(std::__1::optional<cel::MessageValue>) Unexecuted instantiation: std::__1::optional<cel::StructValue> cel::common_internal::AsOptional<cel::StructValue>(std::__1::optional<cel::StructValue>) |
158 | | |
159 | | } // namespace common_internal |
160 | | |
161 | | } // namespace cel |
162 | | |
163 | | #endif // THIRD_PARTY_CEL_CPP_OPTIONAL_REF_H_ |