-
Notifications
You must be signed in to change notification settings - Fork 0
/
Expressions.cp
42 lines (38 loc) · 1.36 KB
/
Expressions.cp
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
#include "Expressions.h"
#include "ValueExpressions.h"
#include "FieldExpressions.h"
CommonEvaluator* CreateBinaryOp(const BinValEvalFactory& operation,
CommonEvaluator *a, CommonEvaluator *b, bool allowMix)
{
ValueEvaluator* avalue = dynamic_cast<ValueEvaluator*> (a);
ValueEvaluator* bvalue = dynamic_cast<ValueEvaluator*> (b);
ExpressionEvaluator* afield = dynamic_cast<ExpressionEvaluator*> (a);
ExpressionEvaluator* bfield = dynamic_cast<ExpressionEvaluator*> (b);
if(avalue && bvalue)
return operation.Create(avalue,bvalue);
else if(afield && bfield)
return new FieldArithmeticEvaluator(afield,bfield,
operation);
else if(allowMix && afield && bvalue)
return new FieldArithmeticEvaluator(afield,autorelease(new ConstantFieldEvaluator(bvalue)),
operation);
else if(allowMix && avalue && bfield)
return new FieldArithmeticEvaluator(autorelease(new ConstantFieldEvaluator(avalue)),bfield,
operation);
else
{
assert(!allowMix);
throw TypeMismatch();
}
}
CommonEvaluator* CreateNegateOp(CommonEvaluator *a)
{
ValueEvaluator* avalue = dynamic_cast<ValueEvaluator*> (a);
ExpressionEvaluator* afield = dynamic_cast<ExpressionEvaluator*> (a);
assert(avalue != NULL || afield != NULL);
assert(avalue == NULL || afield == NULL);
if(avalue)
return new NegateValueEvaluator(avalue);
else
return new NegateFieldEvaluator(afield);
}