blob: d2d7310c2c1549c2b8a594c3ffbbbbacbdf681e4 [file] [log] [blame] [edit]
#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;
}
} // namespace rsg
#endif // _RSGTOKEN_HPP