1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 11:17:35 +00:00

AK+Kernel: Make IntrusiveList capable of holding non-raw pointers

This should allow creating intrusive lists that have smart pointers,
while remaining free (compared to the impl before this commit) when
holding raw pointers :^)
As a sidenote, this also adds a `RawPtr<T>` type, which is just
equivalent to `T*`.
Note that this does not actually use such functionality, but is only
expected to pave the way for #6369, to replace NonnullRefPtrVector<T>
with intrusive lists.

As it is with zero-cost things, this makes the interface a bit less nice
by requiring the type name of what an `IntrusiveListNode` holds (and
optionally its container, if not RawPtr), and also requiring the type of
the container (normally `RawPtr`) on the `IntrusiveList` instance.
This commit is contained in:
AnotherTest 2021-04-16 16:33:24 +04:30 committed by Andreas Kling
parent fb814ee720
commit e4412f1f59
11 changed files with 143 additions and 80 deletions

View file

@ -63,7 +63,7 @@ public:
private:
const size_t m_cell_size;
typedef IntrusiveList<HeapBlock, &HeapBlock::m_list_node> BlockList;
typedef IntrusiveList<HeapBlock, RawPtr<HeapBlock>, &HeapBlock::m_list_node> BlockList;
BlockList m_full_blocks;
BlockList m_usable_blocks;
};

View file

@ -86,7 +86,7 @@ public:
return cell_from_possible_pointer((FlatPtr)cell);
}
IntrusiveListNode m_list_node;
IntrusiveListNode<HeapBlock> m_list_node;
private:
HeapBlock(Heap&, size_t cell_size);