xref: /aosp_15_r20/external/deqp/framework/randomshaders/rsgToken.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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