#pragma once
#include <wtf/Forward.h>
#include <wtf/text/StringBuilder.h>
namespace WTF {
class TextStream {
public:
struct FormatNumberRespectingIntegers {
FormatNumberRespectingIntegers(double number)
: value(number) { }
double value;
};
enum Formatting {
SVGStyleRect = 1 << 0, NumberRespectingIntegers = 1 << 1,
LayoutUnitsAsIntegers = 1 << 2,
};
using FormattingFlags = unsigned;
enum class LineMode { SingleLine, MultipleLine };
TextStream(LineMode lineMode = LineMode::MultipleLine, FormattingFlags formattingFlags = 0)
: m_formattingFlags(formattingFlags)
, m_multiLineMode(lineMode == LineMode::MultipleLine)
{
}
WTF_EXPORT_PRIVATE TextStream& operator<<(bool);
WTF_EXPORT_PRIVATE TextStream& operator<<(int);
WTF_EXPORT_PRIVATE TextStream& operator<<(unsigned);
WTF_EXPORT_PRIVATE TextStream& operator<<(long);
WTF_EXPORT_PRIVATE TextStream& operator<<(unsigned long);
WTF_EXPORT_PRIVATE TextStream& operator<<(long long);
WTF_EXPORT_PRIVATE TextStream& operator<<(unsigned long long);
WTF_EXPORT_PRIVATE TextStream& operator<<(float);
WTF_EXPORT_PRIVATE TextStream& operator<<(double);
WTF_EXPORT_PRIVATE TextStream& operator<<(const char*);
WTF_EXPORT_PRIVATE TextStream& operator<<(const void*);
WTF_EXPORT_PRIVATE TextStream& operator<<(const String&);
WTF_EXPORT_PRIVATE TextStream& operator<<(const FormatNumberRespectingIntegers&);
FormattingFlags formattingFlags() const { return m_formattingFlags; }
void setFormattingFlags(FormattingFlags flags) { m_formattingFlags = flags; }
bool hasFormattingFlag(Formatting flag) const { return m_formattingFlags & flag; }
template<typename T>
void dumpProperty(const String& name, const T& value)
{
TextStream& ts = *this;
ts.startGroup();
ts << name << " " << value;
ts.endGroup();
}
WTF_EXPORT_PRIVATE String release();
WTF_EXPORT_PRIVATE void startGroup();
WTF_EXPORT_PRIVATE void endGroup();
WTF_EXPORT_PRIVATE void nextLine();
int indent() const { return m_indent; }
void increaseIndent(int amount = 1) { m_indent += amount; }
void decreaseIndent(int amount = 1) { m_indent -= amount; ASSERT(m_indent >= 0); }
WTF_EXPORT_PRIVATE void writeIndent();
TextStream& operator<<(TextStream& (*func)(TextStream&))
{
return (*func)(*this);
}
class IndentScope {
public:
IndentScope(TextStream& ts, int amount = 1)
: m_stream(ts)
, m_amount(amount)
{
m_stream.increaseIndent(m_amount);
}
~IndentScope()
{
m_stream.decreaseIndent(m_amount);
}
private:
TextStream& m_stream;
int m_amount;
};
class GroupScope {
public:
GroupScope(TextStream& ts)
: m_stream(ts)
{
m_stream.startGroup();
}
~GroupScope()
{
m_stream.endGroup();
}
private:
TextStream& m_stream;
};
private:
StringBuilder m_text;
FormattingFlags m_formattingFlags { 0 };
int m_indent { 0 };
bool m_multiLineMode { true };
};
inline TextStream& indent(TextStream& ts)
{
ts.writeIndent();
return ts;
}
template<typename Item>
TextStream& operator<<(TextStream& ts, const Vector<Item>& vector)
{
ts << "[";
unsigned size = vector.size();
for (unsigned i = 0; i < size; ++i) {
ts << vector[i];
if (i < size - 1)
ts << ", ";
}
return ts << "]";
}
WTF_EXPORT_PRIVATE void writeIndent(TextStream&, int indent);
}
using WTF::TextStream;
using WTF::indent;