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