Skip to content

Commit ddcece1

Browse files
jnthntatumcopybara-github
authored andcommitted
Refactor optional dispatch tables.
PiperOrigin-RevId: 911533283
1 parent 2f06d90 commit ddcece1

1 file changed

Lines changed: 124 additions & 131 deletions

File tree

common/values/optional_value.cc

Lines changed: 124 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
125190
ABSL_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

152205
ABSL_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

174219
ABSL_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

198233
ABSL_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

222247
ABSL_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

246261
ABSL_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

271276
ABSL_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

296291
ABSL_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

321306
struct 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+
326326
ABSL_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

365358
OptionalValue OptionalValue::Of(cel::Value value,

0 commit comments

Comments
 (0)