2020-05-07 20:36:03 +00:00
|
|
|
// 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 {
|
|
|
|
|
2021-01-25 11:03:56 +00:00
|
|
|
/**
|
|
|
|
* Index identifying a custom space.
|
|
|
|
*/
|
2020-05-11 15:13:53 +00:00
|
|
|
struct CustomSpaceIndex {
|
2021-01-25 11:03:56 +00:00
|
|
|
constexpr CustomSpaceIndex(size_t value) : value(value) {} // NOLINT
|
2020-05-11 15:13:53 +00:00
|
|
|
size_t value;
|
|
|
|
};
|
2020-05-07 20:36:03 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Top-level base class for custom spaces. Users must inherit from CustomSpace
|
|
|
|
* below.
|
|
|
|
*/
|
|
|
|
class CustomSpaceBase {
|
|
|
|
public:
|
|
|
|
virtual ~CustomSpaceBase() = default;
|
|
|
|
virtual CustomSpaceIndex GetCustomSpaceIndex() const = 0;
|
2020-10-06 14:08:32 +00:00
|
|
|
virtual bool IsCompactable() const = 0;
|
2020-05-07 20:36:03 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Base class custom spaces should directly inherit from. The class inheriting
|
2020-10-19 08:12:55 +00:00
|
|
|
* from `CustomSpace` must define `kSpaceIndex` as unique space index. These
|
2020-05-07 20:36:03 +00:00
|
|
|
* 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:
|
2020-05-08 09:45:12 +00:00
|
|
|
* static constexpr CustomSpaceIndex kSpaceIndex = 1;
|
2020-05-07 20:36:03 +00:00
|
|
|
* };
|
|
|
|
* \endcode
|
|
|
|
*/
|
|
|
|
template <typename ConcreteCustomSpace>
|
|
|
|
class CustomSpace : public CustomSpaceBase {
|
|
|
|
public:
|
2021-01-27 15:22:33 +00:00
|
|
|
/**
|
|
|
|
* Compaction is only supported on spaces that manually manage slots
|
|
|
|
* recording.
|
|
|
|
*/
|
|
|
|
static constexpr bool kSupportsCompaction = false;
|
|
|
|
|
2020-05-07 20:36:03 +00:00
|
|
|
CustomSpaceIndex GetCustomSpaceIndex() const final {
|
|
|
|
return ConcreteCustomSpace::kSpaceIndex;
|
|
|
|
}
|
2020-10-06 14:08:32 +00:00
|
|
|
bool IsCompactable() const final {
|
|
|
|
return ConcreteCustomSpace::kSupportsCompaction;
|
|
|
|
}
|
2020-05-07 20:36:03 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* User-overridable trait that allows pinning types to custom spaces.
|
|
|
|
*/
|
|
|
|
template <typename T, typename = void>
|
|
|
|
struct SpaceTrait {
|
|
|
|
using Space = void;
|
|
|
|
};
|
|
|
|
|
2020-10-23 12:55:45 +00:00
|
|
|
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
|
|
|
|
|
2020-05-07 20:36:03 +00:00
|
|
|
} // namespace cppgc
|
|
|
|
|
|
|
|
#endif // INCLUDE_CPPGC_CUSTOM_SPACE_H_
|