Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-04-02 08:54:42

0001 // Copyright 2021 the V8 project authors. All rights reserved.
0002 // Use of this source code is governed by a BSD-style license that can be
0003 // found in the LICENSE file.
0004 
0005 #ifndef INCLUDE_CPPGC_OBJECT_SIZE_TRAIT_H_
0006 #define INCLUDE_CPPGC_OBJECT_SIZE_TRAIT_H_
0007 
0008 #include <cstddef>
0009 
0010 #include "cppgc/type-traits.h"
0011 #include "v8config.h"  // NOLINT(build/include_directory)
0012 
0013 namespace cppgc {
0014 
0015 namespace internal {
0016 
0017 struct V8_EXPORT BaseObjectSizeTrait {
0018  protected:
0019   static size_t GetObjectSizeForGarbageCollected(const void*);
0020   static size_t GetObjectSizeForGarbageCollectedMixin(const void*);
0021 };
0022 
0023 }  // namespace internal
0024 
0025 namespace subtle {
0026 
0027 /**
0028  * Trait specifying how to get the size of an object that was allocated using
0029  * `MakeGarbageCollected()`. Also supports querying the size with an inner
0030  * pointer to a mixin.
0031  */
0032 template <typename T, bool = IsGarbageCollectedMixinTypeV<T>>
0033 struct ObjectSizeTrait;
0034 
0035 template <typename T>
0036 struct ObjectSizeTrait<T, false> : cppgc::internal::BaseObjectSizeTrait {
0037   static_assert(sizeof(T), "T must be fully defined");
0038   static_assert(IsGarbageCollectedTypeV<T>,
0039                 "T must be of type GarbageCollected or GarbageCollectedMixin");
0040 
0041   static size_t GetSize(const T& object) {
0042     return GetObjectSizeForGarbageCollected(&object);
0043   }
0044 };
0045 
0046 template <typename T>
0047 struct ObjectSizeTrait<T, true> : cppgc::internal::BaseObjectSizeTrait {
0048   static_assert(sizeof(T), "T must be fully defined");
0049 
0050   static size_t GetSize(const T& object) {
0051     return GetObjectSizeForGarbageCollectedMixin(&object);
0052   }
0053 };
0054 
0055 }  // namespace subtle
0056 }  // namespace cppgc
0057 
0058 #endif  // INCLUDE_CPPGC_OBJECT_SIZE_TRAIT_H_