summaryrefslogtreecommitdiff
path: root/Source/WTF/wtf/PrintStream.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WTF/wtf/PrintStream.h')
-rw-r--r--Source/WTF/wtf/PrintStream.h319
1 files changed, 134 insertions, 185 deletions
diff --git a/Source/WTF/wtf/PrintStream.h b/Source/WTF/wtf/PrintStream.h
index 329ad0782..6a8060b1d 100644
--- a/Source/WTF/wtf/PrintStream.h
+++ b/Source/WTF/wtf/PrintStream.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2012, 2014-2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -26,18 +26,23 @@
#ifndef PrintStream_h
#define PrintStream_h
+#include <memory>
#include <stdarg.h>
#include <wtf/FastMalloc.h>
#include <wtf/Noncopyable.h>
-#include <wtf/Platform.h>
+#include <wtf/Optional.h>
#include <wtf/RawPointer.h>
+#include <wtf/RefPtr.h>
#include <wtf/StdLibExtras.h>
namespace WTF {
+class AtomicStringImpl;
class CString;
class String;
class StringImpl;
+class StringView;
+class UniquedStringImpl;
class PrintStream {
WTF_MAKE_FAST_ALLOCATED; WTF_MAKE_NONCOPYABLE(PrintStream);
@@ -46,216 +51,64 @@ public:
virtual ~PrintStream();
WTF_EXPORT_PRIVATE void printf(const char* format, ...) WTF_ATTRIBUTE_PRINTF(2, 3);
+ WTF_EXPORT_PRIVATE void printfVariableFormat(const char* format, ...);
virtual void vprintf(const char* format, va_list) WTF_ATTRIBUTE_PRINTF(2, 0) = 0;
// Typically a no-op for many subclasses of PrintStream, this is a hint that
// the implementation should flush its buffers if it had not done so already.
virtual void flush();
- template<typename T>
- void print(const T& value)
+ template<typename Func>
+ void atomically(const Func& func)
{
- printInternal(*this, value);
- }
-
- template<typename T1, typename T2>
- void print(const T1& value1, const T2& value2)
- {
- print(value1);
- print(value2);
- }
-
- template<typename T1, typename T2, typename T3>
- void print(const T1& value1, const T2& value2, const T3& value3)
- {
- print(value1);
- print(value2);
- print(value3);
- }
-
- template<typename T1, typename T2, typename T3, typename T4>
- void print(const T1& value1, const T2& value2, const T3& value3, const T4& value4)
- {
- print(value1);
- print(value2);
- print(value3);
- print(value4);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5>
- void print(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5)
- {
- print(value1);
- print(value2);
- print(value3);
- print(value4);
- print(value5);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
- void print(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6)
- {
- print(value1);
- print(value2);
- print(value3);
- print(value4);
- print(value5);
- print(value6);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
- void print(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7)
- {
- print(value1);
- print(value2);
- print(value3);
- print(value4);
- print(value5);
- print(value6);
- print(value7);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
- void print(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7, const T8& value8)
- {
- print(value1);
- print(value2);
- print(value3);
- print(value4);
- print(value5);
- print(value6);
- print(value7);
- print(value8);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
- void print(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7, const T8& value8, const T9& value9)
- {
- print(value1);
- print(value2);
- print(value3);
- print(value4);
- print(value5);
- print(value6);
- print(value7);
- print(value8);
- print(value9);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
- void print(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7, const T8& value8, const T9& value9, const T10& value10)
- {
- print(value1);
- print(value2);
- print(value3);
- print(value4);
- print(value5);
- print(value6);
- print(value7);
- print(value8);
- print(value9);
- print(value10);
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
- void print(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7, const T8& value8, const T9& value9, const T10& value10, const T11& value11)
- {
- print(value1);
- print(value2);
- print(value3);
- print(value4);
- print(value5);
- print(value6);
- print(value7);
- print(value8);
- print(value9);
- print(value10);
- print(value11);
+ func(begin());
+ end();
}
- template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
- void print(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7, const T8& value8, const T9& value9, const T10& value10, const T11& value11, const T12& value12)
+ template<typename... Types>
+ void print(const Types&... values)
{
- print(value1);
- print(value2);
- print(value3);
- print(value4);
- print(value5);
- print(value6);
- print(value7);
- print(value8);
- print(value9);
- print(value10);
- print(value11);
- print(value12);
+ atomically(
+ [&] (PrintStream& out) {
+ out.printImpl(values...);
+ });
}
- template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
- void print(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7, const T8& value8, const T9& value9, const T10& value10, const T11& value11, const T12& value12, const T13& value13)
+ template<typename... Types>
+ void println(const Types&... values)
{
- print(value1);
- print(value2);
- print(value3);
- print(value4);
- print(value5);
- print(value6);
- print(value7);
- print(value8);
- print(value9);
- print(value10);
- print(value11);
- print(value12);
- print(value13);
+ print(values..., "\n");
}
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
- void print(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7, const T8& value8, const T9& value9, const T10& value10, const T11& value11, const T12& value12, const T13& value13, const T14& value14)
+
+protected:
+ void printImpl() { }
+
+ template<typename T, typename... Types>
+ void printImpl(const T& value, const Types&... remainingValues)
{
- print(value1);
- print(value2);
- print(value3);
- print(value4);
- print(value5);
- print(value6);
- print(value7);
- print(value8);
- print(value9);
- print(value10);
- print(value11);
- print(value12);
- print(value13);
- print(value14);
+ printInternal(*this, value);
+ printImpl(remainingValues...);
}
- template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
- void print(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7, const T8& value8, const T9& value9, const T10& value10, const T11& value11, const T12& value12, const T13& value13, const T14& value14, const T15& value15)
- {
- print(value1);
- print(value2);
- print(value3);
- print(value4);
- print(value5);
- print(value6);
- print(value7);
- print(value8);
- print(value9);
- print(value10);
- print(value11);
- print(value12);
- print(value13);
- print(value14);
- print(value15);
- }
+ virtual PrintStream& begin();
+ virtual void end();
};
WTF_EXPORT_PRIVATE void printInternal(PrintStream&, const char*);
+WTF_EXPORT_PRIVATE void printInternal(PrintStream&, const StringView&);
WTF_EXPORT_PRIVATE void printInternal(PrintStream&, const CString&);
WTF_EXPORT_PRIVATE void printInternal(PrintStream&, const String&);
WTF_EXPORT_PRIVATE void printInternal(PrintStream&, const StringImpl*);
+inline void printInternal(PrintStream& out, const AtomicStringImpl* value) { printInternal(out, bitwise_cast<const StringImpl*>(value)); }
+inline void printInternal(PrintStream& out, const UniquedStringImpl* value) { printInternal(out, bitwise_cast<const StringImpl*>(value)); }
+inline void printInternal(PrintStream& out, const UniquedStringImpl& value) { printInternal(out, &value); }
inline void printInternal(PrintStream& out, char* value) { printInternal(out, static_cast<const char*>(value)); }
inline void printInternal(PrintStream& out, CString& value) { printInternal(out, static_cast<const CString&>(value)); }
inline void printInternal(PrintStream& out, String& value) { printInternal(out, static_cast<const String&>(value)); }
inline void printInternal(PrintStream& out, StringImpl* value) { printInternal(out, static_cast<const StringImpl*>(value)); }
+inline void printInternal(PrintStream& out, AtomicStringImpl* value) { printInternal(out, static_cast<const AtomicStringImpl*>(value)); }
+inline void printInternal(PrintStream& out, UniquedStringImpl* value) { printInternal(out, static_cast<const UniquedStringImpl*>(value)); }
+inline void printInternal(PrintStream& out, UniquedStringImpl& value) { printInternal(out, &value); }
WTF_EXPORT_PRIVATE void printInternal(PrintStream&, bool);
WTF_EXPORT_PRIVATE void printInternal(PrintStream&, signed char); // NOTE: this prints as a number, not as a character; use CharacterDump if you want the character
WTF_EXPORT_PRIVATE void printInternal(PrintStream&, unsigned char); // NOTE: see above.
@@ -339,6 +192,18 @@ private:
template<typename T>
PointerDump<T> pointerDump(const T* ptr) { return PointerDump<T>(ptr); }
+template<typename T>
+void printInternal(PrintStream& out, const std::unique_ptr<T>& value)
+{
+ out.print(pointerDump(value.get()));
+}
+
+template<typename T>
+void printInternal(PrintStream& out, const RefPtr<T>& value)
+{
+ out.print(pointerDump(value.get()));
+}
+
template<typename T, typename U>
class ValueInContext {
public:
@@ -365,6 +230,34 @@ ValueInContext<T, U> inContext(const T& value, U* context)
}
template<typename T, typename U>
+class PointerDumpInContext {
+public:
+ PointerDumpInContext(const T* ptr, U* context)
+ : m_ptr(ptr)
+ , m_context(context)
+ {
+ }
+
+ void dump(PrintStream& out) const
+ {
+ if (m_ptr)
+ m_ptr->dumpInContext(out, m_context);
+ else
+ out.print("(null)");
+ }
+
+private:
+ const T* m_ptr;
+ U* m_context;
+};
+
+template<typename T, typename U>
+PointerDumpInContext<T, U> pointerDumpInContext(const T* ptr, U* context)
+{
+ return PointerDumpInContext<T, U>(ptr, context);
+}
+
+template<typename T, typename U>
class ValueIgnoringContext {
public:
ValueIgnoringContext(const U& value)
@@ -388,14 +281,70 @@ ValueIgnoringContext<T, U> ignoringContext(const U& value)
return ValueIgnoringContext<T, U>(value);
}
+template<unsigned index, typename... Types>
+struct FormatImplUnpacker {
+ template<typename... Args>
+ static void unpack(PrintStream& out, const std::tuple<Types...>& tuple, const Args&... values);
+};
+
+template<typename... Types>
+struct FormatImplUnpacker<0, Types...> {
+ template<typename... Args>
+ static void unpack(PrintStream& out, const std::tuple<Types...>& tuple, const Args&... values)
+ {
+ out.printfVariableFormat(std::get<0>(tuple), values...);
+ }
+};
+
+template<unsigned index, typename... Types>
+template<typename... Args>
+void FormatImplUnpacker<index, Types...>::unpack(PrintStream& out, const std::tuple<Types...>& tuple, const Args&... values)
+{
+ FormatImplUnpacker<index - 1, Types...>::unpack(out, tuple, std::get<index>(tuple), values...);
+}
+
+template<typename... Types>
+class FormatImpl {
+public:
+ FormatImpl(Types... values)
+ : m_values(values...)
+ {
+ }
+
+ void dump(PrintStream& out) const
+ {
+ FormatImplUnpacker<sizeof...(Types) - 1, Types...>::unpack(out, m_values);
+ }
+
+private:
+ std::tuple<Types...> m_values;
+};
+
+template<typename... Types>
+FormatImpl<Types...> format(Types... values)
+{
+ return FormatImpl<Types...>(values...);
+}
+
+template<typename T>
+void printInternal(PrintStream& out, const std::optional<T>& value)
+{
+ if (value)
+ out.print(*value);
+ else
+ out.print("<nullopt>");
+}
+
} // namespace WTF
using WTF::CharacterDump;
using WTF::PointerDump;
using WTF::PrintStream;
+using WTF::format;
using WTF::ignoringContext;
using WTF::inContext;
using WTF::pointerDump;
+using WTF::pointerDumpInContext;
#endif // PrintStream_h