| // Copyright 2020 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef INCLUDE_CPPGC_CUSTOM_SPACE_H_ |
| #define INCLUDE_CPPGC_CUSTOM_SPACE_H_ |
| |
| #include <stddef.h> |
| |
| namespace cppgc { |
| |
| struct CustomSpaceIndex { |
| CustomSpaceIndex(size_t value) : value(value) {} // NOLINT |
| size_t value; |
| }; |
| |
| /** |
| * Top-level base class for custom spaces. Users must inherit from CustomSpace |
| * below. |
| */ |
| class CustomSpaceBase { |
| public: |
| virtual ~CustomSpaceBase() = default; |
| virtual CustomSpaceIndex GetCustomSpaceIndex() const = 0; |
| virtual bool IsCompactable() const = 0; |
| }; |
| |
| /** |
| * Base class custom spaces should directly inherit from. The class inheriting |
| * from `CustomSpace` must define `kSpaceIndex` as unique space index. These |
| * indices need for form a sequence starting at 0. |
| * |
| * Example: |
| * \code |
| * class CustomSpace1 : public CustomSpace<CustomSpace1> { |
| * public: |
| * static constexpr CustomSpaceIndex kSpaceIndex = 0; |
| * }; |
| * class CustomSpace2 : public CustomSpace<CustomSpace2> { |
| * public: |
| * static constexpr CustomSpaceIndex kSpaceIndex = 1; |
| * }; |
| * \endcode |
| */ |
| template <typename ConcreteCustomSpace> |
| class CustomSpace : public CustomSpaceBase { |
| public: |
| CustomSpaceIndex GetCustomSpaceIndex() const final { |
| return ConcreteCustomSpace::kSpaceIndex; |
| } |
| bool IsCompactable() const final { |
| return ConcreteCustomSpace::kSupportsCompaction; |
| } |
| |
| protected: |
| static constexpr bool kSupportsCompaction = false; |
| }; |
| |
| /** |
| * User-overridable trait that allows pinning types to custom spaces. |
| */ |
| template <typename T, typename = void> |
| struct SpaceTrait { |
| using Space = void; |
| }; |
| |
| namespace internal { |
| |
| template <typename CustomSpace> |
| struct IsAllocatedOnCompactableSpaceImpl { |
| static constexpr bool value = CustomSpace::kSupportsCompaction; |
| }; |
| |
| template <> |
| struct IsAllocatedOnCompactableSpaceImpl<void> { |
| // Non-custom spaces are by default not compactable. |
| static constexpr bool value = false; |
| }; |
| |
| template <typename T> |
| struct IsAllocatedOnCompactableSpace { |
| public: |
| static constexpr bool value = |
| IsAllocatedOnCompactableSpaceImpl<typename SpaceTrait<T>::Space>::value; |
| }; |
| |
| } // namespace internal |
| |
| } // namespace cppgc |
| |
| #endif // INCLUDE_CPPGC_CUSTOM_SPACE_H_ |