Ver Fonte

AK: Make Formatter for NonnullOwnPtr<T> format the T

This mirrors the behavior of NonnullRefPtr<T>. If you want to format
the pointer address, call .ptr() on it.
Andreas Kling há 1 ano atrás
pai
commit
b256e52586
2 ficheiros alterados com 26 adições e 0 exclusões
  1. 9 0
      AK/NonnullOwnPtr.h
  2. 17 0
      Tests/AK/TestNonnullOwnPtr.cpp

+ 9 - 0
AK/NonnullOwnPtr.h

@@ -196,7 +196,16 @@ inline void swap(NonnullOwnPtr<T>& a, NonnullOwnPtr<U>& b)
     a.swap(b);
 }
 
+template<Formattable T>
+struct Formatter<NonnullOwnPtr<T>> : Formatter<T> {
+    ErrorOr<void> format(FormatBuilder& builder, NonnullOwnPtr<T> const& value)
+    {
+        return Formatter<T>::format(builder, *value);
+    }
+};
+
 template<typename T>
+requires(!HasFormatter<T>)
 struct Formatter<NonnullOwnPtr<T>> : Formatter<T const*> {
     ErrorOr<void> format(FormatBuilder& builder, NonnullOwnPtr<T> const& value)
     {

+ 17 - 0
Tests/AK/TestNonnullOwnPtr.cpp

@@ -9,6 +9,7 @@
 #include <AK/DeprecatedString.h>
 #include <AK/NonnullOwnPtr.h>
 #include <AK/OwnPtr.h>
+#include <AK/String.h>
 
 TEST_CASE(destroy_self_owning_object)
 {
@@ -32,3 +33,19 @@ TEST_CASE(destroy_self_owning_object)
     object_ptr->inner = make<SelfOwning::Inner>(object.release_nonnull());
     object_ptr->inner = nullptr;
 }
+
+struct Foo { };
+
+template<>
+struct AK::Formatter<Foo> : Formatter<StringView> {
+    ErrorOr<void> format(FormatBuilder& builder, Foo const&)
+    {
+        return Formatter<StringView>::format(builder, ":^)"sv);
+    }
+};
+
+TEST_CASE(formatter)
+{
+    auto foo = make<Foo>();
+    EXPECT_EQ(MUST(String::formatted("{}", foo)), ":^)"sv);
+}