blob: 5b125abcc2303f8f30cfe91d742aa630dec8dffa [file] [log] [blame]
#ifndef _RSGSTATEMENT_HPP
#define _RSGSTATEMENT_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 Statements.
*//*--------------------------------------------------------------------*/
#include "rsgDefs.hpp"
#include "rsgGeneratorState.hpp"
#include "rsgVariableManager.hpp"
#include "rsgExpression.hpp"
#include "rsgToken.hpp"
#include <vector>
namespace rsg
{
class Statement
{
public:
Statement(void);
virtual ~Statement(void);
virtual Statement *createNextChild(GeneratorState &state) = DE_NULL;
virtual void tokenize(GeneratorState &state, TokenStream &str) const = DE_NULL;
virtual void execute(ExecutionContext &execCtx) const = DE_NULL;
protected:
};
// IfStatement
// ForLoopStatement
// WhileStatement
// DoWhileStatement
class ExpressionStatement : public Statement
{
public:
ExpressionStatement(GeneratorState &state);
virtual ~ExpressionStatement(void);
Statement *createNextChild(GeneratorState &state)
{
DE_UNREF(state);
return DE_NULL;
}
void tokenize(GeneratorState &state, TokenStream &str) const;
void execute(ExecutionContext &execCtx) const;
static float getWeight(const GeneratorState &state);
protected:
Expression *m_expression;
};
class DeclarationStatement : public Statement
{
public:
DeclarationStatement(GeneratorState &state, Variable *variable = DE_NULL);
virtual ~DeclarationStatement(void);
Statement *createNextChild(GeneratorState &state)
{
DE_UNREF(state);
return DE_NULL;
}
void tokenize(GeneratorState &state, TokenStream &str) const;
void execute(ExecutionContext &execCtx) const;
static float getWeight(const GeneratorState &state);
protected:
const Variable *m_variable;
Expression *m_expression;
};
class BlockStatement : public Statement
{
public:
BlockStatement(GeneratorState &state);
virtual ~BlockStatement(void);
BlockStatement(void) : m_numChildrenToCreate(0)
{
}
void init(GeneratorState &state);
Statement *createNextChild(GeneratorState &state);
void tokenize(GeneratorState &state, TokenStream &str) const;
void execute(ExecutionContext &execCtx) const;
static float getWeight(const GeneratorState &state);
void addChild(Statement *statement);
private:
VariableScope m_scope;
int m_numChildrenToCreate;
std::vector<Statement *> m_children;
};
class ConditionalStatement : public Statement
{
public:
ConditionalStatement(GeneratorState &state);
virtual ~ConditionalStatement(void);
Statement *createNextChild(GeneratorState &state);
void tokenize(GeneratorState &state, TokenStream &str) const;
void execute(ExecutionContext &execCtx) const;
static float getWeight(const GeneratorState &state);
private:
bool isElseBlockRequired(const GeneratorState &state) const;
Expression *m_condition;
Statement *m_trueStatement;
Statement *m_falseStatement;
ValueScope m_conditionalScope;
};
// \note Used for generating mandatory assignments (shader outputs, function outputs).
// Normally assignment is handled inside ExpressionStatement where generator may
// choose to generate AssignOp expression.
class AssignStatement : public Statement
{
public:
AssignStatement(const Variable *variable, Expression *value);
AssignStatement(GeneratorState &state, const Variable *variable, ConstValueRangeAccess valueRange);
virtual ~AssignStatement(void);
Statement *createNextChild(GeneratorState &state)
{
DE_UNREF(state);
return DE_NULL;
}
void tokenize(GeneratorState &state, TokenStream &str) const;
void execute(ExecutionContext &execCtx) const;
private:
const Variable *m_variable;
Expression *m_valueExpr;
};
} // namespace rsg
#endif // _RSGSTATEMENT_HPP