11cb0ef41Sopenharmony_ci// Copyright 2020 the V8 project authors. All rights reserved.
21cb0ef41Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be
31cb0ef41Sopenharmony_ci// found in the LICENSE file.
41cb0ef41Sopenharmony_ci
51cb0ef41Sopenharmony_ci#ifndef INCLUDE_CPPGC_EPHEMERON_PAIR_H_
61cb0ef41Sopenharmony_ci#define INCLUDE_CPPGC_EPHEMERON_PAIR_H_
71cb0ef41Sopenharmony_ci
81cb0ef41Sopenharmony_ci#include "cppgc/liveness-broker.h"
91cb0ef41Sopenharmony_ci#include "cppgc/member.h"
101cb0ef41Sopenharmony_ci
111cb0ef41Sopenharmony_cinamespace cppgc {
121cb0ef41Sopenharmony_ci
131cb0ef41Sopenharmony_ci/**
141cb0ef41Sopenharmony_ci * An ephemeron pair is used to conditionally retain an object.
151cb0ef41Sopenharmony_ci * The `value` will be kept alive only if the `key` is alive.
161cb0ef41Sopenharmony_ci */
171cb0ef41Sopenharmony_citemplate <typename K, typename V>
181cb0ef41Sopenharmony_cistruct EphemeronPair {
191cb0ef41Sopenharmony_ci  EphemeronPair(K* k, V* v) : key(k), value(v) {}
201cb0ef41Sopenharmony_ci  WeakMember<K> key;
211cb0ef41Sopenharmony_ci  Member<V> value;
221cb0ef41Sopenharmony_ci
231cb0ef41Sopenharmony_ci  void ClearValueIfKeyIsDead(const LivenessBroker& broker) {
241cb0ef41Sopenharmony_ci    if (!broker.IsHeapObjectAlive(key)) value = nullptr;
251cb0ef41Sopenharmony_ci  }
261cb0ef41Sopenharmony_ci};
271cb0ef41Sopenharmony_ci
281cb0ef41Sopenharmony_ci}  // namespace cppgc
291cb0ef41Sopenharmony_ci
301cb0ef41Sopenharmony_ci#endif  // INCLUDE_CPPGC_EPHEMERON_PAIR_H_
31