1e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * drawElements Quality Program Random Shader Generator
3e5c31af7Sopenharmony_ci * ----------------------------------------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright 2014 The Android Open Source Project
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
10e5c31af7Sopenharmony_ci *
11e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
17e5c31af7Sopenharmony_ci * limitations under the License.
18e5c31af7Sopenharmony_ci *
19e5c31af7Sopenharmony_ci *//*!
20e5c31af7Sopenharmony_ci * \file
21e5c31af7Sopenharmony_ci * \brief Expression generator.
22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci#include "rsgExpressionGenerator.hpp"
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_cinamespace rsg
27e5c31af7Sopenharmony_ci{
28e5c31af7Sopenharmony_ci
29e5c31af7Sopenharmony_ciExpressionGenerator::ExpressionGenerator (GeneratorState& state)
30e5c31af7Sopenharmony_ci	: m_state(state)
31e5c31af7Sopenharmony_ci{
32e5c31af7Sopenharmony_ci}
33e5c31af7Sopenharmony_ci
34e5c31af7Sopenharmony_ciExpressionGenerator::~ExpressionGenerator (void)
35e5c31af7Sopenharmony_ci{
36e5c31af7Sopenharmony_ci}
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_ciExpression* ExpressionGenerator::generate (const ValueRange& valueRange, int initialDepth)
39e5c31af7Sopenharmony_ci{
40e5c31af7Sopenharmony_ci	// Create root
41e5c31af7Sopenharmony_ci	m_state.setExpressionDepth(initialDepth);
42e5c31af7Sopenharmony_ci	Expression* root = Expression::createRandom(m_state, valueRange);
43e5c31af7Sopenharmony_ci
44e5c31af7Sopenharmony_ci	try
45e5c31af7Sopenharmony_ci	{
46e5c31af7Sopenharmony_ci		// Generate full expression
47e5c31af7Sopenharmony_ci		generate(root);
48e5c31af7Sopenharmony_ci	}
49e5c31af7Sopenharmony_ci	catch (const std::exception&)
50e5c31af7Sopenharmony_ci	{
51e5c31af7Sopenharmony_ci		delete root;
52e5c31af7Sopenharmony_ci		m_expressionStack.clear();
53e5c31af7Sopenharmony_ci		throw;
54e5c31af7Sopenharmony_ci	}
55e5c31af7Sopenharmony_ci
56e5c31af7Sopenharmony_ci	return root;
57e5c31af7Sopenharmony_ci}
58e5c31af7Sopenharmony_ci
59e5c31af7Sopenharmony_civoid ExpressionGenerator::generate (Expression* root)
60e5c31af7Sopenharmony_ci{
61e5c31af7Sopenharmony_ci	DE_ASSERT(m_expressionStack.empty());
62e5c31af7Sopenharmony_ci
63e5c31af7Sopenharmony_ci	// Initialize stack
64e5c31af7Sopenharmony_ci	m_expressionStack.push_back(root);
65e5c31af7Sopenharmony_ci	m_state.setExpressionDepth(m_state.getExpressionDepth()+1);
66e5c31af7Sopenharmony_ci
67e5c31af7Sopenharmony_ci	// Process until done
68e5c31af7Sopenharmony_ci	while (!m_expressionStack.empty())
69e5c31af7Sopenharmony_ci	{
70e5c31af7Sopenharmony_ci		DE_ASSERT(m_state.getExpressionDepth() <= m_state.getShaderParameters().maxExpressionDepth);
71e5c31af7Sopenharmony_ci
72e5c31af7Sopenharmony_ci		Expression* curExpr = m_expressionStack[m_expressionStack.size()-1];
73e5c31af7Sopenharmony_ci		Expression*	child	= curExpr->createNextChild(m_state);
74e5c31af7Sopenharmony_ci
75e5c31af7Sopenharmony_ci		if (child)
76e5c31af7Sopenharmony_ci		{
77e5c31af7Sopenharmony_ci			m_expressionStack.push_back(child);
78e5c31af7Sopenharmony_ci			m_state.setExpressionDepth(m_state.getExpressionDepth()+1);
79e5c31af7Sopenharmony_ci		}
80e5c31af7Sopenharmony_ci		else
81e5c31af7Sopenharmony_ci		{
82e5c31af7Sopenharmony_ci			m_expressionStack.pop_back();
83e5c31af7Sopenharmony_ci			m_state.setExpressionDepth(m_state.getExpressionDepth()-1);
84e5c31af7Sopenharmony_ci		}
85e5c31af7Sopenharmony_ci	}
86e5c31af7Sopenharmony_ci}
87e5c31af7Sopenharmony_ci
88e5c31af7Sopenharmony_ci} // rsg
89