2020-01-18 05:38:21 -03:00
/*
2024-10-04 08:19:50 -03:00
* Copyright ( c ) 2018 - 2020 , Andreas Kling < andreas @ ladybird . org >
2020-01-18 05:38:21 -03:00
*
2021-04-22 05:24:48 -03:00
* SPDX - License - Identifier : BSD - 2 - Clause
2020-01-18 05:38:21 -03:00
*/
2018-10-10 06:53:07 -03:00
# pragma once
2021-11-07 20:51:39 -03:00
# include <AK/Error.h>
2022-12-16 00:51:55 -03:00
# include <AK/Forward.h>
2019-07-24 03:25:27 -03:00
# include <AK/NonnullOwnPtr.h>
2020-06-12 10:30:30 -03:00
# include <AK/RefCounted.h>
2018-10-10 06:53:07 -03:00
namespace AK {
2026-06-13 14:46:55 -03:00
template < typename T >
2021-12-01 18:05:13 -03:00
class [ [ nodiscard ] ] OwnPtr {
2018-10-10 06:53:07 -03:00
public :
2021-01-10 20:29:28 -03:00
OwnPtr ( ) = default ;
2021-05-30 13:39:23 -03:00
OwnPtr ( decltype ( nullptr ) )
: m_ptr ( nullptr )
2019-05-28 06:53:16 -03:00
{
}
2021-05-30 13:39:23 -03:00
2019-05-28 06:53:16 -03:00
OwnPtr ( OwnPtr & & other )
: m_ptr ( other . leak_ptr ( ) )
{
}
2019-07-24 03:25:27 -03:00
template < typename U >
OwnPtr ( NonnullOwnPtr < U > & & other )
2020-04-05 06:32:30 -03:00
: m_ptr ( other . leak_ptr ( ) )
2019-07-24 03:25:27 -03:00
{
}
2019-05-28 06:53:16 -03:00
template < typename U >
OwnPtr ( OwnPtr < U > & & other )
2020-04-05 06:32:30 -03:00
: m_ptr ( other . leak_ptr ( ) )
2019-05-28 06:53:16 -03:00
{
}
2018-10-16 07:20:51 -03:00
~ OwnPtr ( )
{
2026-06-13 14:47:43 -03:00
delete m_ptr ;
2018-10-16 07:20:51 -03:00
}
2018-10-10 06:53:07 -03:00
2022-04-01 14:58:27 -03:00
OwnPtr ( OwnPtr const & ) = delete ;
2019-07-24 03:25:27 -03:00
template < typename U >
2022-04-01 14:58:27 -03:00
OwnPtr ( OwnPtr < U > const & ) = delete ;
OwnPtr & operator = ( OwnPtr const & ) = delete ;
2019-07-24 03:25:27 -03:00
template < typename U >
2022-04-01 14:58:27 -03:00
OwnPtr & operator = ( OwnPtr < U > const & ) = delete ;
2019-07-24 03:25:27 -03:00
2019-08-01 10:46:18 -03:00
template < typename U >
2022-04-01 14:58:27 -03:00
OwnPtr ( NonnullOwnPtr < U > const & ) = delete ;
2019-08-01 10:46:18 -03:00
template < typename U >
2022-04-01 14:58:27 -03:00
OwnPtr & operator = ( NonnullOwnPtr < U > const & ) = delete ;
2019-07-11 11:43:20 -03:00
template < typename U >
2022-04-01 14:58:27 -03:00
OwnPtr ( RefPtr < U > const & ) = delete ;
2019-07-11 11:43:20 -03:00
template < typename U >
2022-04-01 14:58:27 -03:00
OwnPtr ( NonnullRefPtr < U > const & ) = delete ;
2019-07-11 11:43:20 -03:00
template < typename U >
2022-04-01 14:58:27 -03:00
OwnPtr ( WeakPtr < U > const & ) = delete ;
2019-07-11 11:43:20 -03:00
template < typename U >
2022-04-01 14:58:27 -03:00
OwnPtr & operator = ( RefPtr < U > const & ) = delete ;
2019-07-11 11:43:20 -03:00
template < typename U >
2022-04-01 14:58:27 -03:00
OwnPtr & operator = ( NonnullRefPtr < U > const & ) = delete ;
2019-07-11 11:43:20 -03:00
template < typename U >
2022-04-01 14:58:27 -03:00
OwnPtr & operator = ( WeakPtr < U > const & ) = delete ;
2019-07-11 11:43:20 -03:00
2018-10-10 06:53:07 -03:00
OwnPtr & operator = ( OwnPtr & & other )
{
2020-01-24 05:31:14 -03:00
OwnPtr ptr ( move ( other ) ) ;
swap ( ptr ) ;
2018-10-10 06:53:07 -03:00
return * this ;
}
template < typename U >
OwnPtr & operator = ( OwnPtr < U > & & other )
{
2020-01-24 05:31:14 -03:00
OwnPtr ptr ( move ( other ) ) ;
swap ( ptr ) ;
2018-10-10 06:53:07 -03:00
return * this ;
}
2019-07-24 03:25:27 -03:00
template < typename U >
OwnPtr & operator = ( NonnullOwnPtr < U > & & other )
{
2020-01-24 05:31:14 -03:00
OwnPtr ptr ( move ( other ) ) ;
swap ( ptr ) ;
2021-02-23 16:42:32 -03:00
VERIFY ( m_ptr ) ;
2019-07-24 03:25:27 -03:00
return * this ;
}
2021-05-30 13:39:23 -03:00
OwnPtr & operator = ( T * ptr ) = delete ;
2018-10-10 06:53:07 -03:00
2022-12-13 03:59:30 -03:00
OwnPtr & operator = ( nullptr_t )
2018-10-10 06:53:07 -03:00
{
clear ( ) ;
return * this ;
}
void clear ( )
{
2023-04-21 08:36:32 -03:00
auto * ptr = exchange ( m_ptr , nullptr ) ;
2026-06-13 14:46:55 -03:00
delete ptr ;
2018-10-10 06:53:07 -03:00
}
bool operator ! ( ) const { return ! m_ptr ; }
2020-08-05 10:40:03 -03:00
[ [ nodiscard ] ] T * leak_ptr ( )
2018-10-10 06:53:07 -03:00
{
2019-07-24 03:25:27 -03:00
T * leaked_ptr = m_ptr ;
2018-10-10 06:53:07 -03:00
m_ptr = nullptr ;
2019-07-24 03:25:27 -03:00
return leaked_ptr ;
2018-10-10 06:53:07 -03:00
}
2019-08-14 06:02:49 -03:00
NonnullOwnPtr < T > release_nonnull ( )
{
2021-02-23 16:42:32 -03:00
VERIFY ( m_ptr ) ;
2019-08-14 06:02:49 -03:00
return NonnullOwnPtr < T > ( NonnullOwnPtr < T > : : Adopt , * leak_ptr ( ) ) ;
}
2020-04-05 06:32:30 -03:00
template < typename U >
NonnullOwnPtr < U > release_nonnull ( )
{
2021-02-23 16:42:32 -03:00
VERIFY ( m_ptr ) ;
2020-04-05 06:32:30 -03:00
return NonnullOwnPtr < U > ( NonnullOwnPtr < U > : : Adopt , static_cast < U & > ( * leak_ptr ( ) ) ) ;
}
2022-11-18 22:03:48 -03:00
T * ptr ( ) const { return m_ptr ; }
2018-10-10 06:53:07 -03:00
2022-11-18 22:03:48 -03:00
T * operator - > ( ) const
2019-08-02 05:34:40 -03:00
{
2021-02-23 16:42:32 -03:00
VERIFY ( m_ptr ) ;
2019-08-02 05:34:40 -03:00
return m_ptr ;
}
2024-10-24 17:36:28 -03:00
[ [ nodiscard ] ] T & operator * ( ) const
2019-08-02 05:34:40 -03:00
{
2021-02-23 16:42:32 -03:00
VERIFY ( m_ptr ) ;
2019-08-02 05:34:40 -03:00
return * m_ptr ;
}
2018-10-10 06:53:07 -03:00
2022-11-18 22:03:48 -03:00
operator T * ( ) const { return m_ptr ; }
2019-04-13 21:36:06 -03:00
2018-10-10 06:53:07 -03:00
operator bool ( ) { return ! ! m_ptr ; }
2020-01-24 05:31:14 -03:00
void swap ( OwnPtr & other )
{
2023-04-27 22:01:15 -03:00
AK : : swap ( m_ptr , other . m_ptr ) ;
2020-01-24 05:31:14 -03:00
}
template < typename U >
void swap ( OwnPtr < U > & other )
{
2023-04-27 22:01:15 -03:00
AK : : swap ( m_ptr , other . m_ptr ) ;
2020-01-24 05:31:14 -03:00
}
2021-05-30 13:39:23 -03:00
static OwnPtr lift ( T * ptr )
{
return OwnPtr { ptr } ;
}
protected :
explicit OwnPtr ( T * ptr )
: m_ptr ( ptr )
{
static_assert (
2021-06-25 02:33:15 -03:00
requires { requires typename T : : AllowOwnPtr ( ) ( ) ; } | | ! requires { requires ! typename T : : AllowOwnPtr ( ) ( ) ; declval < T > ( ) . ref ( ) ; declval < T > ( ) . unref ( ) ; } , " Use RefPtr<> for RefCounted types " ) ;
2021-05-30 13:39:23 -03:00
}
2018-10-10 06:53:07 -03:00
private :
T * m_ptr = nullptr ;
} ;
2020-01-24 05:31:14 -03:00
template < typename T , typename U >
inline void swap ( OwnPtr < T > & a , OwnPtr < U > & b )
{
a . swap ( b ) ;
}
2021-05-13 00:35:08 -03:00
template < typename T >
inline OwnPtr < T > adopt_own_if_nonnull ( T * object )
{
if ( object )
2021-05-30 13:39:23 -03:00
return OwnPtr < T > : : lift ( object ) ;
2021-05-13 00:35:08 -03:00
return { } ;
}
2018-10-26 12:42:12 -03:00
template < typename T >
2023-11-08 16:29:12 -03:00
struct Traits < OwnPtr < T > > : public DefaultTraits < OwnPtr < T > > {
2021-05-08 06:11:37 -03:00
using PeekType = T * ;
2022-10-16 19:06:11 -03:00
using ConstPeekType = T const * ;
2022-04-01 14:58:27 -03:00
static unsigned hash ( OwnPtr < T > const & p ) { return ptr_hash ( p . ptr ( ) ) ; }
static bool equals ( OwnPtr < T > const & a , OwnPtr < T > const & b ) { return a . ptr ( ) = = b . ptr ( ) ; }
2025-09-18 13:28:54 -03:00
static constexpr bool may_have_slow_equality_check ( ) { return false ; }
2018-10-26 12:42:12 -03:00
} ;
2024-06-04 08:40:17 -03:00
template < typename T >
struct Formatter < OwnPtr < T > > : Formatter < T * > {
ErrorOr < void > format ( FormatBuilder & builder , OwnPtr < T > const & value )
{
return Formatter < T * > : : format ( builder , value . ptr ( ) ) ;
}
} ;
2025-05-13 08:06:33 -03:00
2018-10-10 06:53:07 -03:00
}
2022-11-26 08:18:30 -03:00
# if USING_AK_GLOBALLY
2021-05-13 00:35:08 -03:00
using AK : : adopt_own_if_nonnull ;
2019-05-28 06:53:16 -03:00
using AK : : OwnPtr ;
2022-11-26 08:18:30 -03:00
# endif