serenity/AK/IntrusiveListRelaxedConst.h
Jean-Baptiste Boric 786036820b AK: Introduce IntrusiveListRelaxedConst
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.
2021-08-07 11:48:00 +02:00

30 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;