diff --git a/AK/RefPtr.h b/AK/RefPtr.h index 687641836a4..5a4ddd1fd64 100644 --- a/AK/RefPtr.h +++ b/AK/RefPtr.h @@ -475,7 +475,16 @@ inline void swap(RefPtr& a, RefPtr& b) a.swap(b); } +template +inline RefPtr adopt_ref_if_nonnull(T* object) +{ + if (object) + return RefPtr(RefPtr::Adopt, *object); + return {}; } +} + +using AK::adopt_ref_if_nonnull; using AK::RefPtr; using AK::static_ptr_cast; diff --git a/Tests/AK/TestRefPtr.cpp b/Tests/AK/TestRefPtr.cpp index 8c85ace7741..26615ffba96 100644 --- a/Tests/AK/TestRefPtr.cpp +++ b/Tests/AK/TestRefPtr.cpp @@ -147,3 +147,14 @@ TEST_CASE(self_observers) object->unref(); EXPECT_EQ(SelfAwareObject::num_destroyed, 1u); } + +TEST_CASE(adopt_ref_if_nonnull) +{ + RefPtr object = adopt_ref_if_nonnull(new SelfAwareObject); + EXPECT_EQ(object.is_null(), false); + EXPECT_EQ(object->ref_count(), 1u); + + SelfAwareObject* null_object = nullptr; + RefPtr failed_allocation = adopt_ref_if_nonnull(null_object); + EXPECT_EQ(failed_allocation.is_null(), true); +}