2121#include " absl/status/status.h"
2222#include " absl/status/statusor.h"
2323#include " absl/strings/cord.h"
24- #include " absl/strings/string_view.h"
2524#include " absl/types/optional.h"
26- #include " absl/types/variant .h"
25+ #include " common/native_type .h"
2726#include " common/optional_ref.h"
2827#include " common/value.h"
2928#include " common/values/value_variant.h"
3433
3534namespace cel {
3635
37- absl::string_view ListValue::GetTypeName () const {
38- return absl::visit (
39- [](const auto & alternative) -> absl::string_view {
40- return alternative.GetTypeName ();
41- },
42- variant_);
36+ NativeTypeId ListValue::GetTypeId () const {
37+ return variant_.Visit ([](const auto & alternative) -> NativeTypeId {
38+ return NativeTypeId::Of (alternative);
39+ });
4340}
4441
4542std::string ListValue::DebugString () const {
46- return absl::visit (
47- [](const auto & alternative) -> std::string {
48- return alternative.DebugString ();
49- },
50- variant_);
43+ return variant_.Visit ([](const auto & alternative) -> std::string {
44+ return alternative.DebugString ();
45+ });
5146}
5247
5348absl::Status ListValue::SerializeTo (
5449 absl::Nonnull<const google::protobuf::DescriptorPool*> descriptor_pool,
5550 absl::Nonnull<google::protobuf::MessageFactory*> message_factory,
5651 absl::Nonnull<absl::Cord*> value) const {
57- return absl::visit (
58- [descriptor_pool, message_factory,
59- value](const auto & alternative) -> absl::Status {
60- return alternative.SerializeTo (descriptor_pool, message_factory, value);
61- },
62- variant_);
52+ ABSL_DCHECK (descriptor_pool != nullptr );
53+ ABSL_DCHECK (message_factory != nullptr );
54+ ABSL_DCHECK (value != nullptr );
55+
56+ return variant_.Visit ([&](const auto & alternative) -> absl::Status {
57+ return alternative.SerializeTo (descriptor_pool, message_factory, value);
58+ });
6359}
6460
6561absl::Status ListValue::ConvertToJson (
6662 absl::Nonnull<const google::protobuf::DescriptorPool*> descriptor_pool,
6763 absl::Nonnull<google::protobuf::MessageFactory*> message_factory,
6864 absl::Nonnull<google::protobuf::Message*> json) const {
69- return absl::visit (
70- [descriptor_pool, message_factory,
71- json](const auto & alternative) -> absl::Status {
72- return alternative.ConvertToJson (descriptor_pool, message_factory,
73- json);
74- },
75- variant_);
65+ ABSL_DCHECK (descriptor_pool != nullptr );
66+ ABSL_DCHECK (message_factory != nullptr );
67+ ABSL_DCHECK (json != nullptr );
68+ ABSL_DCHECK_EQ (json->GetDescriptor ()->well_known_type (),
69+ google::protobuf::Descriptor::WELLKNOWNTYPE_VALUE);
70+
71+ return variant_.Visit ([&](const auto & alternative) -> absl::Status {
72+ return alternative.ConvertToJson (descriptor_pool, message_factory, json);
73+ });
7674}
7775
7876absl::Status ListValue::ConvertToJsonArray (
7977 absl::Nonnull<const google::protobuf::DescriptorPool*> descriptor_pool,
8078 absl::Nonnull<google::protobuf::MessageFactory*> message_factory,
8179 absl::Nonnull<google::protobuf::Message*> json) const {
82- return absl::visit (
83- [descriptor_pool, message_factory,
84- json](const auto & alternative) -> absl::Status {
85- return alternative.ConvertToJsonArray (descriptor_pool, message_factory,
86- json);
87- },
88- variant_);
80+ ABSL_DCHECK (descriptor_pool != nullptr );
81+ ABSL_DCHECK (message_factory != nullptr );
82+ ABSL_DCHECK (json != nullptr );
83+ ABSL_DCHECK_EQ (json->GetDescriptor ()->well_known_type (),
84+ google::protobuf::Descriptor::WELLKNOWNTYPE_LISTVALUE);
85+
86+ return variant_.Visit ([&](const auto & alternative) -> absl::Status {
87+ return alternative.ConvertToJsonArray (descriptor_pool, message_factory,
88+ json);
89+ });
8990}
9091
9192absl::Status ListValue::Equal (
@@ -98,78 +99,81 @@ absl::Status ListValue::Equal(
9899 ABSL_DCHECK (arena != nullptr );
99100 ABSL_DCHECK (result != nullptr );
100101
101- return absl::visit (
102- [&other, descriptor_pool, message_factory, arena,
103- result](const auto & alternative) -> absl::Status {
104- return alternative.Equal (other, descriptor_pool, message_factory, arena,
105- result);
106- },
107- variant_);
102+ return variant_.Visit ([&](const auto & alternative) -> absl::Status {
103+ return alternative.Equal (other, descriptor_pool, message_factory, arena,
104+ result);
105+ });
108106}
109107
110108bool ListValue::IsZeroValue () const {
111- return absl::visit (
112- []( const auto & alternative) -> bool { return alternative.IsZeroValue (); },
113- variant_ );
109+ return variant_. Visit ([]( const auto & alternative) -> bool {
110+ return alternative.IsZeroValue ();
111+ } );
114112}
115113
116114absl::StatusOr<bool > ListValue::IsEmpty () const {
117- return absl::visit (
118- []( const auto & alternative) -> bool { return alternative.IsEmpty (); },
119- variant_ );
115+ return variant_. Visit ([]( const auto & alternative) -> absl::StatusOr< bool > {
116+ return alternative.IsEmpty ();
117+ } );
120118}
121119
122120absl::StatusOr<size_t > ListValue::Size () const {
123- return absl::visit (
124- []( const auto & alternative) -> size_t { return alternative.Size (); },
125- variant_ );
121+ return variant_. Visit ([]( const auto & alternative) -> absl::StatusOr< size_t > {
122+ return alternative.Size ();
123+ } );
126124}
127125
128126absl::Status ListValue::Get (
129127 size_t index, absl::Nonnull<const google::protobuf::DescriptorPool*> descriptor_pool,
130128 absl::Nonnull<google::protobuf::MessageFactory*> message_factory,
131129 absl::Nonnull<google::protobuf::Arena*> arena, absl::Nonnull<Value*> result) const {
132- return absl::visit (
133- [&](const auto & alternative) -> absl::Status {
134- return alternative.Get (index, descriptor_pool, message_factory, arena,
135- result);
136- },
137- variant_);
130+ ABSL_DCHECK (descriptor_pool != nullptr );
131+ ABSL_DCHECK (message_factory != nullptr );
132+ ABSL_DCHECK (arena != nullptr );
133+ ABSL_DCHECK (result != nullptr );
134+
135+ return variant_.Visit ([&](const auto & alternative) -> absl::Status {
136+ return alternative.Get (index, descriptor_pool, message_factory, arena,
137+ result);
138+ });
138139}
139140
140141absl::Status ListValue::ForEach (
141142 ForEachWithIndexCallback callback,
142143 absl::Nonnull<const google::protobuf::DescriptorPool*> descriptor_pool,
143144 absl::Nonnull<google::protobuf::MessageFactory*> message_factory,
144145 absl::Nonnull<google::protobuf::Arena*> arena) const {
145- return absl::visit (
146- [&](const auto & alternative) -> absl::Status {
147- return alternative.ForEach (callback, descriptor_pool, message_factory,
148- arena);
149- },
150- variant_);
146+ ABSL_DCHECK (descriptor_pool != nullptr );
147+ ABSL_DCHECK (message_factory != nullptr );
148+ ABSL_DCHECK (arena != nullptr );
149+
150+ return variant_.Visit ([&](const auto & alternative) -> absl::Status {
151+ return alternative.ForEach (callback, descriptor_pool, message_factory,
152+ arena);
153+ });
151154}
152155
153156absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> ListValue::NewIterator () const {
154- return absl::visit (
155- [](const auto & alternative)
156- -> absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> {
157- return alternative.NewIterator ();
158- },
159- variant_);
157+ return variant_.Visit ([](const auto & alternative)
158+ -> absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> {
159+ return alternative.NewIterator ();
160+ });
160161}
161162
162163absl::Status ListValue::Contains (
163164 const Value& other,
164165 absl::Nonnull<const google::protobuf::DescriptorPool*> descriptor_pool,
165166 absl::Nonnull<google::protobuf::MessageFactory*> message_factory,
166167 absl::Nonnull<google::protobuf::Arena*> arena, absl::Nonnull<Value*> result) const {
167- return absl::visit (
168- [&](const auto & alternative) -> absl::Status {
169- return alternative.Contains (other, descriptor_pool, message_factory,
170- arena, result);
171- },
172- variant_);
168+ ABSL_DCHECK (descriptor_pool != nullptr );
169+ ABSL_DCHECK (message_factory != nullptr );
170+ ABSL_DCHECK (arena != nullptr );
171+ ABSL_DCHECK (result != nullptr );
172+
173+ return variant_.Visit ([&](const auto & alternative) -> absl::Status {
174+ return alternative.Contains (other, descriptor_pool, message_factory, arena,
175+ result);
176+ });
173177}
174178
175179namespace common_internal {
@@ -255,45 +259,46 @@ absl::Status ListValueEqual(
255259} // namespace common_internal
256260
257261optional_ref<const CustomListValue> ListValue::AsCustom () const & {
258- if (const auto * alt = absl::get_if <CustomListValue>(&variant_ );
259- alt != nullptr ) {
260- return *alt ;
262+ if (const auto * alternative = variant_. As <CustomListValue>();
263+ alternative != nullptr ) {
264+ return *alternative ;
261265 }
262266 return absl::nullopt ;
263267}
264268
265269absl::optional<CustomListValue> ListValue::AsCustom () && {
266- if (auto * alt = absl::get_if<CustomListValue>(&variant_); alt != nullptr ) {
267- return std::move (*alt);
270+ if (auto * alternative = variant_.As <CustomListValue>();
271+ alternative != nullptr ) {
272+ return std::move (*alternative);
268273 }
269274 return absl::nullopt ;
270275}
271276
272277const CustomListValue& ListValue::GetCustom () const & {
273278 ABSL_DCHECK (IsCustom ());
274- return absl::get<CustomListValue>(variant_);
279+
280+ return variant_.Get <CustomListValue>();
275281}
276282
277283CustomListValue ListValue::GetCustom () && {
278284 ABSL_DCHECK (IsCustom ());
279- return absl::get<CustomListValue>(std::move (variant_));
285+
286+ return std::move (variant_).Get <CustomListValue>();
280287}
281288
282289common_internal::ValueVariant ListValue::ToValueVariant () const & {
283- return absl::visit (
290+ return variant_. Visit (
284291 [](const auto & alternative) -> common_internal::ValueVariant {
285292 return common_internal::ValueVariant (alternative);
286- },
287- variant_);
293+ });
288294}
289295
290296common_internal::ValueVariant ListValue::ToValueVariant () && {
291- return absl::visit (
297+ return std::move (variant_). Visit (
292298 [](auto && alternative) -> common_internal::ValueVariant {
293299 // NOLINTNEXTLINE(bugprone-move-forwarding-reference)
294300 return common_internal::ValueVariant (std::move (alternative));
295- },
296- std::move (variant_));
301+ });
297302}
298303
299304} // namespace cel
0 commit comments