Devirtualize CSSValue.
[WebKit-https.git] / Source / WebCore / css / CSSParserValues.h
1 /*
2  * Copyright (C) 2003 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #ifndef CSSParserValues_h
22 #define CSSParserValues_h
23
24 #include "CSSSelector.h"
25 #include "CSSValueList.h"
26 #include <wtf/text/AtomicString.h>
27
28 namespace WebCore {
29
30 class CSSValue;
31 class QualifiedName;
32
33 struct CSSParserString {
34     UChar* characters;
35     int length;
36
37     void lower();
38
39     operator String() const { return String(characters, length); }
40     operator AtomicString() const { return AtomicString(characters, length); }
41 };
42
43 struct CSSParserFunction;
44
45 struct CSSParserValue {
46     int id;
47     bool isInt;
48     union {
49         double fValue;
50         int iValue;
51         CSSParserString string;
52         CSSParserFunction* function;
53     };
54     enum {
55         Operator = 0x100000,
56         Function = 0x100001,
57         Q_EMS    = 0x100002
58     };
59     int unit;
60
61
62     PassRefPtr<CSSValue> createCSSValue();
63 };
64
65 class CSSParserValueList {
66     WTF_MAKE_FAST_ALLOCATED;
67 public:
68     CSSParserValueList()
69         : m_current(0)
70     {
71     }
72     ~CSSParserValueList();
73
74     void addValue(const CSSParserValue&);
75     void insertValueAt(unsigned, const CSSParserValue&);
76     void deleteValueAt(unsigned);
77     void extend(CSSParserValueList&);
78
79     unsigned size() const { return m_values.size(); }
80     CSSParserValue* current() { return m_current < m_values.size() ? &m_values[m_current] : 0; }
81     CSSParserValue* next() { ++m_current; return current(); }
82     CSSParserValue* previous()
83     {
84         if (!m_current)
85             return 0;
86         --m_current;
87         return current();
88     }
89
90     CSSParserValue* valueAt(unsigned i) { return i < m_values.size() ? &m_values[i] : 0; }
91
92     void clear() { m_values.clear(); }
93
94 private:
95     unsigned m_current;
96     Vector<CSSParserValue, 4> m_values;
97 };
98
99 struct CSSParserFunction {
100     WTF_MAKE_FAST_ALLOCATED;
101 public:
102     CSSParserString name;
103     OwnPtr<CSSParserValueList> args;
104 };
105
106 class CSSParserSelector {
107     WTF_MAKE_FAST_ALLOCATED;
108 public:
109     CSSParserSelector();
110     ~CSSParserSelector();
111
112     PassOwnPtr<CSSSelector> releaseSelector() { return m_selector.release(); }
113
114     void setTag(const QualifiedName& value) { m_selector->setTag(value); }
115     void setValue(const AtomicString& value) { m_selector->setValue(value); }
116     void setAttribute(const QualifiedName& value) { m_selector->setAttribute(value); }
117     void setArgument(const AtomicString& value) { m_selector->setArgument(value); }
118     void setMatch(CSSSelector::Match value) { m_selector->m_match = value; }
119     void setRelation(CSSSelector::Relation value) { m_selector->m_relation = value; }
120     void setForPage() { m_selector->setForPage(); }
121
122     void adoptSelectorVector(Vector<OwnPtr<CSSParserSelector> >& selectorVector);
123
124     CSSSelector::PseudoType pseudoType() const { return m_selector->pseudoType(); }
125     bool isUnknownPseudoElement() const { return m_selector->isUnknownPseudoElement(); }
126     bool isSimple() const { return !m_tagHistory && m_selector->isSimple(); }
127     bool hasShadowDescendant() const;
128
129     CSSParserSelector* tagHistory() const { return m_tagHistory.get(); }
130     void setTagHistory(PassOwnPtr<CSSParserSelector> selector) { m_tagHistory = selector; }
131     void insertTagHistory(CSSSelector::Relation before, PassOwnPtr<CSSParserSelector>, CSSSelector::Relation after);
132     void appendTagHistory(CSSSelector::Relation, PassOwnPtr<CSSParserSelector>);
133
134 private:
135     OwnPtr<CSSSelector> m_selector;
136     OwnPtr<CSSParserSelector> m_tagHistory;
137 };
138
139 inline bool CSSParserSelector::hasShadowDescendant() const
140 {
141     return m_selector->relation() == CSSSelector::ShadowDescendant;
142 }
143
144 }
145
146 #endif