-
Notifications
You must be signed in to change notification settings - Fork 0
/
ValueExpressions.h
150 lines (125 loc) · 3.44 KB
/
ValueExpressions.h
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include "ValueEvaluator.h"
#include <vector>
using std::vector;
class ExpressionEvaluator;
class ImaginaryUnitConstant : public ValueEvaluator
{
public:
virtual bool IsComplex();
virtual int Dimensions();
virtual void EvaluateComplex(int n, complex<number> values[]);
};
class BinaryValueEvaluator : public ValueEvaluator
{
protected:
ValueEvaluator *valueA;
ValueEvaluator *valueB;
int kind;
int adim,bdim;
public:
enum
{
kOneAndOne = 1 << 0,
kOneAndMany = 1 << 1,
kManyAndOne = 1 << 2,
kManyAndMany = 1 << 3
};
BinaryValueEvaluator(ValueEvaluator *a,
ValueEvaluator *b,
int laws);
~BinaryValueEvaluator();
bool IsComplex();
int Dimensions();
};
class BinValEvalFactory
{
public:
virtual BinaryValueEvaluator* Create(ValueEvaluator *a, ValueEvaluator *b) const = 0;
};
template <class BV>
class StdBinValEvalFactory : public BinValEvalFactory
{
public:
virtual BinaryValueEvaluator* Create(ValueEvaluator *a, ValueEvaluator *b) const
{
return new BV(a,b);
}
};
class AddValueEvaluator : public BinaryValueEvaluator
{
public:
AddValueEvaluator(ValueEvaluator *a,
ValueEvaluator *b);
virtual void EvaluateReal(int n, number values[]);
virtual void EvaluateComplex(int n, complex<number> values[]);
};
class SubtractValueEvaluator : public BinaryValueEvaluator
{
public:
SubtractValueEvaluator(ValueEvaluator *a,
ValueEvaluator *b);
virtual void EvaluateReal(int n, number values[]);
virtual void EvaluateComplex(int n, complex<number> values[]);
};
class MultiplyValueEvaluator : public BinaryValueEvaluator
{
public:
MultiplyValueEvaluator(ValueEvaluator *a,
ValueEvaluator *b);
virtual void EvaluateReal(int n, number values[]);
virtual void EvaluateComplex(int n, complex<number> values[]);
};
class DivideValueEvaluator : public BinaryValueEvaluator
{
public:
DivideValueEvaluator(ValueEvaluator *a,
ValueEvaluator *b);
virtual void EvaluateReal(int n, number values[]);
virtual void EvaluateComplex(int n, complex<number> values[]);
};
class DotValueEvaluator : public BinaryValueEvaluator
{
public:
DotValueEvaluator(ValueEvaluator *a,
ValueEvaluator *b);
virtual void EvaluateReal(int n, number values[]);
virtual void EvaluateComplex(int n, complex<number> values[]);
int Dimensions();
};
class NegateValueEvaluator : public ValueEvaluator
{
ValueEvaluator *value;
public:
NegateValueEvaluator(ValueEvaluator *a);
~NegateValueEvaluator();
virtual void EvaluateReal(int n, number values[]);
virtual void EvaluateComplex(int n, complex<number> values[]);
virtual bool IsComplex();
virtual int Dimensions();
};
class VectorValueEvaluator : public ValueEvaluator
{
bool iscomplex;
vector<ValueEvaluator*> params;
public:
VectorValueEvaluator();
~VectorValueEvaluator();
void AddComponent(ValueEvaluator *v);
virtual void EvaluateReal(int n, number values[]);
virtual void EvaluateComplex(int n, complex<number> values[]);
virtual bool IsComplex();
virtual int Dimensions();
};
class FieldSampleValueEvaluator : public ValueEvaluator
{
ExpressionEvaluator *e;
vecR3 at;
public:
FieldSampleValueEvaluator(ExpressionEvaluator *e,vecR3 at);
~FieldSampleValueEvaluator();
void SetSamplePos(vecR3 p);
virtual void EvaluateReal(int n, number values[]);
virtual void EvaluateComplex(int n, complex<number> values[]);
virtual bool IsComplex();
virtual int Dimensions();
};