Add WTF::move()
[WebKit-https.git] / Source / WebCore / rendering / style / ContentData.h
1 /*
2  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3  *           (C) 2000 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2000 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2003, 2005, 2006, 2007, 2008, 2010 Apple Inc. All rights reserved.
6  * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  *
23  */
24
25 #ifndef ContentData_h
26 #define ContentData_h
27
28 #include "CounterContent.h"
29 #include "StyleImage.h"
30 #include "RenderPtr.h"
31
32 namespace WebCore {
33
34 class Document;
35 class RenderObject;
36 class RenderStyle;
37
38 class ContentData {
39     WTF_MAKE_FAST_ALLOCATED;
40 public:
41     enum Type {
42         CounterDataType,
43         ImageDataType,
44         QuoteDataType,
45         TextDataType
46     };
47     virtual ~ContentData() { }
48
49     Type type() const { return m_type; }
50
51     bool isCounter() const { return type() == CounterDataType; }
52     bool isImage() const { return type() == ImageDataType; }
53     bool isQuote() const { return type() == QuoteDataType; }
54     bool isText() const { return type() == TextDataType; }
55
56     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const = 0;
57
58     std::unique_ptr<ContentData> clone() const;
59
60     ContentData* next() const { return m_next.get(); }
61     void setNext(std::unique_ptr<ContentData> next) { m_next = WTF::move(next); }
62
63     void setAltText(const String& alt) { m_altText = alt; }
64     const String& altText() const { return m_altText; }
65
66 protected:
67     explicit ContentData(Type type)
68         : m_type(type)
69     {
70     }
71
72 private:
73     virtual std::unique_ptr<ContentData> cloneInternal() const = 0;
74
75     std::unique_ptr<ContentData> m_next;
76     String m_altText;
77     Type m_type;
78 };
79
80 #define CONTENT_DATA_TYPE_CASTS(ToClassName, FromClassName, ContentDataName) \
81     TYPE_CASTS_BASE(ToClassName, FromClassName, resource, resource->is##ContentDataName(), resource.is##ContentDataName())
82
83 class ImageContentData final : public ContentData {
84 public:
85     explicit ImageContentData(PassRefPtr<StyleImage> image)
86         : ContentData(ImageDataType)
87         , m_image(image)
88     {
89         ASSERT(m_image);
90     }
91
92     const StyleImage& image() const { return *m_image; }
93     void setImage(PassRefPtr<StyleImage> image)
94     {
95         ASSERT(image);
96         m_image = image;
97     }
98
99     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
100
101 private:
102     virtual std::unique_ptr<ContentData> cloneInternal() const override
103     {
104         return std::make_unique<ImageContentData>(m_image.get());
105     }
106
107     RefPtr<StyleImage> m_image;
108 };
109
110 CONTENT_DATA_TYPE_CASTS(ImageContentData, ContentData, Image)
111
112 inline bool operator==(const ImageContentData& a, const ImageContentData& b)
113 {
114     return a.image() == b.image();
115 }
116
117 inline bool operator!=(const ImageContentData& a, const ImageContentData& b)
118 {
119     return !(a == b);
120 }
121
122 class TextContentData final : public ContentData {
123 public:
124     explicit TextContentData(const String& text)
125         : ContentData(TextDataType)
126         , m_text(text)
127     {
128     }
129
130     const String& text() const { return m_text; }
131     void setText(const String& text) { m_text = text; }
132
133     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
134
135 private:
136     virtual std::unique_ptr<ContentData> cloneInternal() const override { return std::make_unique<TextContentData>(text()); }
137
138     String m_text;
139 };
140
141 CONTENT_DATA_TYPE_CASTS(TextContentData, ContentData, Text)
142
143 inline bool operator==(const TextContentData& a, const TextContentData& b)
144 {
145     return a.text() == b.text();
146 }
147
148 inline bool operator!=(const TextContentData& a, const TextContentData& b)
149 {
150     return !(a == b);
151 }
152
153 class CounterContentData final : public ContentData {
154 public:
155     explicit CounterContentData(std::unique_ptr<CounterContent> counter)
156         : ContentData(CounterDataType)
157         , m_counter(WTF::move(counter))
158     {
159         ASSERT(m_counter);
160     }
161
162     const CounterContent& counter() const { return *m_counter; }
163     void setCounter(std::unique_ptr<CounterContent> counter)
164     {
165         ASSERT(counter);
166         m_counter = WTF::move(counter);
167     }
168
169     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
170
171 private:
172     virtual std::unique_ptr<ContentData> cloneInternal() const override
173     {
174         auto counterData = std::make_unique<CounterContent>(counter());
175         return std::make_unique<CounterContentData>(WTF::move(counterData));
176     }
177
178     std::unique_ptr<CounterContent> m_counter;
179 };
180
181 CONTENT_DATA_TYPE_CASTS(CounterContentData, ContentData, Counter)
182
183 inline bool operator==(const CounterContentData& a, const CounterContentData& b)
184 {
185     return a.counter() == b.counter();
186 }
187
188 inline bool operator!=(const CounterContentData& a, const CounterContentData& b)
189 {
190     return !(a == b);
191 }
192
193 class QuoteContentData final : public ContentData {
194 public:
195     explicit QuoteContentData(QuoteType quote)
196         : ContentData(QuoteDataType)
197         , m_quote(quote)
198     {
199     }
200
201     QuoteType quote() const { return m_quote; }
202     void setQuote(QuoteType quote) { m_quote = quote; }
203
204     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
205
206 private:
207     virtual std::unique_ptr<ContentData> cloneInternal() const override { return std::make_unique<QuoteContentData>(quote()); }
208
209     QuoteType m_quote;
210 };
211
212 CONTENT_DATA_TYPE_CASTS(QuoteContentData, ContentData, Quote)
213
214 inline bool operator==(const QuoteContentData& a, const QuoteContentData& b)
215 {
216     return a.quote() == b.quote();
217 }
218
219 inline bool operator!=(const QuoteContentData& a, const QuoteContentData& b)
220 {
221     return !(a == b);
222 }
223
224 inline bool operator==(const ContentData& a, const ContentData& b)
225 {
226     if (a.type() != b.type())
227         return false;
228
229     switch (a.type()) {
230     case ContentData::CounterDataType:
231         return toCounterContentData(a) == toCounterContentData(b);
232     case ContentData::ImageDataType:
233         return toImageContentData(a) == toImageContentData(b);
234     case ContentData::QuoteDataType:
235         return toQuoteContentData(a) == toQuoteContentData(b);
236     case ContentData::TextDataType:
237         return toTextContentData(a) == toTextContentData(b);
238     }
239
240     ASSERT_NOT_REACHED();
241     return false;
242 }
243
244 inline bool operator!=(const ContentData& a, const ContentData& b)
245 {
246     return !(a == b);
247 }
248
249 } // namespace WebCore
250
251 #endif // ContentData_h