@@ -122,244 +122,237 @@ absl::Status OptionalValueEqual(
122122 return absl::OkStatus ();
123123}
124124
125+ google::protobuf::Arena* absl_nullable OptionalValueGetArenaNull (
126+ const OpaqueValueDispatcher* absl_nonnull, OpaqueValueContent) {
127+ return nullptr ;
128+ }
129+
130+ OpaqueValue OptionalValueClone (
131+ const OpaqueValueDispatcher* absl_nonnull dispatcher,
132+ OpaqueValueContent content, google::protobuf::Arena* absl_nonnull arena) {
133+ return common_internal::MakeOptionalValue (dispatcher, content);
134+ }
135+
136+ bool OptionalValueHasNoValue (const OptionalValueDispatcher* absl_nonnull,
137+ CustomValueContent content) {
138+ return false ;
139+ }
140+
141+ void EmptyOptionalValueValue (const OptionalValueDispatcher* absl_nonnull,
142+ CustomValueContent content,
143+ cel::Value* absl_nonnull result) {
144+ *result =
145+ ErrorValue (absl::FailedPreconditionError (" optional.none() dereference" ));
146+ }
147+
148+ void NullOptionalValueValue (const OptionalValueDispatcher* absl_nonnull,
149+ CustomValueContent content,
150+ cel::Value* absl_nonnull result) {
151+ *result = NullValue ();
152+ }
153+
154+ void BoolOptionalValueValue (const OptionalValueDispatcher* absl_nonnull,
155+ CustomValueContent content,
156+ cel::Value* absl_nonnull result) {
157+ *result = BoolValue (content.To <bool >());
158+ }
159+
160+ void IntOptionalValueValue (const OptionalValueDispatcher* absl_nonnull,
161+ CustomValueContent content,
162+ cel::Value* absl_nonnull result) {
163+ *result = IntValue (content.To <int64_t >());
164+ }
165+
166+ void UintOptionalValueValue (const OptionalValueDispatcher* absl_nonnull,
167+ CustomValueContent content,
168+ cel::Value* absl_nonnull result) {
169+ *result = UintValue (content.To <uint64_t >());
170+ }
171+
172+ void DoubleOptionalValueValue (const OptionalValueDispatcher* absl_nonnull,
173+ CustomValueContent content,
174+ cel::Value* absl_nonnull result) {
175+ *result = DoubleValue (content.To <double >());
176+ }
177+
178+ void DurationOptionalValueValue (const OptionalValueDispatcher* absl_nonnull,
179+ CustomValueContent content,
180+ cel::Value* absl_nonnull result) {
181+ *result = UnsafeDurationValue (content.To <absl::Duration>());
182+ }
183+
184+ void TimestampOptionalValueValue (const OptionalValueDispatcher* absl_nonnull,
185+ CustomValueContent content,
186+ cel::Value* absl_nonnull result) {
187+ *result = UnsafeTimestampValue (content.To <absl::Time>());
188+ }
189+
125190ABSL_CONST_INIT const OptionalValueDispatcher
126191 empty_optional_value_dispatcher = {
127192 {
128193 .get_type_id = &OptionalValueGetTypeId,
129- .get_arena = [](const OpaqueValueDispatcher* absl_nonnull,
130- OpaqueValueContent)
131- -> google::protobuf::Arena* absl_nullable { return nullptr ; },
194+ .get_arena = &OptionalValueGetArenaNull,
132195 .get_type_name = &OptionalValueGetTypeName,
133196 .debug_string = &OptionalValueDebugString,
134197 .get_runtime_type = &OptionalValueGetRuntimeType,
135198 .equal = &OptionalValueEqual,
136- .clone = [](const OpaqueValueDispatcher* absl_nonnull dispatcher,
137- OpaqueValueContent content,
138- google::protobuf::Arena* absl_nonnull arena) -> OpaqueValue {
139- return common_internal::MakeOptionalValue (dispatcher, content);
140- },
141- },
142- [](const OptionalValueDispatcher* absl_nonnull dispatcher,
143- CustomValueContent content) -> bool { return false ; },
144- [](const OptionalValueDispatcher* absl_nonnull dispatcher,
145- CustomValueContent content,
146- cel::Value* absl_nonnull result) -> void {
147- *result = ErrorValue (
148- absl::FailedPreconditionError (" optional.none() dereference" ));
199+ .clone = &OptionalValueClone,
149200 },
201+ &OptionalValueHasNoValue,
202+ &EmptyOptionalValueValue,
150203};
151204
152205ABSL_CONST_INIT const OptionalValueDispatcher null_optional_value_dispatcher = {
153206 {
154207 .get_type_id = &OptionalValueGetTypeId,
155- .get_arena = [](const OpaqueValueDispatcher* absl_nonnull,
156- OpaqueValueContent) -> google::protobuf::Arena* absl_nullable {
157- return nullptr ;
158- },
208+ .get_arena = &OptionalValueGetArenaNull,
159209 .get_type_name = &OptionalValueGetTypeName,
160210 .debug_string = &OptionalValueDebugString,
161211 .get_runtime_type = &OptionalValueGetRuntimeType,
162212 .equal = &OptionalValueEqual,
163- .clone = [](const OpaqueValueDispatcher* absl_nonnull dispatcher,
164- OpaqueValueContent content,
165- google::protobuf::Arena* absl_nonnull arena) -> OpaqueValue {
166- return common_internal::MakeOptionalValue (dispatcher, content);
167- },
213+ .clone = &OptionalValueClone,
168214 },
169215 &OptionalValueHasValue,
170- [](const OptionalValueDispatcher* absl_nonnull, CustomValueContent,
171- cel::Value* absl_nonnull result) -> void { *result = NullValue (); },
216+ &NullOptionalValueValue,
172217};
173218
174219ABSL_CONST_INIT const OptionalValueDispatcher bool_optional_value_dispatcher = {
175220 {
176221 .get_type_id = &OptionalValueGetTypeId,
177- .get_arena = [](const OpaqueValueDispatcher* absl_nonnull,
178- OpaqueValueContent) -> google::protobuf::Arena* absl_nullable {
179- return nullptr ;
180- },
222+ .get_arena = &OptionalValueGetArenaNull,
181223 .get_type_name = &OptionalValueGetTypeName,
182224 .debug_string = &OptionalValueDebugString,
183225 .get_runtime_type = &OptionalValueGetRuntimeType,
184226 .equal = &OptionalValueEqual,
185- .clone = [](const OpaqueValueDispatcher* absl_nonnull dispatcher,
186- OpaqueValueContent content,
187- google::protobuf::Arena* absl_nonnull arena) -> OpaqueValue {
188- return common_internal::MakeOptionalValue (dispatcher, content);
189- },
227+ .clone = &OptionalValueClone,
190228 },
191229 &OptionalValueHasValue,
192- [](const OptionalValueDispatcher* absl_nonnull, CustomValueContent content,
193- cel::Value* absl_nonnull result) -> void {
194- *result = BoolValue (content.To <bool >());
195- },
230+ &BoolOptionalValueValue,
196231};
197232
198233ABSL_CONST_INIT const OptionalValueDispatcher int_optional_value_dispatcher = {
199234 {
200235 .get_type_id = &OptionalValueGetTypeId,
201- .get_arena = [](const OpaqueValueDispatcher* absl_nonnull,
202- OpaqueValueContent) -> google::protobuf::Arena* absl_nullable {
203- return nullptr ;
204- },
236+ .get_arena = &OptionalValueGetArenaNull,
205237 .get_type_name = &OptionalValueGetTypeName,
206238 .debug_string = &OptionalValueDebugString,
207239 .get_runtime_type = &OptionalValueGetRuntimeType,
208240 .equal = &OptionalValueEqual,
209- .clone = [](const OpaqueValueDispatcher* absl_nonnull dispatcher,
210- OpaqueValueContent content,
211- google::protobuf::Arena* absl_nonnull arena) -> OpaqueValue {
212- return common_internal::MakeOptionalValue (dispatcher, content);
213- },
241+ .clone = &OptionalValueClone,
214242 },
215243 &OptionalValueHasValue,
216- [](const OptionalValueDispatcher* absl_nonnull, CustomValueContent content,
217- cel::Value* absl_nonnull result) -> void {
218- *result = IntValue (content.To <int64_t >());
219- },
244+ &IntOptionalValueValue,
220245};
221246
222247ABSL_CONST_INIT const OptionalValueDispatcher uint_optional_value_dispatcher = {
223248 {
224249 .get_type_id = &OptionalValueGetTypeId,
225- .get_arena = [](const OpaqueValueDispatcher* absl_nonnull,
226- OpaqueValueContent) -> google::protobuf::Arena* absl_nullable {
227- return nullptr ;
228- },
250+ .get_arena = &OptionalValueGetArenaNull,
229251 .get_type_name = &OptionalValueGetTypeName,
230252 .debug_string = &OptionalValueDebugString,
231253 .get_runtime_type = &OptionalValueGetRuntimeType,
232254 .equal = &OptionalValueEqual,
233- .clone = [](const OpaqueValueDispatcher* absl_nonnull dispatcher,
234- OpaqueValueContent content,
235- google::protobuf::Arena* absl_nonnull arena) -> OpaqueValue {
236- return common_internal::MakeOptionalValue (dispatcher, content);
237- },
255+ .clone = &OptionalValueClone,
238256 },
239257 &OptionalValueHasValue,
240- [](const OptionalValueDispatcher* absl_nonnull, CustomValueContent content,
241- cel::Value* absl_nonnull result) -> void {
242- *result = UintValue (content.To <uint64_t >());
243- },
258+ &UintOptionalValueValue,
244259};
245260
246261ABSL_CONST_INIT const OptionalValueDispatcher
247262 double_optional_value_dispatcher = {
248263 {
249264 .get_type_id = &OptionalValueGetTypeId,
250- .get_arena = [](const OpaqueValueDispatcher* absl_nonnull,
251- OpaqueValueContent)
252- -> google::protobuf::Arena* absl_nullable { return nullptr ; },
265+ .get_arena = &OptionalValueGetArenaNull,
253266 .get_type_name = &OptionalValueGetTypeName,
254267 .debug_string = &OptionalValueDebugString,
255268 .get_runtime_type = &OptionalValueGetRuntimeType,
256269 .equal = &OptionalValueEqual,
257- .clone = [](const OpaqueValueDispatcher* absl_nonnull dispatcher,
258- OpaqueValueContent content,
259- google::protobuf::Arena* absl_nonnull arena) -> OpaqueValue {
260- return common_internal::MakeOptionalValue (dispatcher, content);
261- },
270+ .clone = &OptionalValueClone,
262271 },
263272 &OptionalValueHasValue,
264- [](const OptionalValueDispatcher* absl_nonnull,
265- CustomValueContent content,
266- cel::Value* absl_nonnull result) -> void {
267- *result = DoubleValue (content.To <double >());
268- },
273+ &DoubleOptionalValueValue,
269274};
270275
271276ABSL_CONST_INIT const OptionalValueDispatcher
272277 duration_optional_value_dispatcher = {
273278 {
274279 .get_type_id = &OptionalValueGetTypeId,
275- .get_arena = [](const OpaqueValueDispatcher* absl_nonnull,
276- OpaqueValueContent)
277- -> google::protobuf::Arena* absl_nullable { return nullptr ; },
280+ .get_arena = &OptionalValueGetArenaNull,
278281 .get_type_name = &OptionalValueGetTypeName,
279282 .debug_string = &OptionalValueDebugString,
280283 .get_runtime_type = &OptionalValueGetRuntimeType,
281284 .equal = &OptionalValueEqual,
282- .clone = [](const OpaqueValueDispatcher* absl_nonnull dispatcher,
283- OpaqueValueContent content,
284- google::protobuf::Arena* absl_nonnull arena) -> OpaqueValue {
285- return common_internal::MakeOptionalValue (dispatcher, content);
286- },
285+ .clone = &OptionalValueClone,
287286 },
288287 &OptionalValueHasValue,
289- [](const OptionalValueDispatcher* absl_nonnull,
290- CustomValueContent content,
291- cel::Value* absl_nonnull result) -> void {
292- *result = UnsafeDurationValue (content.To <absl::Duration>());
293- },
288+ &DurationOptionalValueValue,
294289};
295290
296291ABSL_CONST_INIT const OptionalValueDispatcher
297292 timestamp_optional_value_dispatcher = {
298293 {
299294 .get_type_id = &OptionalValueGetTypeId,
300- .get_arena = [](const OpaqueValueDispatcher* absl_nonnull,
301- OpaqueValueContent)
302- -> google::protobuf::Arena* absl_nullable { return nullptr ; },
295+ .get_arena = &OptionalValueGetArenaNull,
303296 .get_type_name = &OptionalValueGetTypeName,
304297 .debug_string = &OptionalValueDebugString,
305298 .get_runtime_type = &OptionalValueGetRuntimeType,
306299 .equal = &OptionalValueEqual,
307- .clone = [](const OpaqueValueDispatcher* absl_nonnull dispatcher,
308- OpaqueValueContent content,
309- google::protobuf::Arena* absl_nonnull arena) -> OpaqueValue {
310- return common_internal::MakeOptionalValue (dispatcher, content);
311- },
300+ .clone = &OptionalValueClone,
312301 },
313302 &OptionalValueHasValue,
314- [](const OptionalValueDispatcher* absl_nonnull,
315- CustomValueContent content,
316- cel::Value* absl_nonnull result) -> void {
317- *result = UnsafeTimestampValue (content.To <absl::Time>());
318- },
303+ &TimestampOptionalValueValue,
319304};
320305
321306struct OptionalValueContent {
322307 const Value* absl_nonnull value;
323308 google::protobuf::Arena* absl_nonnull arena;
324309};
325310
311+ google::protobuf::Arena* absl_nullable GenericOptionalValueGetArena (
312+ const OpaqueValueDispatcher* absl_nonnull, OpaqueValueContent content) {
313+ return content.To <OptionalValueContent>().arena ;
314+ }
315+
316+ OpaqueValue GenericOptionalValueClone (
317+ const OpaqueValueDispatcher* absl_nonnull dispatcher,
318+ OpaqueValueContent content, google::protobuf::Arena* absl_nonnull arena);
319+
320+ void GenericOptionalValueValue (const OptionalValueDispatcher* absl_nonnull,
321+ CustomValueContent content,
322+ cel::Value* absl_nonnull result) {
323+ *result = *content.To <OptionalValueContent>().value ;
324+ }
325+
326326ABSL_CONST_INIT const OptionalValueDispatcher optional_value_dispatcher = {
327327 {
328328 .get_type_id = &OptionalValueGetTypeId,
329- .get_arena =
330- [](const OpaqueValueDispatcher* absl_nonnull,
331- OpaqueValueContent content) -> google::protobuf::Arena* absl_nullable {
332- return content.To <OptionalValueContent>().arena ;
333- },
329+ .get_arena = &GenericOptionalValueGetArena,
334330 .get_type_name = &OptionalValueGetTypeName,
335331 .debug_string = &OptionalValueDebugString,
336332 .get_runtime_type = &OptionalValueGetRuntimeType,
337333 .equal = &OptionalValueEqual,
338- .clone = [](const OpaqueValueDispatcher* absl_nonnull dispatcher,
339- OpaqueValueContent content,
340- google::protobuf::Arena* absl_nonnull arena) -> OpaqueValue {
341- ABSL_DCHECK (arena != nullptr );
342-
343- cel::Value* absl_nonnull result = ::new (
344- arena->AllocateAligned (sizeof (cel::Value), alignof (cel::Value)))
345- cel::Value (
346- content.To <OptionalValueContent>().value ->Clone (arena));
347- if (!ArenaTraits<>::trivially_destructible (result)) {
348- arena->OwnDestructor (result);
349- }
350- return common_internal::MakeOptionalValue (
351- &optional_value_dispatcher,
352- OpaqueValueContent::From (
353- OptionalValueContent{.value = result, .arena = arena}));
354- },
334+ .clone = &GenericOptionalValueClone,
355335 },
356336 &OptionalValueHasValue,
357- [](const OptionalValueDispatcher* absl_nonnull, CustomValueContent content,
358- cel::Value* absl_nonnull result) -> void {
359- *result = *content.To <OptionalValueContent>().value ;
360- },
337+ &GenericOptionalValueValue,
361338};
362339
340+ OpaqueValue GenericOptionalValueClone (
341+ const OpaqueValueDispatcher* absl_nonnull dispatcher,
342+ OpaqueValueContent content, google::protobuf::Arena* absl_nonnull arena) {
343+ ABSL_DCHECK (arena != nullptr );
344+
345+ cel::Value* absl_nonnull result =
346+ ::new (arena->AllocateAligned (sizeof (cel::Value), alignof (cel::Value)))
347+ cel::Value (content.To <OptionalValueContent>().value ->Clone (arena));
348+ if (!ArenaTraits<>::trivially_destructible (result)) {
349+ arena->OwnDestructor (result);
350+ }
351+ return common_internal::MakeOptionalValue (
352+ &optional_value_dispatcher, OpaqueValueContent::From (OptionalValueContent{
353+ .value = result, .arena = arena}));
354+ }
355+
363356} // namespace
364357
365358OptionalValue OptionalValue::Of (cel::Value value,
0 commit comments