/* * Copyright (c) 2025, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace GC { class RootHashMapBase { public: virtual void gather_roots(HashMap&) const = 0; protected: explicit RootHashMapBase(Heap&); ~RootHashMapBase(); void assign_heap(Heap*); Heap* m_heap { nullptr }; IntrusiveListNode m_list_node; public: using List = IntrusiveList<&RootHashMapBase::m_list_node>; }; template, typename ValueTraits = Traits, bool IsOrdered = false> class RootHashMap final : public RootHashMapBase , public HashMap { using HashMapBase = HashMap; public: explicit RootHashMap(Heap& heap) : RootHashMapBase(heap) { } ~RootHashMap() = default; virtual void gather_roots(HashMap& roots) const override { for (auto& [key, value] : *this) { if constexpr (IsBaseOf) { if (value.is_cell()) roots.set(&const_cast(value).as_cell(), HeapRoot { .type = HeapRoot::Type::RootHashMap }); } else { roots.set(value, HeapRoot { .type = HeapRoot::Type::RootHashMap }); } } } }; template, typename ValueTraits = Traits> using OrderedRootHashMap = RootHashMap; }