1919#define THIRD_PARTY_CEL_CPP_COMMON_VALUES_CUSTOM_VALUE_INTERFACE_H_
2020
2121#include < string>
22+ #include < type_traits>
2223
2324#include " absl/base/nullability.h"
2425#include " absl/status/status.h"
2526#include " absl/strings/cord.h"
2627#include " absl/strings/string_view.h"
27- #include " common/internal/data_interface .h"
28+ #include " common/native_type .h"
2829#include " common/value_kind.h"
2930#include " google/protobuf/arena.h"
3031#include " google/protobuf/descriptor.h"
@@ -34,9 +35,15 @@ namespace cel {
3435
3536class Value ;
3637
37- class CustomValueInterface : public common_internal ::DataInterface {
38+ class CustomValueInterface {
3839 public:
39- using DataInterface::DataInterface;
40+ CustomValueInterface (const CustomValueInterface&) = delete ;
41+ CustomValueInterface (CustomValueInterface&&) = delete ;
42+
43+ virtual ~CustomValueInterface () = default ;
44+
45+ CustomValueInterface& operator =(const CustomValueInterface&) = delete ;
46+ CustomValueInterface& operator =(CustomValueInterface&&) = delete ;
4047
4148 virtual ValueKind kind () const = 0;
4249
@@ -74,6 +81,32 @@ class CustomValueInterface : public common_internal::DataInterface {
7481 absl::Nonnull<google::protobuf::MessageFactory*> message_factory,
7582 absl::Nonnull<google::protobuf::Arena*> arena,
7683 absl::Nonnull<Value*> result) const = 0;
84+
85+ protected:
86+ CustomValueInterface () = default ;
87+
88+ private:
89+ friend struct NativeTypeTraits <CustomValueInterface>;
90+
91+ virtual NativeTypeId GetNativeTypeId () const = 0;
92+ };
93+
94+ template <>
95+ struct NativeTypeTraits <CustomValueInterface> final {
96+ static NativeTypeId Id (const CustomValueInterface& custom_value_interface) {
97+ return custom_value_interface.GetNativeTypeId ();
98+ }
99+ };
100+
101+ template <typename T>
102+ struct NativeTypeTraits <
103+ T, std::enable_if_t <std::conjunction_v<
104+ std::is_base_of<CustomValueInterface, T>,
105+ std::negation<std::is_same<T, CustomValueInterface>>>>>
106+ final {
107+ static NativeTypeId Id (const CustomValueInterface& custom_value_interface) {
108+ return NativeTypeTraits<CustomValueInterface>::Id (custom_value_interface);
109+ }
77110};
78111
79112} // namespace cel
0 commit comments