commit 940af9f2c87b436559b97c53763aa9eaaf1254eb Author: Jeremy Roman <jbroman@chromium.org> Date: Wed Nov 15 16:24:54 2023 +0000 Use C++20 features to simplify blink::NativeValueTraitsBase. These allow some of the metaprogramming bits to be simplified a little. Change-Id: I052b4397586d21348401616e1792afdb9662f975 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5030335 Reviewed-by: Yuki Shiino <yukishiino@chromium.org> Commit-Queue: Jeremy Roman <jbroman@chromium.org> Cr-Commit-Position: refs/heads/main@{#1224978} diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits.h index 7fc91d14acc71..1e5a0790df6da 100644 --- a/third_party/blink/renderer/bindings/core/v8/native_value_traits.h +++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits.h @@ -5,6 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_NATIVE_VALUE_TRAITS_H_ #define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_NATIVE_VALUE_TRAITS_H_ +#include <concepts> #include <type_traits> #include "third_party/blink/renderer/bindings/core/v8/idl_types_base.h" @@ -30,7 +31,7 @@ class ExceptionState; // return toInt32(isolate, value, exceptionState, NormalConversion); // } // } -template <typename T, typename SFINAEHelper = void> +template <typename T> struct NativeValueTraits; // This declaration serves only as a blueprint for specializations: the @@ -45,22 +46,15 @@ struct NativeValueTraits; namespace bindings { -template <typename T, typename = void> -struct NativeValueTraitsHasIsNull : std::false_type {}; - template <typename T> -struct NativeValueTraitsHasIsNull< - T, - std::void_t<decltype(std::declval<T>().IsNull())>> : std::true_type {}; +struct ImplTypeFor { + using type = T; +}; template <typename T> -struct NativeValueTraitsHasNullValue { - // true if |T| supports IDL null value. - static constexpr bool value = - // ScriptValue, String, and union types have IsNull member function. - bindings::NativeValueTraitsHasIsNull<T>::value || - // Pointer types have nullptr as IDL null value. - std::is_pointer<T>::value; + requires std::derived_from<T, IDLBase> +struct ImplTypeFor<T> { + using type = typename T::ImplType; }; } // namespace bindings @@ -78,37 +72,17 @@ struct NativeValueTraitsHasNullValue { // If present, |NullValue()| will be used when converting from the nullable type // T?, and should be used if the impl type has an existing "null" state. If not // present, WTF::Optional will be used to wrap the type. -template <typename T, typename SFINAEHelper = void> -struct NativeValueTraitsBase { - STATIC_ONLY(NativeValueTraitsBase); - - using ImplType = T; - - static constexpr bool has_null_value = - bindings::NativeValueTraitsHasNullValue<ImplType>::value; - - template <typename... ExtraArgs> - static decltype(auto) ArgumentValue(v8::Isolate* isolate, - int argument_index, - v8::Local<v8::Value> value, - ExceptionState& exception_state, - ExtraArgs... extra_args) { - return NativeValueTraits<std::remove_pointer_t<T>>::NativeValue( - isolate, value, exception_state, - std::forward<ExtraArgs>(extra_args)...); - } -}; - template <typename T> -struct NativeValueTraitsBase< - T, - std::enable_if_t<std::is_base_of<IDLBase, T>::value>> { +struct NativeValueTraitsBase { STATIC_ONLY(NativeValueTraitsBase); - using ImplType = typename T::ImplType; + using ImplType = bindings::ImplTypeFor<T>::type; + // Pointer types have nullptr as IDL null value. + // ScriptValue, String, and union types have IsNull member function. static constexpr bool has_null_value = - bindings::NativeValueTraitsHasNullValue<ImplType>::value; + std::is_pointer_v<ImplType> || + requires(ImplType value) { value.IsNull(); }; template <typename... ExtraArgs> static decltype(auto) ArgumentValue(v8::Isolate* isolate, diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits_buffer_sources.cc b/third_party/blink/renderer/bindings/core/v8/native_value_traits_buffer_sources.cc index 508ea6d8eea48..18de71d84023f 100644 --- a/third_party/blink/renderer/bindings/core/v8/native_value_traits_buffer_sources.cc +++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits_buffer_sources.cc @@ -7,6 +7,7 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/web_feature.h" +#include "third_party/blink/renderer/core/typed_arrays/flexible_array_buffer_view.h" #include "third_party/blink/renderer/core/typed_arrays/typed_flexible_array_buffer_view.h" namespace blink { @@ -698,12 +699,11 @@ DOMArrayBufferBase* NativeValueTraits< // ArrayBufferView template <typename T> -NotShared<T> NativeValueTraits< - NotShared<T>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>:: - NativeValue(v8::Isolate* isolate, - v8::Local<v8::Value> value, - ExceptionState& exception_state) { + requires std::derived_from<T, DOMArrayBufferView> +NotShared<T> NativeValueTraits<NotShared<T>>::NativeValue( + v8::Isolate* isolate, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { return NativeValueImpl< RecipeTrait<NotShared<T>>, ToDOMViewType<T, kNotShared>, Nullablity::kIsNotNullable, BufferSizeCheck::kCheck, @@ -712,13 +712,12 @@ NotShared<T> NativeValueTraits< } template <typename T> -NotShared<T> NativeValueTraits< - NotShared<T>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>:: - ArgumentValue(v8::Isolate* isolate, - int argument_index, - v8::Local<v8::Value> value, - ExceptionState& exception_state) { + requires std::derived_from<T, DOMArrayBufferView> +NotShared<T> NativeValueTraits<NotShared<T>>::ArgumentValue( + v8::Isolate* isolate, + int argument_index, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { return ArgumentValueImpl< RecipeTrait<NotShared<T>>, ToDOMViewType<T, kNotShared>, Nullablity::kIsNotNullable, BufferSizeCheck::kCheck, @@ -729,12 +728,11 @@ NotShared<T> NativeValueTraits< // [AllowShared] ArrayBufferView template <typename T> -MaybeShared<T> NativeValueTraits< - MaybeShared<T>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>:: - NativeValue(v8::Isolate* isolate, - v8::Local<v8::Value> value, - ExceptionState& exception_state) { + requires std::derived_from<T, DOMArrayBufferView> +MaybeShared<T> NativeValueTraits<MaybeShared<T>>::NativeValue( + v8::Isolate* isolate, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { return NativeValueImpl<RecipeTrait<MaybeShared<T>>, ToDOMViewType<T, kMaybeShared>, Nullablity::kIsNotNullable, BufferSizeCheck::kCheck, @@ -743,13 +741,12 @@ MaybeShared<T> NativeValueTraits< } template <typename T> -MaybeShared<T> NativeValueTraits< - MaybeShared<T>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>:: - ArgumentValue(v8::Isolate* isolate, - int argument_index, - v8::Local<v8::Value> value, - ExceptionState& exception_state) { + requires std::derived_from<T, DOMArrayBufferView> +MaybeShared<T> NativeValueTraits<MaybeShared<T>>::ArgumentValue( + v8::Isolate* isolate, + int argument_index, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { return ArgumentValueImpl<RecipeTrait<MaybeShared<T>>, ToDOMViewType<T, kMaybeShared>, Nullablity::kIsNotNullable, BufferSizeCheck::kCheck, @@ -760,12 +757,12 @@ MaybeShared<T> NativeValueTraits< // [AllowShared, BufferSourceTypeNoSizeLimit] ArrayBufferView template <typename T> -MaybeShared<T> NativeValueTraits< - IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>:: - NativeValue(v8::Isolate* isolate, - v8::Local<v8::Value> value, - ExceptionState& exception_state) { + requires std::derived_from<T, DOMArrayBufferView> +MaybeShared<T> +NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>::NativeValue( + v8::Isolate* isolate, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { return NativeValueImpl< RecipeTrait<MaybeShared<T>>, ToDOMViewType<T, kMaybeShared>, Nullablity::kIsNotNullable, BufferSizeCheck::kDoNotCheck, @@ -774,13 +771,12 @@ MaybeShared<T> NativeValueTraits< } template <typename T> -MaybeShared<T> NativeValueTraits< - IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>:: - ArgumentValue(v8::Isolate* isolate, - int argument_index, - v8::Local<v8::Value> value, - ExceptionState& exception_state) { + requires std::derived_from<T, DOMArrayBufferView> +MaybeShared<T> NativeValueTraits<IDLBufferSourceTypeNoSizeLimit< + MaybeShared<T>>>::ArgumentValue(v8::Isolate* isolate, + int argument_index, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { return ArgumentValueImpl< RecipeTrait<MaybeShared<T>>, ToDOMViewType<T, kMaybeShared>, Nullablity::kIsNotNullable, BufferSizeCheck::kDoNotCheck, @@ -791,12 +787,11 @@ MaybeShared<T> NativeValueTraits< // Nullable ArrayBufferView template <typename T> -NotShared<T> NativeValueTraits< - IDLNullable<NotShared<T>>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>:: - NativeValue(v8::Isolate* isolate, - v8::Local<v8::Value> value, - ExceptionState& exception_state) { + requires std::derived_from<T, DOMArrayBufferView> +NotShared<T> NativeValueTraits<IDLNullable<NotShared<T>>>::NativeValue( + v8::Isolate* isolate, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { return NativeValueImpl< RecipeTrait<NotShared<T>>, ToDOMViewType<T, kNotShared>, Nullablity::kIsNullable, BufferSizeCheck::kCheck, @@ -805,13 +800,12 @@ NotShared<T> NativeValueTraits< } template <typename T> -NotShared<T> NativeValueTraits< - IDLNullable<NotShared<T>>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>:: - ArgumentValue(v8::Isolate* isolate, - int argument_index, - v8::Local<v8::Value> value, - ExceptionState& exception_state) { + requires std::derived_from<T, DOMArrayBufferView> +NotShared<T> NativeValueTraits<IDLNullable<NotShared<T>>>::ArgumentValue( + v8::Isolate* isolate, + int argument_index, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { return ArgumentValueImpl< RecipeTrait<NotShared<T>>, ToDOMViewType<T, kNotShared>, Nullablity::kIsNullable, BufferSizeCheck::kCheck, @@ -822,12 +816,11 @@ NotShared<T> NativeValueTraits< // Nullable [AllowShared] ArrayBufferView template <typename T> -MaybeShared<T> NativeValueTraits< - IDLNullable<MaybeShared<T>>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>:: - NativeValue(v8::Isolate* isolate, - v8::Local<v8::Value> value, - ExceptionState& exception_state) { + requires std::derived_from<T, DOMArrayBufferView> +MaybeShared<T> NativeValueTraits<IDLNullable<MaybeShared<T>>>::NativeValue( + v8::Isolate* isolate, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { return NativeValueImpl<RecipeTrait<MaybeShared<T>>, ToDOMViewType<T, kMaybeShared>, Nullablity::kIsNullable, BufferSizeCheck::kCheck, @@ -836,13 +829,12 @@ MaybeShared<T> NativeValueTraits< } template <typename T> -MaybeShared<T> NativeValueTraits< - IDLNullable<MaybeShared<T>>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>:: - ArgumentValue(v8::Isolate* isolate, - int argument_index, - v8::Local<v8::Value> value, - ExceptionState& exception_state) { + requires std::derived_from<T, DOMArrayBufferView> +MaybeShared<T> NativeValueTraits<IDLNullable<MaybeShared<T>>>::ArgumentValue( + v8::Isolate* isolate, + int argument_index, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { return ArgumentValueImpl<RecipeTrait<MaybeShared<T>>, ToDOMViewType<T, kMaybeShared>, Nullablity::kIsNullable, BufferSizeCheck::kCheck, @@ -853,9 +845,9 @@ MaybeShared<T> NativeValueTraits< // Nullable [AllowShared, BufferSourceTypeNoSizeLimit] ArrayBufferView template <typename T> -MaybeShared<T> NativeValueTraits< - IDLNullable<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>>:: + requires std::derived_from<T, DOMArrayBufferView> +MaybeShared<T> +NativeValueTraits<IDLNullable<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>>:: ArgumentValue(v8::Isolate* isolate, int argument_index, v8::Local<v8::Value> value, @@ -870,13 +862,11 @@ MaybeShared<T> NativeValueTraits< // [AllowShared, FlexibleArrayBufferView] ArrayBufferView template <typename T> -T NativeValueTraits<T, - typename std::enable_if_t< - std::is_base_of<FlexibleArrayBufferView, T>::value>>:: - ArgumentValue(v8::Isolate* isolate, - int argument_index, - v8::Local<v8::Value> value, - ExceptionState& exception_state) { + requires std::derived_from<T, FlexibleArrayBufferView> +T NativeValueTraits<T>::ArgumentValue(v8::Isolate* isolate, + int argument_index, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { return ArgumentValueImpl<RecipeTrait<T>, ToFlexibleArrayBufferView, Nullablity::kIsNotNullable, BufferSizeCheck::kCheck, ResizableAllowance::kDisallowResizable, @@ -888,13 +878,12 @@ T NativeValueTraits<T, // ArrayBufferView template <typename T> -T NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<T>, - typename std::enable_if_t< - std::is_base_of<FlexibleArrayBufferView, T>::value>>:: - ArgumentValue(v8::Isolate* isolate, - int argument_index, - v8::Local<v8::Value> value, - ExceptionState& exception_state) { + requires std::derived_from<T, FlexibleArrayBufferView> +T NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<T>>::ArgumentValue( + v8::Isolate* isolate, + int argument_index, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { return ArgumentValueImpl< RecipeTrait<T>, ToFlexibleArrayBufferView, Nullablity::kIsNotNullable, BufferSizeCheck::kDoNotCheck, ResizableAllowance::kDisallowResizable, @@ -905,13 +894,12 @@ T NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<T>, // Nullable [AllowShared, FlexibleArrayBufferView] ArrayBufferView template <typename T> -T NativeValueTraits<IDLNullable<T>, - typename std::enable_if_t< - std::is_base_of<FlexibleArrayBufferView, T>::value>>:: - ArgumentValue(v8::Isolate* isolate, - int argument_index, - v8::Local<v8::Value> value, - ExceptionState& exception_state) { + requires std::derived_from<T, FlexibleArrayBufferView> +T NativeValueTraits<IDLNullable<T>>::ArgumentValue( + v8::Isolate* isolate, + int argument_index, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { return ArgumentValueImpl<RecipeTrait<T>, ToFlexibleArrayBufferView, Nullablity::kIsNullable, BufferSizeCheck::kCheck, ResizableAllowance::kDisallowResizable, diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h index 899929dcf49f9..5011503dcf1c0 100644 --- a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h +++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h @@ -5,6 +5,9 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_NATIVE_VALUE_TRAITS_IMPL_H_ #define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_NATIVE_VALUE_TRAITS_IMPL_H_ +#include <concepts> +#include <type_traits> + #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/renderer/bindings/core/v8/idl_types.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits.h" @@ -715,9 +718,8 @@ struct CORE_EXPORT NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - T, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>> { + requires std::derived_from<T, DOMArrayBufferView> +struct NativeValueTraits<T> { // NotShared<T> or MaybeShared<T> should be used instead. static T* NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, @@ -729,9 +731,8 @@ struct NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - IDLNullable<T>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>> { + requires std::derived_from<T, DOMArrayBufferView> +struct NativeValueTraits<IDLNullable<T>> { // NotShared<T> or MaybeShared<T> should be used instead. static T* NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, @@ -743,9 +744,8 @@ struct NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - NotShared<T>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>> + requires std::derived_from<T, DOMArrayBufferView> +struct NativeValueTraits<NotShared<T>> : public NativeValueTraitsBase<NotShared<T>> { static NotShared<T> NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, @@ -758,9 +758,8 @@ struct NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - IDLNullable<NotShared<T>>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>> + requires std::derived_from<T, DOMArrayBufferView> +struct NativeValueTraits<IDLNullable<NotShared<T>>> : public NativeValueTraitsBase<NotShared<T>> { static NotShared<T> NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, @@ -773,9 +772,8 @@ struct NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - MaybeShared<T>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>> + requires std::derived_from<T, DOMArrayBufferView> +struct NativeValueTraits<MaybeShared<T>> : public NativeValueTraitsBase<MaybeShared<T>> { static MaybeShared<T> NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, @@ -788,9 +786,8 @@ struct NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>> + requires std::derived_from<T, DOMArrayBufferView> +struct NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>> : public NativeValueTraitsBase<MaybeShared<T>> { // FlexibleArrayBufferView uses this in its implementation, so we cannot // delete it. @@ -805,9 +802,8 @@ struct NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - IDLNullable<MaybeShared<T>>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>> + requires std::derived_from<T, DOMArrayBufferView> +struct NativeValueTraits<IDLNullable<MaybeShared<T>>> : public NativeValueTraitsBase<MaybeShared<T>> { static MaybeShared<T> NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, @@ -820,9 +816,9 @@ struct NativeValueTraits< }; template <typename T> + requires std::derived_from<T, DOMArrayBufferView> struct NativeValueTraits< - IDLNullable<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>, - typename std::enable_if_t<std::is_base_of<DOMArrayBufferView, T>::value>> + IDLNullable<IDLBufferSourceTypeNoSizeLimit<MaybeShared<T>>>> : public NativeValueTraitsBase<MaybeShared<T>> { // BufferSourceTypeNoSizeLimit must be used only as arguments. static MaybeShared<T> NativeValue(v8::Isolate* isolate, @@ -836,11 +832,8 @@ struct NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - T, - typename std::enable_if_t< - std::is_base_of<FlexibleArrayBufferView, T>::value>> - : public NativeValueTraitsBase<T> { + requires std::derived_from<T, FlexibleArrayBufferView> +struct NativeValueTraits<T> : public NativeValueTraitsBase<T> { // FlexibleArrayBufferView must be used only as arguments. static T NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, @@ -853,10 +846,8 @@ struct NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - IDLBufferSourceTypeNoSizeLimit<T>, - typename std::enable_if_t< - std::is_base_of<FlexibleArrayBufferView, T>::value>> + requires std::derived_from<T, FlexibleArrayBufferView> +struct NativeValueTraits<IDLBufferSourceTypeNoSizeLimit<T>> : public NativeValueTraitsBase<T> { // BufferSourceTypeNoSizeLimit and FlexibleArrayBufferView must be used only // as arguments. @@ -871,11 +862,8 @@ struct NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - IDLNullable<T>, - typename std::enable_if_t< - std::is_base_of<FlexibleArrayBufferView, T>::value>> - : public NativeValueTraitsBase<T> { + requires std::derived_from<T, FlexibleArrayBufferView> +struct NativeValueTraits<IDLNullable<T>> : public NativeValueTraitsBase<T> { // FlexibleArrayBufferView must be used only as arguments. static T NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, @@ -1134,9 +1122,8 @@ NativeValueTraits<IDLSequence<T>>::NativeValue( } template <typename T> -struct NativeValueTraits<IDLNullable<IDLSequence<T>>, - typename std::enable_if_t< - NativeValueTraits<IDLSequence<T>>::has_null_value>> + requires NativeValueTraits<IDLSequence<T>>::has_null_value +struct NativeValueTraits<IDLNullable<IDLSequence<T>>> : public NativeValueTraitsBase<HeapVector<AddMemberIfNeeded<T>>*> { using ImplType = typename NativeValueTraits<IDLSequence<T>>::ImplType*; @@ -1203,9 +1190,8 @@ struct NativeValueTraits<IDLArray<T>> : public NativeValueTraits<IDLSequence<T>> {}; template <typename T> -struct NativeValueTraits<IDLNullable<IDLArray<T>>, - typename std::enable_if_t< - NativeValueTraits<IDLSequence<T>>::has_null_value>> + requires NativeValueTraits<IDLSequence<T>>::has_null_value +struct NativeValueTraits<IDLNullable<IDLArray<T>>> : public NativeValueTraits<IDLNullable<IDLSequence<T>>> {}; // Record types @@ -1335,10 +1321,8 @@ struct NativeValueTraits<IDLRecord<K, V>> // Callback function types template <typename T> -struct NativeValueTraits< - T, - typename std::enable_if_t<std::is_base_of<CallbackFunctionBase, T>::value>> - : public NativeValueTraitsBase<T*> { + requires std::derived_from<T, CallbackFunctionBase> +struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> { static T* NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { @@ -1361,9 +1345,8 @@ struct NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - IDLNullable<T>, - typename std::enable_if_t<std::is_base_of<CallbackFunctionBase, T>::value>> + requires std::derived_from<T, CallbackFunctionBase> +struct NativeValueTraits<IDLNullable<T>> : public NativeValueTraitsBase<IDLNullable<T>> { static T* NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, @@ -1392,10 +1375,8 @@ struct NativeValueTraits< // Callback interface types template <typename T> -struct NativeValueTraits< - T, - typename std::enable_if_t<std::is_base_of<CallbackInterfaceBase, T>::value>> - : public NativeValueTraitsBase<T*> { + requires std::derived_from<T, CallbackInterfaceBase> +struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> { static T* NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { @@ -1418,9 +1399,8 @@ struct NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - IDLNullable<T>, - typename std::enable_if_t<std::is_base_of<CallbackInterfaceBase, T>::value>> + requires std::derived_from<T, CallbackInterfaceBase> +struct NativeValueTraits<IDLNullable<T>> : public NativeValueTraitsBase<IDLNullable<T>> { static T* NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, @@ -1449,11 +1429,8 @@ struct NativeValueTraits< // Dictionary types template <typename T> -struct NativeValueTraits< - T, - typename std::enable_if_t< - std::is_base_of<bindings::DictionaryBase, T>::value>> - : public NativeValueTraitsBase<T*> { + requires std::derived_from<T, bindings::DictionaryBase> +struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> { static T* NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { @@ -1464,14 +1441,11 @@ struct NativeValueTraits< // We don't support nullable dictionary types in general since it's quite // confusing and often misused. template <typename T> -struct NativeValueTraits< - IDLNullable<T>, - typename std::enable_if_t< - std::is_base_of<bindings::DictionaryBase, T>::value && - (std::is_same<T, GPUColorTargetState>::value || - std::is_same<T, GPURenderPassColorAttachment>::value || - std::is_same<T, GPUVertexBufferLayout>::value)>> - : public NativeValueTraitsBase<T*> { + requires std::derived_from<T, bindings::DictionaryBase> && + (std::same_as<T, GPUColorTargetState> || + std::same_as<T, GPURenderPassColorAttachment> || + std::same_as<T, GPUVertexBufferLayout>) +struct NativeValueTraits<IDLNullable<T>> : public NativeValueTraitsBase<T*> { static T* NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { @@ -1483,11 +1457,8 @@ struct NativeValueTraits< // Enumeration types template <typename T> -struct NativeValueTraits< - T, - typename std::enable_if_t< - std::is_base_of<bindings::EnumerationBase, T>::value>> - : public NativeValueTraitsBase<T> { + requires std::derived_from<T, bindings::EnumerationBase> +struct NativeValueTraits<T> : public NativeValueTraitsBase<T> { static T NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { @@ -1497,10 +1468,8 @@ struct NativeValueTraits< // Interface types template <typename T> -struct NativeValueTraits< - T, - typename std::enable_if_t<std::is_base_of<ScriptWrappable, T>::value>> - : public NativeValueTraitsBase<T*> { + requires std::derived_from<T, ScriptWrappable> +struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> { static inline T* NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { @@ -1528,9 +1497,8 @@ struct NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - IDLNullable<T>, - typename std::enable_if_t<std::is_base_of<ScriptWrappable, T>::value>> + requires std::derived_from<T, ScriptWrappable> +struct NativeValueTraits<IDLNullable<T>> : public NativeValueTraitsBase<IDLNullable<T>> { static inline T* NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, @@ -1565,10 +1533,8 @@ struct NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - T, - typename std::enable_if_t<std::is_base_of<bindings::UnionBase, T>::value>> - : public NativeValueTraitsBase<T*> { + requires std::derived_from<T, bindings::UnionBase> +struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> { static T* NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { @@ -1584,10 +1550,8 @@ struct NativeValueTraits< }; template <typename T> -struct NativeValueTraits< - IDLNullable<T>, - typename std::enable_if_t<std::is_base_of<bindings::UnionBase, T>::value>> - : public NativeValueTraitsBase<T*> { + requires std::derived_from<T, bindings::UnionBase> +struct NativeValueTraits<IDLNullable<T>> : public NativeValueTraitsBase<T*> { static T* NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { @@ -1608,9 +1572,8 @@ struct NativeValueTraits< // Nullable types template <typename InnerType> -struct NativeValueTraits< - IDLNullable<InnerType>, - typename std::enable_if_t<!NativeValueTraits<InnerType>::has_null_value>> + requires(!NativeValueTraits<InnerType>::has_null_value) +struct NativeValueTraits<IDLNullable<InnerType>> : public NativeValueTraitsBase<IDLNullable<InnerType>> { // https://webidl.spec.whatwg.org/#es-nullable-type using ImplType = @@ -1642,9 +1605,8 @@ struct NativeValueTraits<IDLNullable<IDLNullable<T>>>; // Optional types template <typename T> -struct NativeValueTraits<IDLOptional<T>, - typename std::enable_if_t<std::is_arithmetic< - typename NativeValueTraits<T>::ImplType>::value>> + requires std::is_arithmetic_v<typename NativeValueTraits<T>::ImplType> +struct NativeValueTraits<IDLOptional<T>> : public NativeValueTraitsBase<typename NativeValueTraits<T>::ImplType> { using ImplType = typename NativeValueTraits<T>::ImplType; @@ -1666,9 +1628,8 @@ struct NativeValueTraits<IDLOptional<T>, }; template <typename T> -struct NativeValueTraits<IDLOptional<T>, - typename std::enable_if_t<std::is_pointer< - typename NativeValueTraits<T>::ImplType>::value>> + requires std::is_pointer_v<typename NativeValueTraits<T>::ImplType> +struct NativeValueTraits<IDLOptional<T>> : public NativeValueTraitsBase<typename NativeValueTraits<T>::ImplType> { using ImplType = typename NativeValueTraits<T>::ImplType;