diff --git a/AK/ByteBuffer.h b/AK/ByteBuffer.h index 3946a194402..5e4122b73e4 100644 --- a/AK/ByteBuffer.h +++ b/AK/ByteBuffer.h @@ -2,8 +2,9 @@ #include "StdLibExtras.h" #include "Types.h" -#include +#include #include +#include #include namespace AK { diff --git a/AK/LogStream.cpp b/AK/LogStream.cpp new file mode 100644 index 00000000000..e732ca71dc5 --- /dev/null +++ b/AK/LogStream.cpp @@ -0,0 +1,34 @@ +#include +#include +#include + +namespace AK { + +inline const LogStream& operator<<(const LogStream& stream, const String& value) +{ + stream.write(value.characters(), value.length()); + return stream; +} + +inline const LogStream& operator<<(const LogStream& stream, const StringView& value) +{ + stream.write(value.characters(), value.length()); + return stream; +} + +const LogStream& operator<<(const LogStream& stream, int value) +{ + return stream << String::number(value); +} + +const LogStream& operator<<(const LogStream& stream, unsigned value) +{ + return stream << String::number(value); +} + +const LogStream& operator<<(const LogStream& stream, const void* value) +{ + return stream << String::format("%p", value); +} + +} diff --git a/AK/LogStream.h b/AK/LogStream.h index 315d133b796..44ee51df091 100644 --- a/AK/LogStream.h +++ b/AK/LogStream.h @@ -1,9 +1,12 @@ #pragma once -#include -#include #include +namespace AK { + +class String; +class StringView; + class LogStream { public: LogStream() {} @@ -35,21 +38,19 @@ inline DebugLogStream dbg() inline const LogStream& operator<<(const LogStream& stream, const char* value) { - stream.write(value, strlen(value)); + int length = 0; + const char* p = value; + while (*(p++)) + ++length; + stream.write(value, length); return stream; } -inline const LogStream& operator<<(const LogStream& stream, const String& value) -{ - stream.write(value.characters(), value.length()); - return stream; -} - -inline const LogStream& operator<<(const LogStream& stream, const StringView& value) -{ - stream.write(value.characters(), value.length()); - return stream; -} +const LogStream& operator<<(const LogStream&, const String&); +const LogStream& operator<<(const LogStream&, const StringView&); +const LogStream& operator<<(const LogStream&, int); +const LogStream& operator<<(const LogStream&, unsigned); +const LogStream& operator<<(const LogStream&, const void*); inline const LogStream& operator<<(const LogStream& stream, char value) { @@ -62,17 +63,7 @@ inline const LogStream& operator<<(const LogStream& stream, bool value) return stream << (value ? "true" : "false"); } -inline const LogStream& operator<<(const LogStream& stream, int value) -{ - return stream << String::number(value); } -inline const LogStream& operator<<(const LogStream& stream, unsigned value) -{ - return stream << String::number(value); -} - -inline const LogStream& operator<<(const LogStream& stream, const void* value) -{ - return stream << String::format("%p", value); -} +using AK::LogStream; +using AK::dbg; diff --git a/AK/NonnullRefPtr.h b/AK/NonnullRefPtr.h index acc919b2b6a..22fee147b4d 100644 --- a/AK/NonnullRefPtr.h +++ b/AK/NonnullRefPtr.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #ifdef __clang__ @@ -239,6 +240,12 @@ inline NonnullRefPtr adopt(T& object) return NonnullRefPtr(NonnullRefPtr::Adopt, object); } +template +inline const LogStream& operator<<(const LogStream& stream, const NonnullRefPtr& value) +{ + return stream << value.ptr(); +} + } using AK::adopt; diff --git a/AK/OwnPtr.h b/AK/OwnPtr.h index c301323553c..a10cc5bdb01 100644 --- a/AK/OwnPtr.h +++ b/AK/OwnPtr.h @@ -1,8 +1,9 @@ #pragma once -#include "StdLibExtras.h" -#include "Traits.h" -#include "Types.h" +#include +#include +#include +#include namespace AK { @@ -115,6 +116,12 @@ struct Traits> : public GenericTraits> { static bool equals(const OwnPtr& a, const OwnPtr& b) { return a.ptr() == b.ptr(); } }; +template +inline const LogStream& operator<<(const LogStream& stream, const OwnPtr& value) +{ + return stream << value.ptr(); +} + } using AK::make; diff --git a/AK/RefPtr.h b/AK/RefPtr.h index 62ad98db690..bf1ddb7c0a1 100644 --- a/AK/RefPtr.h +++ b/AK/RefPtr.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -203,6 +204,12 @@ private: T* m_ptr = nullptr; }; +template +inline const LogStream& operator<<(const LogStream& stream, const RefPtr& value) +{ + return stream << value.ptr(); +} + } using AK::RefPtr; diff --git a/AK/WeakPtr.h b/AK/WeakPtr.h index 7715589ea7f..ea60cd16c51 100644 --- a/AK/WeakPtr.h +++ b/AK/WeakPtr.h @@ -1,6 +1,7 @@ #pragma once -#include "Weakable.h" +#include +#include namespace AK { @@ -66,6 +67,12 @@ inline WeakPtr Weakable::make_weak_ptr() return WeakPtr(m_link.copy_ref()); } +template +inline const LogStream& operator<<(const LogStream& stream, const WeakPtr& value) +{ + return stream << value.ptr(); +} + } using AK::WeakPtr; diff --git a/Kernel/Makefile b/Kernel/Makefile index 74d5dbc623a..f4923e2b12f 100644 --- a/Kernel/Makefile +++ b/Kernel/Makefile @@ -88,6 +88,7 @@ AK_OBJS = \ ../AK/JsonValue.o \ ../AK/JsonArray.o \ ../AK/JsonParser.o \ + ../AK/LogStream.o \ ../AK/ELF/ELFImage.o \ ../AK/ELF/ELFLoader.o diff --git a/LibC/Makefile b/LibC/Makefile index 83b9e1944d7..5fc70cea900 100644 --- a/LibC/Makefile +++ b/LibC/Makefile @@ -11,6 +11,7 @@ AK_OBJS = \ ../AK/JsonArray.o \ ../AK/JsonObject.o \ ../AK/JsonParser.o \ + ../AK/LogStream.o \ ../AK/MappedFile.o LIBC_OBJS = \