Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
Expression.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* Expression.cc (C) 2000-2014 */
9/* */
10/* Reference to an expression. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ArcanePrecomp.h"
15
16#include "arcane/utils/Array.h"
17#include "arcane/utils/Iostream.h"
18
19#include "arcane/expr/Expression.h"
20#include "arcane/expr/ExpressionImpl.h"
21#include "arcane/expr/ExpressionResult.h"
22#include "arcane/expr/BinaryExpressionImpl.h"
23#include "arcane/expr/UnaryExpressionImpl.h"
24#include "arcane/expr/LitteralExpressionImpl.h"
25#include "arcane/expr/WhereExpressionImpl.h"
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
38: m_expression(0)
39{
40}
41
44{
45 m_expression = new LitteralExpressionImpl(v);
46 m_expression->addRef();
47}
48
50Expression(IExpressionImpl* expr)
51: m_expression(expr)
52{
53 if (m_expression)
54 m_expression->addRef();
55}
56
58Expression(const Expression& expr)
59: m_expression(expr.m_expression)
60{
61 if (m_expression)
62 m_expression->addRef();
63}
64
65void Expression::
66operator=(const Expression& expr)
67{
68 IExpressionImpl* nex = expr.m_expression;
69 if (nex)
70 nex->addRef();
71 if (m_expression)
72 m_expression->removeRef();
73 m_expression = nex;
74}
75
76Expression::
77~Expression()
78{
79 if (m_expression)
80 m_expression->removeRef();
81}
82
83void Expression::
84assign(const Expression& expr)
85{
86 m_expression->assign(expr.m_expression);
87}
88
89void Expression::
90assign(const Expression& expr, const Array<Integer>& indices)
91{
92 m_expression->assign(expr.m_expression, indices);
93}
94
95void Expression::
96assign(Real val)
97{
98 Expression expr(literal(val));
99 m_expression->assign(expr.m_expression);
100}
101
102void Expression::
103apply(ExpressionResult* result)
104{
105 m_expression->apply(result);
106}
107
108void Expression::
109dumpIf(const Expression& test_expr, Array<Expression>& exprs)
110{
111 m_expression->dumpIf(test_expr.m_expression, exprs);
112}
113
114void Expression::
115dumpIf(const Expression& test_expr)
116{
117 UniqueArray<Expression> exprs;
118 m_expression->dumpIf(test_expr.m_expression, exprs);
119}
120
121IExpressionImpl* Expression::
122operator->() const
123{
124 return m_expression;
125}
126
127/*---------------------------------------------------------------------------*/
128/*---------------------------------------------------------------------------*/
129
130Expression Expression::
131operator-()
132{
133 return new UnaryExpressionImpl(m_expression,
134 UnaryExpressionImpl::UnarySubstract);
135}
136
137Expression Expression::
138inverse()
139{
140 return new UnaryExpressionImpl(m_expression,
141 UnaryExpressionImpl::Inverse);
142}
143
144/*---------------------------------------------------------------------------*/
145/*---------------------------------------------------------------------------*/
146
147Expression Expression::
148acos()
149{
150 return new UnaryExpressionImpl(m_expression,
151 UnaryExpressionImpl::Acos);
152}
153
154Expression Expression::
155asin()
156{
157 return new UnaryExpressionImpl(m_expression,
158 UnaryExpressionImpl::Asin);
159}
160
161Expression Expression::
162atan()
163{
164 return new UnaryExpressionImpl(m_expression,
165 UnaryExpressionImpl::Atan);
166}
167
168Expression Expression::
169ceil()
170{
171 return new UnaryExpressionImpl(m_expression,
172 UnaryExpressionImpl::Ceil);
173}
174
175Expression Expression::
176cos()
177{
178 return new UnaryExpressionImpl(m_expression,
179 UnaryExpressionImpl::Cos);
180}
181
182Expression Expression::
183cosh()
184{
185 return new UnaryExpressionImpl(m_expression,
186 UnaryExpressionImpl::Cosh);
187}
188
189Expression Expression::
190exp()
191{
192 return new UnaryExpressionImpl(m_expression,
193 UnaryExpressionImpl::Exp);
194}
195
196Expression Expression::
197fabs()
198{
199 return new UnaryExpressionImpl(m_expression,
200 UnaryExpressionImpl::Fabs);
201}
202
203Expression Expression::
204floor()
205{
206 return new UnaryExpressionImpl(m_expression,
207 UnaryExpressionImpl::Floor);
208}
209
210Expression Expression::
211log()
212{
213 return new UnaryExpressionImpl(m_expression,
214 UnaryExpressionImpl::Log);
215}
216
217Expression Expression::
218log10()
219{
220 return new UnaryExpressionImpl(m_expression,
221 UnaryExpressionImpl::Log10);
222}
223
224Expression Expression::
225sin()
226{
227 return new UnaryExpressionImpl(m_expression,
228 UnaryExpressionImpl::Sin);
229}
230
231Expression Expression::
232sinh()
233{
234 return new UnaryExpressionImpl(m_expression,
235 UnaryExpressionImpl::Sinh);
236}
237
238Expression Expression::
239sqrt()
240{
241 return new UnaryExpressionImpl(m_expression,
242 UnaryExpressionImpl::Sqrt);
243}
244
245Expression Expression::
246tan()
247{
248 return new UnaryExpressionImpl(m_expression,
249 UnaryExpressionImpl::Tan);
250}
251
252Expression Expression::
253tanh()
254{
255 return new UnaryExpressionImpl(m_expression,
256 UnaryExpressionImpl::Tanh);
257}
258
259/*---------------------------------------------------------------------------*/
260/*---------------------------------------------------------------------------*/
261
262Expression Expression::
263operator+(Expression ex1)
264{
265 return new BinaryExpressionImpl(m_expression, ex1.m_expression,
266 BinaryExpressionImpl::Add);
267}
268
269Expression Expression::
270operator-(Expression ex1)
271{
272 return new BinaryExpressionImpl(m_expression, ex1.m_expression,
273 BinaryExpressionImpl::Substract);
274}
275
276Expression Expression::
277operator*(Expression ex1)
278{
279 return new BinaryExpressionImpl(m_expression, ex1.m_expression,
280 BinaryExpressionImpl::Multiply);
281}
282
283Expression Expression::
284operator/(Expression ex1)
285{
286 return new BinaryExpressionImpl(m_expression, ex1.m_expression,
287 BinaryExpressionImpl::Divide);
288}
289
290Expression Expression::
291eq(Expression ex1)
292{
293 return new BinaryExpressionImpl(m_expression, ex1.m_expression,
294 BinaryExpressionImpl::Equal);
295}
296
297Expression Expression::
298lt(Expression ex1)
299{
300 return new BinaryExpressionImpl(m_expression, ex1.m_expression,
301 BinaryExpressionImpl::LessThan);
302}
303
304Expression Expression::
305gt(Expression ex1)
306{
307 return new BinaryExpressionImpl(m_expression, ex1.m_expression,
308 BinaryExpressionImpl::GreaterThan);
309}
310
311Expression Expression::
312lte(Expression ex1)
313{
314 return new BinaryExpressionImpl(m_expression, ex1.m_expression,
315 BinaryExpressionImpl::LessOrEqualThan);
316}
317
318Expression Expression::
319gte(Expression ex1)
320{
321 return new BinaryExpressionImpl(m_expression, ex1.m_expression,
322 BinaryExpressionImpl::GreaterOrEqualThan);
323}
324Expression Expression::
325eand(Expression ex1)
326{
327 return new BinaryExpressionImpl(m_expression, ex1.m_expression,
328 BinaryExpressionImpl::And);
329}
330Expression Expression::
331eor(Expression ex1)
332{
333 return new BinaryExpressionImpl(m_expression, ex1.m_expression,
334 BinaryExpressionImpl::Or);
335}
336
337/*---------------------------------------------------------------------------*/
338/*---------------------------------------------------------------------------*/
339
340Expression Expression::
341minimum(Expression ex1)
342{
343 return new BinaryExpressionImpl(m_expression,
344 ex1.m_expression,
345 BinaryExpressionImpl::Minimum);
346}
347
348Expression Expression::
349maximum(Expression ex1)
350{
351 return new BinaryExpressionImpl(m_expression,
352 ex1.m_expression,
353 BinaryExpressionImpl::Maximum);
354}
355
356Expression Expression::
357pow(Expression ex1)
358{
359 return new BinaryExpressionImpl(m_expression,
360 ex1.m_expression,
361 BinaryExpressionImpl::Pow);
362}
363
364/*---------------------------------------------------------------------------*/
365/*---------------------------------------------------------------------------*/
366
367Expression Expression::
368ifelse(Expression ex1, Expression ex2)
369{
370 return new WhereExpressionImpl(m_expression,
371 ex1.m_expression,
372 ex2.m_expression);
373}
374
375/*---------------------------------------------------------------------------*/
376/*---------------------------------------------------------------------------*/
377
378Expression Expression::
379literal(Real v)
380{
381 return new LitteralExpressionImpl(v);
382}
383
384/*---------------------------------------------------------------------------*/
385/*---------------------------------------------------------------------------*/
386
387void Expression::
388setTrace(bool v)
389{
390 m_expression->setTrace(v);
391}
392
393unsigned long Expression::
394vectorSize()
395{
396 return m_expression->vectorSize();
397}
398
399/*---------------------------------------------------------------------------*/
400/*---------------------------------------------------------------------------*/
401
402} // namespace Arcane
403
404/*---------------------------------------------------------------------------*/
405/*---------------------------------------------------------------------------*/
Base class for 1D data vectors.
Polymorphic base type of an expression.
Reference to an expression.
Definition Expression.h:44
Expression()
Default constructor.
Definition Expression.cc:37
Interface for the different implementations of an expression.
Implementation of a literal expression containing a scalar.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
double Real
Type representing a real number.