80 |
{ |
{ |
81 |
public: |
public: |
82 |
friend std::ostream& operator << (std::ostream& os, |
friend std::ostream& operator << (std::ostream& os, |
83 |
ExpressionBinaryOperator<B, TypeExpression>& bo) |
const ExpressionBinaryOperator<B, TypeExpression>& bo) |
84 |
{ |
{ |
85 |
bo.put(os); |
bo.put(os); |
86 |
return os; |
return os; |
91 |
return static_cast<B&>(*this); |
return static_cast<B&>(*this); |
92 |
} |
} |
93 |
|
|
94 |
std::ostream& put(std::ostream& os) |
const B& theBinaryOperator() const |
95 |
|
{ |
96 |
|
return static_cast<const B&>(*this); |
97 |
|
} |
98 |
|
|
99 |
|
std::ostream& put(std::ostream& os) const |
100 |
{ |
{ |
101 |
theBinaryOperator().put(os); |
theBinaryOperator().put(os); |
102 |
return os; |
return os; |
103 |
} |
} |
104 |
|
|
105 |
TypeExpression& operator()(const TypeExpression& a, const TypeExpression& b) |
const TypeExpression operator()(const TypeExpression& a, const TypeExpression& b) const |
106 |
{ |
{ |
107 |
return theBinaryOperator().apply(a,b); |
return theBinaryOperator().apply(a,b); |
108 |
} |
} |
109 |
|
|
110 |
const real_t operator()(const real_t a, const real_t b) |
const real_t operator()(const real_t a, const real_t b) const |
111 |
{ |
{ |
112 |
return theBinaryOperator().apply(a,b); |
return theBinaryOperator().apply(a,b); |
113 |
} |
} |
126 |
TypeExpression> |
TypeExpression> |
127 |
{ |
{ |
128 |
public: |
public: |
129 |
std::ostream& put(std::ostream& os) |
std::ostream& put(std::ostream& os) const |
130 |
{ |
{ |
131 |
os << '+'; |
os << '+'; |
132 |
return os; |
return os; |
133 |
} |
} |
134 |
|
|
135 |
TypeExpression& apply(const TypeExpression& a, const TypeExpression& b) |
const TypeExpression apply(const TypeExpression& a, const TypeExpression& b) const |
136 |
{ |
{ |
137 |
return a+b; |
return a+b; |
138 |
} |
} |
139 |
|
|
140 |
const real_t apply(const real_t a, const real_t b) |
const real_t apply(const real_t a, const real_t b) const |
141 |
{ |
{ |
142 |
return a+b; |
return a+b; |
143 |
} |
} |
156 |
TypeExpression> |
TypeExpression> |
157 |
{ |
{ |
158 |
public: |
public: |
159 |
std::ostream& put(std::ostream& os) |
std::ostream& put(std::ostream& os) const |
160 |
{ |
{ |
161 |
os << '-'; |
os << '-'; |
162 |
return os; |
return os; |
163 |
} |
} |
164 |
|
|
165 |
TypeExpression& apply(const TypeExpression& a, const TypeExpression& b) |
const TypeExpression apply(const TypeExpression& a, const TypeExpression& b) const |
166 |
{ |
{ |
167 |
return a-b; |
return a-b; |
168 |
} |
} |
169 |
|
|
170 |
const real_t apply(const real_t a, const real_t b) |
const real_t apply(const real_t a, const real_t b) const |
171 |
{ |
{ |
172 |
return a-b; |
return a-b; |
173 |
} |
} |
186 |
TypeExpression> |
TypeExpression> |
187 |
{ |
{ |
188 |
public: |
public: |
189 |
std::ostream& put(std::ostream& os) |
std::ostream& put(std::ostream& os) const |
190 |
{ |
{ |
191 |
os << '*'; |
os << '*'; |
192 |
return os; |
return os; |
193 |
} |
} |
194 |
|
|
195 |
TypeExpression& apply(const TypeExpression& a, const TypeExpression& b) |
const TypeExpression apply(const TypeExpression& a, const TypeExpression& b) const |
196 |
{ |
{ |
197 |
return a*b; |
return a*b; |
198 |
} |
} |
199 |
|
|
200 |
const real_t apply(const real_t a, const real_t b) |
const real_t apply(const real_t a, const real_t b) const |
201 |
{ |
{ |
202 |
return a*b; |
return a*b; |
203 |
} |
} |
216 |
TypeExpression> |
TypeExpression> |
217 |
{ |
{ |
218 |
public: |
public: |
219 |
std::ostream& put(std::ostream& os) |
std::ostream& put(std::ostream& os) const |
220 |
{ |
{ |
221 |
os << '/'; |
os << '/'; |
222 |
return os; |
return os; |
223 |
} |
} |
224 |
|
|
225 |
TypeExpression& apply(const TypeExpression& a, const TypeExpression& b) |
const TypeExpression apply(const TypeExpression& a, const TypeExpression& b) const |
226 |
{ |
{ |
227 |
return a/b; |
return a/b; |
228 |
} |
} |
229 |
|
|
230 |
const real_t apply(const real_t a, const real_t b) |
const real_t apply(const real_t a, const real_t b) const |
231 |
{ |
{ |
232 |
return a/b; |
return a/b; |
233 |
} |
} |
246 |
TypeExpression> |
TypeExpression> |
247 |
{ |
{ |
248 |
public: |
public: |
249 |
std::ostream& put(std::ostream& os) |
std::ostream& put(std::ostream& os) const |
250 |
{ |
{ |
251 |
os << '^'; |
os << '^'; |
252 |
return os; |
return os; |
253 |
} |
} |
254 |
|
|
255 |
TypeExpression& apply(const TypeExpression& a, const TypeExpression& b) |
const TypeExpression apply(const TypeExpression& a, const TypeExpression& b) const |
256 |
{ |
{ |
257 |
return std::pow(a,b); |
return std::pow(a,b); |
258 |
} |
} |
259 |
|
|
260 |
const real_t apply(const real_t a, const real_t b) |
const real_t apply(const real_t a, const real_t b) const |
261 |
{ |
{ |
262 |
return std::pow(a,b); |
return std::pow(a,b); |
263 |
} |
} |
264 |
}; |
}; |
265 |
|
|
279 |
{ |
{ |
280 |
public: |
public: |
281 |
friend std::ostream& operator << (std::ostream& os, |
friend std::ostream& operator << (std::ostream& os, |
282 |
ExpressionUnaryOperator<U, TypeExpression>& uo) |
const ExpressionUnaryOperator<U, TypeExpression>& uo) |
283 |
{ |
{ |
284 |
uo.put(os); |
uo.put(os); |
285 |
return os; |
return os; |
290 |
return static_cast<U&>(*this); |
return static_cast<U&>(*this); |
291 |
} |
} |
292 |
|
|
293 |
std::ostream& put(std::ostream& os) |
const U& theUnaryOperator() const |
294 |
|
{ |
295 |
|
return static_cast<const U&>(*this); |
296 |
|
} |
297 |
|
|
298 |
|
std::ostream& put(std::ostream& os) const |
299 |
{ |
{ |
300 |
theUnaryOperator().put(os); |
theUnaryOperator().put(os); |
301 |
return os; |
return os; |
302 |
} |
} |
303 |
|
|
304 |
TypeExpression& operator()(const TypeExpression& a) |
const TypeExpression operator()(const TypeExpression& a) const |
305 |
{ |
{ |
306 |
return theUnaryOperator().apply(a,b); |
return theUnaryOperator().apply(a,b); |
307 |
} |
} |
308 |
|
|
309 |
real_t operator()(const real_t a) |
real_t operator()(const real_t a) const |
310 |
{ |
{ |
311 |
return theUnaryOperator().apply(a); |
return theUnaryOperator().apply(a); |
312 |
} |
} |
326 |
TypeExpression> |
TypeExpression> |
327 |
{ |
{ |
328 |
public: |
public: |
329 |
std::ostream& put(std::ostream& os) |
std::ostream& put(std::ostream& os) const |
330 |
{ |
{ |
331 |
os << '-'; |
os << '-'; |
332 |
return os; |
return os; |
333 |
} |
} |
334 |
|
|
335 |
TypeExpression& apply(const TypeExpression& a) |
const TypeExpression apply(const TypeExpression& a) const |
336 |
{ |
{ |
337 |
return -a; |
return -a; |
338 |
} |
} |
339 |
|
|
340 |
const real_t apply(const real_t a) |
const real_t apply(const real_t a) const |
341 |
{ |
{ |
342 |
return -a; |
return -a; |
343 |
} |
} |
344 |
}; |
}; |
345 |
|
|
389 |
TypeExpression> |
TypeExpression> |
390 |
{ |
{ |
391 |
public: |
public: |
392 |
std::ostream& put(std::ostream& os) |
std::ostream& put(std::ostream& os) const |
393 |
{ |
{ |
394 |
return functionName<F>(os); |
return functionName<F>(os); |
395 |
} |
} |
396 |
|
|
397 |
TypeExpression& apply(const TypeExpression& a) |
const TypeExpression apply(const TypeExpression& a) const |
398 |
{ |
{ |
399 |
return F(a); |
return F(a); |
400 |
} |
} |
401 |
|
|
402 |
const real_t apply(const real_t a) |
const real_t apply(const real_t a) const |
403 |
{ |
{ |
404 |
return F(a); |
return F(a); |
405 |
} |
} |
406 |
}; |
}; |
407 |
|
|