5#ifndef INCLUDE_CPPGC_INTERNAL_FINALIZER_TRAIT_H_
6#define INCLUDE_CPPGC_INTERNAL_FINALIZER_TRAIT_H_
10#include "cppgc/type-traits.h"
15using FinalizationCallback =
void (*)(
void*);
17template <
typename T,
typename =
void>
27template <
typename T,
bool isFinalized>
28struct FinalizerTraitImpl;
31struct FinalizerTraitImpl<T,
true> {
35 static void Call(
void* obj) {
36 static_cast<T*>(obj)->FinalizeGarbageCollectedObject();
42 static void Call(
void* obj) {
static_cast<T*>(obj)->~T(); }
46 std::conditional_t<HasFinalizeGarbageCollectedObject<T>::value, Custom,
51 static_assert(
sizeof(T),
"T must be fully defined");
52 FinalizeImpl::Call(obj);
57struct FinalizerTraitImpl<T,
false> {
59 static_assert(
sizeof(T),
"T must be fully defined");
71 static constexpr bool kNonTrivialFinalizer =
75 static void Finalize(
void* obj) {
76 internal::FinalizerTraitImpl<T, kNonTrivialFinalizer>::Finalize(obj);
80 static constexpr bool HasFinalizer() {
return kNonTrivialFinalizer; }
84 kNonTrivialFinalizer ? Finalize :
nullptr;
static constexpr FinalizationCallback kCallback
static constexpr bool HasFinalizer()
static void Finalize(void *obj)
static void Finalize(void *obj)