mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-29 04:09:13 +00:00
LibGC: Add GC::RootHashMap<...> template container
This is a GC-aware wrapper around AK::HashMap. Entry values are treated as GC roots, much like the GC::RootVector we already had. We also provide GC::OrderedRootHashMap as a convenience.
This commit is contained in:
parent
a453da2906
commit
11ece7de10
Notes:
github-actions[bot]
2025-05-03 15:34:58 +00:00
Author: https://github.com/awesomekling
Commit: 11ece7de10
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4573
6 changed files with 122 additions and 0 deletions
66
Libraries/LibGC/RootHashMap.h
Normal file
66
Libraries/LibGC/RootHashMap.h
Normal file
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* Copyright (c) 2025, Andreas Kling <andreas@ladybird.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/HashMap.h>
|
||||
#include <AK/IntrusiveList.h>
|
||||
#include <AK/Vector.h>
|
||||
#include <LibGC/Cell.h>
|
||||
#include <LibGC/Forward.h>
|
||||
#include <LibGC/HeapRoot.h>
|
||||
|
||||
namespace GC {
|
||||
|
||||
class RootHashMapBase {
|
||||
public:
|
||||
virtual void gather_roots(HashMap<Cell*, GC::HeapRoot>&) const = 0;
|
||||
|
||||
protected:
|
||||
explicit RootHashMapBase(Heap&);
|
||||
~RootHashMapBase();
|
||||
|
||||
void assign_heap(Heap*);
|
||||
|
||||
Heap* m_heap { nullptr };
|
||||
IntrusiveListNode<RootHashMapBase> m_list_node;
|
||||
|
||||
public:
|
||||
using List = IntrusiveList<&RootHashMapBase::m_list_node>;
|
||||
};
|
||||
|
||||
template<typename K, typename V, typename KeyTraits = Traits<K>, typename ValueTraits = Traits<V>, bool IsOrdered = false>
|
||||
class RootHashMap final
|
||||
: public RootHashMapBase
|
||||
, public HashMap<K, V, KeyTraits, ValueTraits, IsOrdered> {
|
||||
|
||||
using HashMapBase = HashMap<K, V, KeyTraits, ValueTraits, IsOrdered>;
|
||||
|
||||
public:
|
||||
explicit RootHashMap(Heap& heap)
|
||||
: RootHashMapBase(heap)
|
||||
{
|
||||
}
|
||||
|
||||
virtual ~RootHashMap() = default;
|
||||
|
||||
virtual void gather_roots(HashMap<Cell*, GC::HeapRoot>& roots) const override
|
||||
{
|
||||
for (auto& [key, value] : *this) {
|
||||
if constexpr (IsBaseOf<NanBoxedValue, V>) {
|
||||
if (value.is_cell())
|
||||
roots.set(&const_cast<V&>(value).as_cell(), HeapRoot { .type = HeapRoot::Type::RootHashMap });
|
||||
} else {
|
||||
roots.set(value, HeapRoot { .type = HeapRoot::Type::RootHashMap });
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template<typename K, typename V, typename KeyTraits = Traits<K>, typename ValueTraits = Traits<V>>
|
||||
using OrderedRootHashMap = RootHashMap<K, V, KeyTraits, ValueTraits, true>;
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue