mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 23:50:19 +00:00
786036820b
This container is the same as IntrusiveList, except that it allows modifications to the elements even if the reference to the IntrusiveList itself is const, by returning mutable iterators. This represents a use-case where we want to allow modifications to the elements while keeping the list itself immutable. This behavior is explicitely opt-in by using IntrusiveListRelaxedConst instead of IntrusiveList. It will be useful later on when we model shared/exclusive locks with the help of const and mutable references.
29 lines
791 B
C++
29 lines
791 B
C++
/*
|
|
* Copyright (c) 2021, the SerenityOS developers.
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/IntrusiveList.h>
|
|
|
|
namespace AK {
|
|
|
|
template<class T, typename Container, IntrusiveListNode<T, Container> T::*member>
|
|
class IntrusiveListRelaxedConst : public IntrusiveList<T, Container, member> {
|
|
AK_MAKE_NONCOPYABLE(IntrusiveListRelaxedConst);
|
|
AK_MAKE_NONMOVABLE(IntrusiveListRelaxedConst);
|
|
|
|
public:
|
|
using IntrusiveList<T, Container, member>::IntrusiveList;
|
|
|
|
using Iterator = IntrusiveList<T, Container, member>::Iterator;
|
|
|
|
Iterator begin() const { return const_cast<IntrusiveListRelaxedConst*>(this)->IntrusiveList<T, Container, member>::begin(); }
|
|
Iterator end() const { return Iterator {}; }
|
|
};
|
|
|
|
}
|
|
|
|
using AK::IntrusiveListRelaxedConst;
|