Coverage Report

Created: 2025-07-04 09:33

/src/node/deps/v8/include/cppgc/custom-space.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright 2020 the V8 project authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file.
4
5
#ifndef INCLUDE_CPPGC_CUSTOM_SPACE_H_
6
#define INCLUDE_CPPGC_CUSTOM_SPACE_H_
7
8
#include <stddef.h>
9
10
namespace cppgc {
11
12
/**
13
 * Index identifying a custom space.
14
 */
15
struct CustomSpaceIndex {
16
0
  constexpr CustomSpaceIndex(size_t value) : value(value) {}  // NOLINT
17
  size_t value;
18
};
19
20
/**
21
 * Top-level base class for custom spaces. Users must inherit from CustomSpace
22
 * below.
23
 */
24
class CustomSpaceBase {
25
 public:
26
  virtual ~CustomSpaceBase() = default;
27
  virtual CustomSpaceIndex GetCustomSpaceIndex() const = 0;
28
  virtual bool IsCompactable() const = 0;
29
};
30
31
/**
32
 * Base class custom spaces should directly inherit from. The class inheriting
33
 * from `CustomSpace` must define `kSpaceIndex` as unique space index. These
34
 * indices need for form a sequence starting at 0.
35
 *
36
 * Example:
37
 * \code
38
 * class CustomSpace1 : public CustomSpace<CustomSpace1> {
39
 *  public:
40
 *   static constexpr CustomSpaceIndex kSpaceIndex = 0;
41
 * };
42
 * class CustomSpace2 : public CustomSpace<CustomSpace2> {
43
 *  public:
44
 *   static constexpr CustomSpaceIndex kSpaceIndex = 1;
45
 * };
46
 * \endcode
47
 */
48
template <typename ConcreteCustomSpace>
49
class CustomSpace : public CustomSpaceBase {
50
 public:
51
  /**
52
   * Compaction is only supported on spaces that manually manage slots
53
   * recording.
54
   */
55
  static constexpr bool kSupportsCompaction = false;
56
57
  CustomSpaceIndex GetCustomSpaceIndex() const final {
58
    return ConcreteCustomSpace::kSpaceIndex;
59
  }
60
  bool IsCompactable() const final {
61
    return ConcreteCustomSpace::kSupportsCompaction;
62
  }
63
};
64
65
/**
66
 * User-overridable trait that allows pinning types to custom spaces.
67
 */
68
template <typename T, typename = void>
69
struct SpaceTrait {
70
  using Space = void;
71
};
72
73
namespace internal {
74
75
template <typename CustomSpace>
76
struct IsAllocatedOnCompactableSpaceImpl {
77
  static constexpr bool value = CustomSpace::kSupportsCompaction;
78
};
79
80
template <>
81
struct IsAllocatedOnCompactableSpaceImpl<void> {
82
  // Non-custom spaces are by default not compactable.
83
  static constexpr bool value = false;
84
};
85
86
template <typename T>
87
struct IsAllocatedOnCompactableSpace {
88
 public:
89
  static constexpr bool value =
90
      IsAllocatedOnCompactableSpaceImpl<typename SpaceTrait<T>::Space>::value;
91
};
92
93
}  // namespace internal
94
95
}  // namespace cppgc
96
97
#endif  // INCLUDE_CPPGC_CUSTOM_SPACE_H_