AK+LibURL: Move CopyOnWrite<T> from LibURL to AK

This commit is contained in:
Andreas Kling
2024-09-10 11:05:56 +02:00
committed by Andreas Kling
parent d6d94ba8cb
commit af68771dda
2 changed files with 43 additions and 29 deletions

41
AK/CopyOnWrite.h Normal file
View File

@@ -0,0 +1,41 @@
/*
* Copyright (c) 2024, Andreas Kling <andreas@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/NonnullRefPtr.h>
namespace AK {
template<typename T>
class CopyOnWrite {
public:
CopyOnWrite()
: m_value(adopt_ref(*new T))
{
}
T& mutable_value()
{
if (m_value->ref_count() > 1)
m_value = m_value->clone();
return *m_value;
}
T const& value() const { return *m_value; }
operator T const&() const { return value(); }
operator T&() { return mutable_value(); }
T const* operator->() const { return &value(); }
T* operator->() { return &mutable_value(); }
T const* ptr() const { return m_value.ptr(); }
T* ptr() { return m_value.ptr(); }
private:
NonnullRefPtr<T> m_value;
};
}