87eecb3a313f042e5f0a52b918626feb1be99ccf
[WebKit-https.git] / Source / WebCore / platform / text / TextStream.h
1 /*
2  * Copyright (C) 2004, 2008 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef TextStream_h
27 #define TextStream_h
28
29 #include <wtf/Forward.h>
30 #include <wtf/text/StringBuilder.h>
31
32 namespace WebCore {
33
34 class LayoutUnit;
35
36 class TextStream {
37 public:
38     struct FormatNumberRespectingIntegers {
39         FormatNumberRespectingIntegers(double number) : value(number) { }
40         double value;
41     };
42     
43     enum class LineMode { SingleLine, MultipleLine };
44     TextStream(LineMode lineMode = LineMode::MultipleLine)
45         : m_multiLineMode(lineMode == LineMode::MultipleLine)
46     {
47     }
48
49     WEBCORE_EXPORT TextStream& operator<<(bool);
50     WEBCORE_EXPORT TextStream& operator<<(int);
51     WEBCORE_EXPORT TextStream& operator<<(unsigned);
52     WEBCORE_EXPORT TextStream& operator<<(long);
53     WEBCORE_EXPORT TextStream& operator<<(unsigned long);
54     WEBCORE_EXPORT TextStream& operator<<(long long);
55     WEBCORE_EXPORT TextStream& operator<<(LayoutUnit);
56
57     WEBCORE_EXPORT TextStream& operator<<(unsigned long long);
58     WEBCORE_EXPORT TextStream& operator<<(float);
59     WEBCORE_EXPORT TextStream& operator<<(double);
60     WEBCORE_EXPORT TextStream& operator<<(const char*);
61     WEBCORE_EXPORT TextStream& operator<<(const void*);
62     WEBCORE_EXPORT TextStream& operator<<(const String&);
63     WEBCORE_EXPORT TextStream& operator<<(const FormatNumberRespectingIntegers&);
64
65     template<typename T>
66     void dumpProperty(const String& name, const T& value)
67     {
68         TextStream& ts = *this;
69         ts.startGroup();
70         ts << name << " " << value;
71         ts.endGroup();
72     }
73
74     WEBCORE_EXPORT String release();
75     
76     WEBCORE_EXPORT void startGroup();
77     WEBCORE_EXPORT void endGroup();
78     WEBCORE_EXPORT void nextLine(); // Output newline and indent.
79
80     WEBCORE_EXPORT void increaseIndent() { ++m_indent; }
81     WEBCORE_EXPORT void decreaseIndent() { --m_indent; ASSERT(m_indent >= 0); }
82
83     WEBCORE_EXPORT void writeIndent();
84
85     class GroupScope {
86     public:
87         GroupScope(TextStream& ts)
88             : m_stream(ts)
89         {
90             m_stream.startGroup();
91         }
92         ~GroupScope()
93         {
94             m_stream.endGroup();
95         }
96
97     private:
98         TextStream& m_stream;
99     };
100
101 private:
102     StringBuilder m_text;
103     int m_indent { 0 };
104     bool m_multiLineMode { true };
105 };
106
107 template<typename Item>
108 TextStream& operator<<(TextStream& ts, const Vector<Item>& vector)
109 {
110     ts << "[";
111
112     unsigned size = vector.size();
113     for (unsigned i = 0; i < size; ++i) {
114         ts << vector[i];
115         if (i < size - 1)
116             ts << ", ";
117     }
118
119     return ts << "]";
120 }
121
122 void writeIndent(TextStream&, int indent);
123
124 }
125
126 #endif