diff options
Diffstat (limited to 'Source/WTF/wtf/PrintStream.h')
-rw-r--r-- | Source/WTF/wtf/PrintStream.h | 319 |
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 |