| #ifndef _RSGTOKEN_HPP |
| #define _RSGTOKEN_HPP |
| /*------------------------------------------------------------------------- |
| * drawElements Quality Program Random Shader Generator |
| * ---------------------------------------------------- |
| * |
| * Copyright 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| *//*! |
| * \file |
| * \brief Token class. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "rsgDefs.hpp" |
| |
| #include <vector> |
| |
| namespace rsg |
| { |
| |
| class Token |
| { |
| public: |
| enum Type |
| { |
| IDENTIFIER, |
| STRUCT, |
| INVARIANT, |
| PRECISION, |
| VOID, |
| BREAK, |
| CONTINUE, |
| DO, |
| WHILE, |
| ELSE, |
| FOR, |
| IF, |
| DISCARD, |
| RETURN, |
| INC_OP, |
| DEC_OP, |
| LEFT_PAREN, |
| RIGHT_PAREN, |
| LEFT_BRACKET, // [ |
| RIGHT_BRACKET, // ] |
| LEFT_BRACE, // { |
| RIGHT_BRACE, // } |
| DOT, |
| COMMA, |
| COLON, |
| SEMICOLON, |
| MINUS, |
| PLUS, |
| MUL, |
| DIV, |
| MOD, |
| QUESTION, |
| BOOL, |
| BVEC2, |
| BVEC3, |
| BVEC4, |
| INT, |
| IVEC2, |
| IVEC3, |
| IVEC4, |
| FLOAT, |
| VEC2, |
| VEC3, |
| VEC4, |
| MAT2, |
| MAT3, |
| MAT4, |
| SAMPLER2D, |
| SAMPLERCUBE, |
| FLOAT_LITERAL, |
| INT_LITERAL, |
| BOOL_LITERAL, |
| EQUAL, |
| MUL_ASSIGN, |
| DIV_ASSIGN, |
| ADD_ASSIGN, |
| SUB_ASSIGN, |
| CMP_LT, |
| CMP_GT, |
| CMP_LE, |
| CMP_GE, |
| CMP_EQ, |
| CMP_NE, |
| LOGICAL_AND, |
| LOGICAL_OR, |
| LOGICAL_NOT, |
| LOGICAL_XOR, |
| ATTRIBUTE, |
| UNIFORM, |
| VARYING, |
| CONST, |
| FLAT, |
| HIGH_PRECISION, |
| MEDIUM_PRECISION, |
| LOW_PRECISION, |
| IN, |
| OUT, |
| INOUT, |
| LAYOUT, |
| LOCATION, |
| |
| // Formatting only |
| INDENT_INC, |
| INDENT_DEC, |
| NEWLINE, |
| |
| TYPE_LAST |
| }; |
| |
| Token (void); |
| Token (Type type); |
| Token (const char* identifier); |
| Token (float value); |
| Token (int value); |
| Token (bool value); |
| Token (const Token& other); |
| |
| ~Token (void); |
| |
| inline bool operator== (Type type) const { return m_type == type; } |
| inline bool operator!= (Type type) const { return m_type != type; } |
| |
| bool operator== (const Token& other) const; |
| bool operator!= (const Token& other) const; |
| |
| Token& operator= (const Token& other); |
| |
| inline Type getType (void) const { return m_type; } |
| |
| const char* getIdentifier (void) const; |
| float getFloat (void) const; |
| int getInt (void) const; |
| bool getBool (void) const; |
| |
| private: |
| Type m_type; |
| union |
| { |
| char* identifier; |
| float floatValue; |
| int intValue; |
| bool boolValue; |
| } m_arg; |
| }; |
| |
| |
| inline Token::Token (void) |
| : m_type(TYPE_LAST) |
| { |
| m_arg.identifier = DE_NULL; |
| } |
| |
| inline Token::Token (Type type) |
| : m_type(type) |
| { |
| DE_ASSERT(type != IDENTIFIER); |
| } |
| |
| inline Token::Token (float value) |
| : m_type(FLOAT_LITERAL) |
| { |
| m_arg.floatValue = value; |
| } |
| |
| inline Token::Token (int value) |
| : m_type(INT_LITERAL) |
| { |
| m_arg.intValue = value; |
| } |
| |
| inline Token::Token (bool value) |
| : m_type(BOOL_LITERAL) |
| { |
| m_arg.boolValue = value; |
| } |
| |
| inline bool Token::operator== (const Token& other) const |
| { |
| return !(*this != other); |
| } |
| |
| inline const char* Token::getIdentifier (void) const |
| { |
| DE_ASSERT(m_type == IDENTIFIER); |
| return m_arg.identifier; |
| } |
| |
| inline float Token::getFloat (void) const |
| { |
| DE_ASSERT(m_type == FLOAT_LITERAL); |
| return m_arg.floatValue; |
| } |
| |
| inline int Token::getInt (void) const |
| { |
| DE_ASSERT(m_type == INT_LITERAL); |
| return m_arg.intValue; |
| } |
| |
| inline bool Token::getBool (void) const |
| { |
| DE_ASSERT(m_type == BOOL_LITERAL); |
| return m_arg.boolValue; |
| } |
| |
| class TokenStream |
| { |
| public: |
| TokenStream (void); |
| ~TokenStream (void); |
| |
| int getSize (void) const { return (int)m_numTokens; } |
| const Token& operator[] (int ndx) const { return m_tokens[ndx]; } |
| |
| TokenStream& operator<< (const Token& token); |
| |
| private: |
| enum |
| { |
| ALLOC_SIZE = 64 |
| }; |
| |
| std::vector<Token> m_tokens; |
| size_t m_numTokens; |
| }; |
| |
| inline TokenStream& TokenStream::operator<< (const Token& token) |
| { |
| if (m_tokens.size() == m_numTokens) |
| m_tokens.resize(m_numTokens+ALLOC_SIZE); |
| |
| m_tokens[m_numTokens] = token; |
| m_numTokens += 1; |
| |
| return *this; |
| } |
| |
| } // rsg |
| |
| #endif // _RSGTOKEN_HPP |