cf380f5965
Expose kSupportsCompaction to be able to refer to it from other traits. Change-Id: I3a0870853fabfac993eff22886a0a31a52d90055 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2653225 Commit-Queue: Michael Lippautz <mlippautz@chromium.org> Commit-Queue: Omer Katz <omerkatz@chromium.org> Auto-Submit: Michael Lippautz <mlippautz@chromium.org> Reviewed-by: Omer Katz <omerkatz@chromium.org> Cr-Commit-Position: refs/heads/master@{#72372}
98 lines
2.4 KiB
C++
98 lines
2.4 KiB
C++
// 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 {
|
|
|
|
/**
|
|
* Index identifying a custom space.
|
|
*/
|
|
struct CustomSpaceIndex {
|
|
constexpr 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:
|
|
/**
|
|
* Compaction is only supported on spaces that manually manage slots
|
|
* recording.
|
|
*/
|
|
static constexpr bool kSupportsCompaction = false;
|
|
|
|
CustomSpaceIndex GetCustomSpaceIndex() const final {
|
|
return ConcreteCustomSpace::kSpaceIndex;
|
|
}
|
|
bool IsCompactable() const final {
|
|
return ConcreteCustomSpace::kSupportsCompaction;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 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_
|