File: VectorConstructorExpression.cpp

package info (click to toggle)
freespace2 24.2.0%2Brepack-3
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 43,740 kB
  • sloc: cpp: 595,005; ansic: 21,741; python: 1,174; sh: 457; makefile: 243; xml: 181
file content (87 lines) | stat: -rw-r--r-- 2,974 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87

#include "VectorConstructorExpression.h"

#include "actions/expression/TypeDefinition.h"

namespace actions {
namespace expression {
namespace nodes {

VectorConstructorExpression::VectorConstructorExpression(antlr4::Token* token,
	std::shared_ptr<AbstractExpression> xExpression,
	std::shared_ptr<AbstractExpression> yExpression,
	std::shared_ptr<AbstractExpression> zExpression)
	: AbstractExpression(token), m_xExpression(std::move(xExpression)), m_yExpression(std::move(yExpression)),
	  m_zExpression(std::move(zExpression))
{
}
VectorConstructorExpression::~VectorConstructorExpression() = default;

Value VectorConstructorExpression::execute(const ProgramVariables& variables) const
{
	auto xValue = m_xExpression->execute(variables);
	auto yValue = m_yExpression->execute(variables);
	auto zValue = m_zExpression->execute(variables);

	vec3d vecVal;

	vecVal.xyz.x = xValue.getFloat();
	vecVal.xyz.y = yValue.getFloat();
	vecVal.xyz.z = zValue.getFloat();

	return Value(vecVal);
}
bool VectorConstructorExpression::validate(antlr4::Parser* parser, const ParseContext& context)
{
	bool valid = true;

	valid &= m_xExpression->validate(parser, context);
	valid &= m_yExpression->validate(parser, context);
	valid &= m_zExpression->validate(parser, context);

	if (!valid) {
		// Exit early if there were errors since the values below are meaningless otherwise
		return false;
	}

	if (!checkTypeWithImplicitConversion(m_xExpression->getExpressionType(), ValueType::Float)) {
		const auto& typeDef = TypeDefinition::forValueType(m_xExpression->getExpressionType());
		parser->notifyErrorListeners(m_xExpression->getToken(),
			"Invalid value type for vector constructor. Expected <Float>, got <" + typeDef.getName() + ">",
			nullptr);
		valid = false;
	}
	if (!checkTypeWithImplicitConversion(m_yExpression->getExpressionType(), ValueType::Float)) {
		const auto& typeDef = TypeDefinition::forValueType(m_yExpression->getExpressionType());
		parser->notifyErrorListeners(m_yExpression->getToken(),
			"Invalid value type for vector constructor. Expected <Float>, got <" + typeDef.getName() + ">",
			nullptr);
		valid = false;
	}
	if (!checkTypeWithImplicitConversion(m_zExpression->getExpressionType(), ValueType::Float)) {
		const auto& typeDef = TypeDefinition::forValueType(m_zExpression->getExpressionType());
		parser->notifyErrorListeners(m_zExpression->getToken(),
			"Invalid value type for vector constructor. Expected <Float>, got <" + typeDef.getName() + ">",
			nullptr);
		valid = false;
	}

	return valid;
}
ValueType VectorConstructorExpression::determineReturnType() const
{
	// No need to look at the expressions here since we will always be a vector
	return ValueType::Vector;
}
void VectorConstructorExpression::validationDone()
{
	AbstractExpression::validationDone();

	m_xExpression->validationDone();
	m_yExpression->validationDone();
	m_zExpression->validationDone();
}

} // namespace nodes
} // namespace expression
} // namespace actions