blob: 68ec7c42e1c0d78ad559fa2d7609940536e82906 [file] [log] [blame]
// Copyright 2020 The Chromium 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 THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_MEMBER_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_MEMBER_H_
#include "third_party/blink/renderer/platform/wtf/buildflags.h"
#include "third_party/blink/renderer/platform/wtf/hash_functions.h"
#include "third_party/blink/renderer/platform/wtf/hash_traits.h"
#include "third_party/blink/renderer/platform/wtf/type_traits.h"
#if BUILDFLAG(USE_V8_OILPAN)
#include "third_party/blink/renderer/platform/heap/v8_wrapper/member.h"
#else // !USE_V8_OILPAN
#include "third_party/blink/renderer/platform/heap/impl/member.h"
#endif // !USE_V8_OILPAN
namespace blink {
template <typename T>
inline void swap(Member<T>& a, Member<T>& b) {
a.Swap(b);
}
} // namespace blink
namespace WTF {
// PtrHash is the default hash for hash tables with Member<>-derived elements.
template <typename T>
struct MemberHash : PtrHash<T> {
STATIC_ONLY(MemberHash);
template <typename U>
static unsigned GetHash(const U& key) {
return PtrHash<T>::GetHash(key);
}
template <typename U, typename V>
static bool Equal(const U& a, const V& b) {
return a == b;
}
};
template <typename T>
struct DefaultHash<blink::Member<T>> {
STATIC_ONLY(DefaultHash);
using Hash = MemberHash<T>;
};
template <typename T>
struct DefaultHash<blink::WeakMember<T>> {
STATIC_ONLY(DefaultHash);
using Hash = MemberHash<T>;
};
template <typename T>
struct DefaultHash<blink::UntracedMember<T>> {
STATIC_ONLY(DefaultHash);
using Hash = MemberHash<T>;
};
template <typename T>
struct IsTraceable<blink::Member<T>> {
STATIC_ONLY(IsTraceable);
static const bool value = true;
};
template <typename T>
struct IsWeak<blink::WeakMember<T>> : std::true_type {};
template <typename T>
struct IsTraceable<blink::WeakMember<T>> {
STATIC_ONLY(IsTraceable);
static const bool value = true;
};
template <typename T, typename MemberType>
struct BaseMemberHashTraits : SimpleClassHashTraits<MemberType> {
STATIC_ONLY(BaseMemberHashTraits);
using PeekInType = T*;
using PeekOutType = T*;
using IteratorGetType = MemberType*;
using IteratorConstGetType = const MemberType*;
using IteratorReferenceType = MemberType&;
using IteratorConstReferenceType = const MemberType&;
static PeekOutType Peek(const MemberType& value) { return value; }
static IteratorReferenceType GetToReferenceConversion(IteratorGetType x) {
return *x;
}
static IteratorConstReferenceType GetToReferenceConstConversion(
IteratorConstGetType x) {
return *x;
}
template <typename U>
static void Store(const U& value, MemberType& storage) {
storage = value;
}
static void ConstructDeletedValue(MemberType& slot, bool) {
#if BUILDFLAG(USE_V8_OILPAN)
slot = cppgc::kSentinelPointer;
#else // !USE_V8_OILPAN
slot = WTF::kHashTableDeletedValue;
#endif // !USE_V8_OILPAN
}
static bool IsDeletedValue(const MemberType& value) {
#if BUILDFLAG(USE_V8_OILPAN)
return value.Get() == cppgc::kSentinelPointer;
#else // !USE_V8_OILPAN
return value.IsHashTableDeletedValue();
#endif // !USE_V8_OILPAN
}
};
template <typename T>
struct HashTraits<blink::Member<T>>
: BaseMemberHashTraits<T, blink::Member<T>> {
static constexpr bool kCanTraceConcurrently = true;
};
template <typename T>
struct HashTraits<blink::WeakMember<T>>
: BaseMemberHashTraits<T, blink::WeakMember<T>> {
static constexpr bool kCanTraceConcurrently = true;
};
template <typename T>
struct HashTraits<blink::UntracedMember<T>>
: BaseMemberHashTraits<T, blink::UntracedMember<T>> {};
} // namespace WTF
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_MEMBER_H_