1*35238bceSAndroid Build Coastguard Worker #ifndef _RSGTOKEN_HPP
2*35238bceSAndroid Build Coastguard Worker #define _RSGTOKEN_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Random Shader Generator
5*35238bceSAndroid Build Coastguard Worker * ----------------------------------------------------
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker *
9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker *
15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker *
21*35238bceSAndroid Build Coastguard Worker *//*!
22*35238bceSAndroid Build Coastguard Worker * \file
23*35238bceSAndroid Build Coastguard Worker * \brief Token class.
24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker #include "rsgDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker
28*35238bceSAndroid Build Coastguard Worker #include <vector>
29*35238bceSAndroid Build Coastguard Worker
30*35238bceSAndroid Build Coastguard Worker namespace rsg
31*35238bceSAndroid Build Coastguard Worker {
32*35238bceSAndroid Build Coastguard Worker
33*35238bceSAndroid Build Coastguard Worker class Token
34*35238bceSAndroid Build Coastguard Worker {
35*35238bceSAndroid Build Coastguard Worker public:
36*35238bceSAndroid Build Coastguard Worker enum Type
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker IDENTIFIER,
39*35238bceSAndroid Build Coastguard Worker STRUCT,
40*35238bceSAndroid Build Coastguard Worker INVARIANT,
41*35238bceSAndroid Build Coastguard Worker PRECISION,
42*35238bceSAndroid Build Coastguard Worker VOID,
43*35238bceSAndroid Build Coastguard Worker BREAK,
44*35238bceSAndroid Build Coastguard Worker CONTINUE,
45*35238bceSAndroid Build Coastguard Worker DO,
46*35238bceSAndroid Build Coastguard Worker WHILE,
47*35238bceSAndroid Build Coastguard Worker ELSE,
48*35238bceSAndroid Build Coastguard Worker FOR,
49*35238bceSAndroid Build Coastguard Worker IF,
50*35238bceSAndroid Build Coastguard Worker DISCARD,
51*35238bceSAndroid Build Coastguard Worker RETURN,
52*35238bceSAndroid Build Coastguard Worker INC_OP,
53*35238bceSAndroid Build Coastguard Worker DEC_OP,
54*35238bceSAndroid Build Coastguard Worker LEFT_PAREN,
55*35238bceSAndroid Build Coastguard Worker RIGHT_PAREN,
56*35238bceSAndroid Build Coastguard Worker LEFT_BRACKET, // [
57*35238bceSAndroid Build Coastguard Worker RIGHT_BRACKET, // ]
58*35238bceSAndroid Build Coastguard Worker LEFT_BRACE, // {
59*35238bceSAndroid Build Coastguard Worker RIGHT_BRACE, // }
60*35238bceSAndroid Build Coastguard Worker DOT,
61*35238bceSAndroid Build Coastguard Worker COMMA,
62*35238bceSAndroid Build Coastguard Worker COLON,
63*35238bceSAndroid Build Coastguard Worker SEMICOLON,
64*35238bceSAndroid Build Coastguard Worker MINUS,
65*35238bceSAndroid Build Coastguard Worker PLUS,
66*35238bceSAndroid Build Coastguard Worker MUL,
67*35238bceSAndroid Build Coastguard Worker DIV,
68*35238bceSAndroid Build Coastguard Worker MOD,
69*35238bceSAndroid Build Coastguard Worker QUESTION,
70*35238bceSAndroid Build Coastguard Worker BOOL,
71*35238bceSAndroid Build Coastguard Worker BVEC2,
72*35238bceSAndroid Build Coastguard Worker BVEC3,
73*35238bceSAndroid Build Coastguard Worker BVEC4,
74*35238bceSAndroid Build Coastguard Worker INT,
75*35238bceSAndroid Build Coastguard Worker IVEC2,
76*35238bceSAndroid Build Coastguard Worker IVEC3,
77*35238bceSAndroid Build Coastguard Worker IVEC4,
78*35238bceSAndroid Build Coastguard Worker FLOAT,
79*35238bceSAndroid Build Coastguard Worker VEC2,
80*35238bceSAndroid Build Coastguard Worker VEC3,
81*35238bceSAndroid Build Coastguard Worker VEC4,
82*35238bceSAndroid Build Coastguard Worker MAT2,
83*35238bceSAndroid Build Coastguard Worker MAT3,
84*35238bceSAndroid Build Coastguard Worker MAT4,
85*35238bceSAndroid Build Coastguard Worker SAMPLER2D,
86*35238bceSAndroid Build Coastguard Worker SAMPLERCUBE,
87*35238bceSAndroid Build Coastguard Worker FLOAT_LITERAL,
88*35238bceSAndroid Build Coastguard Worker INT_LITERAL,
89*35238bceSAndroid Build Coastguard Worker BOOL_LITERAL,
90*35238bceSAndroid Build Coastguard Worker EQUAL,
91*35238bceSAndroid Build Coastguard Worker MUL_ASSIGN,
92*35238bceSAndroid Build Coastguard Worker DIV_ASSIGN,
93*35238bceSAndroid Build Coastguard Worker ADD_ASSIGN,
94*35238bceSAndroid Build Coastguard Worker SUB_ASSIGN,
95*35238bceSAndroid Build Coastguard Worker CMP_LT,
96*35238bceSAndroid Build Coastguard Worker CMP_GT,
97*35238bceSAndroid Build Coastguard Worker CMP_LE,
98*35238bceSAndroid Build Coastguard Worker CMP_GE,
99*35238bceSAndroid Build Coastguard Worker CMP_EQ,
100*35238bceSAndroid Build Coastguard Worker CMP_NE,
101*35238bceSAndroid Build Coastguard Worker LOGICAL_AND,
102*35238bceSAndroid Build Coastguard Worker LOGICAL_OR,
103*35238bceSAndroid Build Coastguard Worker LOGICAL_NOT,
104*35238bceSAndroid Build Coastguard Worker LOGICAL_XOR,
105*35238bceSAndroid Build Coastguard Worker ATTRIBUTE,
106*35238bceSAndroid Build Coastguard Worker UNIFORM,
107*35238bceSAndroid Build Coastguard Worker VARYING,
108*35238bceSAndroid Build Coastguard Worker CONST,
109*35238bceSAndroid Build Coastguard Worker FLAT,
110*35238bceSAndroid Build Coastguard Worker HIGH_PRECISION,
111*35238bceSAndroid Build Coastguard Worker MEDIUM_PRECISION,
112*35238bceSAndroid Build Coastguard Worker LOW_PRECISION,
113*35238bceSAndroid Build Coastguard Worker IN,
114*35238bceSAndroid Build Coastguard Worker OUT,
115*35238bceSAndroid Build Coastguard Worker INOUT,
116*35238bceSAndroid Build Coastguard Worker LAYOUT,
117*35238bceSAndroid Build Coastguard Worker LOCATION,
118*35238bceSAndroid Build Coastguard Worker
119*35238bceSAndroid Build Coastguard Worker // Formatting only
120*35238bceSAndroid Build Coastguard Worker INDENT_INC,
121*35238bceSAndroid Build Coastguard Worker INDENT_DEC,
122*35238bceSAndroid Build Coastguard Worker NEWLINE,
123*35238bceSAndroid Build Coastguard Worker
124*35238bceSAndroid Build Coastguard Worker TYPE_LAST
125*35238bceSAndroid Build Coastguard Worker };
126*35238bceSAndroid Build Coastguard Worker
127*35238bceSAndroid Build Coastguard Worker Token(void);
128*35238bceSAndroid Build Coastguard Worker Token(Type type);
129*35238bceSAndroid Build Coastguard Worker Token(const char *identifier);
130*35238bceSAndroid Build Coastguard Worker Token(float value);
131*35238bceSAndroid Build Coastguard Worker Token(int value);
132*35238bceSAndroid Build Coastguard Worker Token(bool value);
133*35238bceSAndroid Build Coastguard Worker Token(const Token &other);
134*35238bceSAndroid Build Coastguard Worker
135*35238bceSAndroid Build Coastguard Worker ~Token(void);
136*35238bceSAndroid Build Coastguard Worker
operator ==(Type type) const137*35238bceSAndroid Build Coastguard Worker inline bool operator==(Type type) const
138*35238bceSAndroid Build Coastguard Worker {
139*35238bceSAndroid Build Coastguard Worker return m_type == type;
140*35238bceSAndroid Build Coastguard Worker }
operator !=(Type type) const141*35238bceSAndroid Build Coastguard Worker inline bool operator!=(Type type) const
142*35238bceSAndroid Build Coastguard Worker {
143*35238bceSAndroid Build Coastguard Worker return m_type != type;
144*35238bceSAndroid Build Coastguard Worker }
145*35238bceSAndroid Build Coastguard Worker
146*35238bceSAndroid Build Coastguard Worker bool operator==(const Token &other) const;
147*35238bceSAndroid Build Coastguard Worker bool operator!=(const Token &other) const;
148*35238bceSAndroid Build Coastguard Worker
149*35238bceSAndroid Build Coastguard Worker Token &operator=(const Token &other);
150*35238bceSAndroid Build Coastguard Worker
getType(void) const151*35238bceSAndroid Build Coastguard Worker inline Type getType(void) const
152*35238bceSAndroid Build Coastguard Worker {
153*35238bceSAndroid Build Coastguard Worker return m_type;
154*35238bceSAndroid Build Coastguard Worker }
155*35238bceSAndroid Build Coastguard Worker
156*35238bceSAndroid Build Coastguard Worker const char *getIdentifier(void) const;
157*35238bceSAndroid Build Coastguard Worker float getFloat(void) const;
158*35238bceSAndroid Build Coastguard Worker int getInt(void) const;
159*35238bceSAndroid Build Coastguard Worker bool getBool(void) const;
160*35238bceSAndroid Build Coastguard Worker
161*35238bceSAndroid Build Coastguard Worker private:
162*35238bceSAndroid Build Coastguard Worker Type m_type;
163*35238bceSAndroid Build Coastguard Worker union
164*35238bceSAndroid Build Coastguard Worker {
165*35238bceSAndroid Build Coastguard Worker char *identifier;
166*35238bceSAndroid Build Coastguard Worker float floatValue;
167*35238bceSAndroid Build Coastguard Worker int intValue;
168*35238bceSAndroid Build Coastguard Worker bool boolValue;
169*35238bceSAndroid Build Coastguard Worker } m_arg;
170*35238bceSAndroid Build Coastguard Worker };
171*35238bceSAndroid Build Coastguard Worker
Token(void)172*35238bceSAndroid Build Coastguard Worker inline Token::Token(void) : m_type(TYPE_LAST)
173*35238bceSAndroid Build Coastguard Worker {
174*35238bceSAndroid Build Coastguard Worker m_arg.identifier = DE_NULL;
175*35238bceSAndroid Build Coastguard Worker }
176*35238bceSAndroid Build Coastguard Worker
Token(Type type)177*35238bceSAndroid Build Coastguard Worker inline Token::Token(Type type) : m_type(type)
178*35238bceSAndroid Build Coastguard Worker {
179*35238bceSAndroid Build Coastguard Worker DE_ASSERT(type != IDENTIFIER);
180*35238bceSAndroid Build Coastguard Worker }
181*35238bceSAndroid Build Coastguard Worker
Token(float value)182*35238bceSAndroid Build Coastguard Worker inline Token::Token(float value) : m_type(FLOAT_LITERAL)
183*35238bceSAndroid Build Coastguard Worker {
184*35238bceSAndroid Build Coastguard Worker m_arg.floatValue = value;
185*35238bceSAndroid Build Coastguard Worker }
186*35238bceSAndroid Build Coastguard Worker
Token(int value)187*35238bceSAndroid Build Coastguard Worker inline Token::Token(int value) : m_type(INT_LITERAL)
188*35238bceSAndroid Build Coastguard Worker {
189*35238bceSAndroid Build Coastguard Worker m_arg.intValue = value;
190*35238bceSAndroid Build Coastguard Worker }
191*35238bceSAndroid Build Coastguard Worker
Token(bool value)192*35238bceSAndroid Build Coastguard Worker inline Token::Token(bool value) : m_type(BOOL_LITERAL)
193*35238bceSAndroid Build Coastguard Worker {
194*35238bceSAndroid Build Coastguard Worker m_arg.boolValue = value;
195*35238bceSAndroid Build Coastguard Worker }
196*35238bceSAndroid Build Coastguard Worker
operator ==(const Token & other) const197*35238bceSAndroid Build Coastguard Worker inline bool Token::operator==(const Token &other) const
198*35238bceSAndroid Build Coastguard Worker {
199*35238bceSAndroid Build Coastguard Worker return !(*this != other);
200*35238bceSAndroid Build Coastguard Worker }
201*35238bceSAndroid Build Coastguard Worker
getIdentifier(void) const202*35238bceSAndroid Build Coastguard Worker inline const char *Token::getIdentifier(void) const
203*35238bceSAndroid Build Coastguard Worker {
204*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_type == IDENTIFIER);
205*35238bceSAndroid Build Coastguard Worker return m_arg.identifier;
206*35238bceSAndroid Build Coastguard Worker }
207*35238bceSAndroid Build Coastguard Worker
getFloat(void) const208*35238bceSAndroid Build Coastguard Worker inline float Token::getFloat(void) const
209*35238bceSAndroid Build Coastguard Worker {
210*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_type == FLOAT_LITERAL);
211*35238bceSAndroid Build Coastguard Worker return m_arg.floatValue;
212*35238bceSAndroid Build Coastguard Worker }
213*35238bceSAndroid Build Coastguard Worker
getInt(void) const214*35238bceSAndroid Build Coastguard Worker inline int Token::getInt(void) const
215*35238bceSAndroid Build Coastguard Worker {
216*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_type == INT_LITERAL);
217*35238bceSAndroid Build Coastguard Worker return m_arg.intValue;
218*35238bceSAndroid Build Coastguard Worker }
219*35238bceSAndroid Build Coastguard Worker
getBool(void) const220*35238bceSAndroid Build Coastguard Worker inline bool Token::getBool(void) const
221*35238bceSAndroid Build Coastguard Worker {
222*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_type == BOOL_LITERAL);
223*35238bceSAndroid Build Coastguard Worker return m_arg.boolValue;
224*35238bceSAndroid Build Coastguard Worker }
225*35238bceSAndroid Build Coastguard Worker
226*35238bceSAndroid Build Coastguard Worker class TokenStream
227*35238bceSAndroid Build Coastguard Worker {
228*35238bceSAndroid Build Coastguard Worker public:
229*35238bceSAndroid Build Coastguard Worker TokenStream(void);
230*35238bceSAndroid Build Coastguard Worker ~TokenStream(void);
231*35238bceSAndroid Build Coastguard Worker
getSize(void) const232*35238bceSAndroid Build Coastguard Worker int getSize(void) const
233*35238bceSAndroid Build Coastguard Worker {
234*35238bceSAndroid Build Coastguard Worker return (int)m_numTokens;
235*35238bceSAndroid Build Coastguard Worker }
operator [](int ndx) const236*35238bceSAndroid Build Coastguard Worker const Token &operator[](int ndx) const
237*35238bceSAndroid Build Coastguard Worker {
238*35238bceSAndroid Build Coastguard Worker return m_tokens[ndx];
239*35238bceSAndroid Build Coastguard Worker }
240*35238bceSAndroid Build Coastguard Worker
241*35238bceSAndroid Build Coastguard Worker TokenStream &operator<<(const Token &token);
242*35238bceSAndroid Build Coastguard Worker
243*35238bceSAndroid Build Coastguard Worker private:
244*35238bceSAndroid Build Coastguard Worker enum
245*35238bceSAndroid Build Coastguard Worker {
246*35238bceSAndroid Build Coastguard Worker ALLOC_SIZE = 64
247*35238bceSAndroid Build Coastguard Worker };
248*35238bceSAndroid Build Coastguard Worker
249*35238bceSAndroid Build Coastguard Worker std::vector<Token> m_tokens;
250*35238bceSAndroid Build Coastguard Worker size_t m_numTokens;
251*35238bceSAndroid Build Coastguard Worker };
252*35238bceSAndroid Build Coastguard Worker
operator <<(const Token & token)253*35238bceSAndroid Build Coastguard Worker inline TokenStream &TokenStream::operator<<(const Token &token)
254*35238bceSAndroid Build Coastguard Worker {
255*35238bceSAndroid Build Coastguard Worker if (m_tokens.size() == m_numTokens)
256*35238bceSAndroid Build Coastguard Worker m_tokens.resize(m_numTokens + ALLOC_SIZE);
257*35238bceSAndroid Build Coastguard Worker
258*35238bceSAndroid Build Coastguard Worker m_tokens[m_numTokens] = token;
259*35238bceSAndroid Build Coastguard Worker m_numTokens += 1;
260*35238bceSAndroid Build Coastguard Worker
261*35238bceSAndroid Build Coastguard Worker return *this;
262*35238bceSAndroid Build Coastguard Worker }
263*35238bceSAndroid Build Coastguard Worker
264*35238bceSAndroid Build Coastguard Worker } // namespace rsg
265*35238bceSAndroid Build Coastguard Worker
266*35238bceSAndroid Build Coastguard Worker #endif // _RSGTOKEN_HPP
267