Arcane  v3.16.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
WhereExpressionImpl.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* WhereExpressionImpl.h (C) 2000-2004 */
9/* */
10/* Implémentation d'une expression conditionnelle. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_EXPR_WHEREEXPRESSIONIMPL_H
13#define ARCANE_EXPR_WHEREEXPRESSIONIMPL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17
18#include "arcane/expr/BadOperandException.h"
19#include "arcane/expr/ExpressionImpl.h"
20#include "arcane/expr/ExpressionResult.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25ARCANE_BEGIN_NAMESPACE
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30class WhereOperator;
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
38class ARCANE_EXPR_EXPORT WhereExpressionImpl
39: public ExpressionImpl
40{
41 public:
42 WhereExpressionImpl (IExpressionImpl* test,
43 IExpressionImpl* iftrue,
44 IExpressionImpl* iffalse);
45
46 public:
47 virtual void assign(IExpressionImpl*) {}
48 virtual void assign(IExpressionImpl*, IntegerConstArrayView) {}
49 virtual void apply(ExpressionResult* result);
50 virtual Integer vectorSize() const { return 0; }
51
52 private:
56};
57
58/*---------------------------------------------------------------------------*/
59/*---------------------------------------------------------------------------*/
60
65{
66 public:
67 virtual ~WhereOperator(){}
68 virtual void evaluate(ExpressionResult* res,
69 ArrayVariant* test,
70 ArrayVariant* iftrue,
71 ArrayVariant* iffalse) = 0;
72};
73
74/*---------------------------------------------------------------------------*/
75/*---------------------------------------------------------------------------*/
76
77template<class T>
79: public WhereOperator
80{
81 public:
82 virtual ~WhereOperatorT() {}
83 virtual void evaluate(ExpressionResult* res,
84 ArrayVariant* test,
85 ArrayVariant* iftrue,
86 ArrayVariant* iffalse)
87 {
88 // verification de la validite de l'operation
89 if (test->type() != ArrayVariant::TBool)
90 throw BadOperandException("WhereOperatorT::evaluate");
91
92 Integer size = res->size();
93 if (size != test->size())
94 throw BadOperandException("WhereOperatorT::evaluate");
95
96 if (iftrue->type() || iffalse->type())
97 throw BadOperandException("WhereOperatorT::evaluate");
98
99 // allocation du résultat en fonction du type du résultat du if
100 res->allocate(iftrue->type());
101
102 // recuperation des valeurs des operandes
103 ArrayView<bool> test_val;
104 test->value(test_val);
105 ArrayView<T> res_val;
106 res->data()->value(res_val);
107 ArrayView<T> iftrue_val;
108 iftrue->value(iftrue_val);
109 ArrayView<T> iffalse_val;
110 iffalse->value(iffalse_val);
111
112 Integer false_i = 0;
113 Integer true_i = 0;
114 for (Integer i=0 ; i<size ; ++i)
115 test_val[i] ? res_val[i] = iftrue_val[true_i++]
116 : res_val[i] = iffalse_val[false_i++];
117 }
118};
119
120/*---------------------------------------------------------------------------*/
121/*---------------------------------------------------------------------------*/
122
123ARCANE_END_NAMESPACE
124
125/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
127
128#endif
Type de base polymorphe pour les tableaux (dimension 1).
Vue modifiable d'un tableau d'un type T.
constexpr const_pointer data() const noexcept
Pointeur sur le début de la vue.
Exception sur les opérandes des opérations des expressions.
Type de base polymorphe d'une expression.
Référence à une expression.
Definition Expression.h:43
Interface pour les différentes implémentations d'une expression.
virtual Integer vectorSize() const
Nombre d'éléments du vecteur.
Expression m_iffalse
Expression évaluée lorsque le test est negatif.
Expression m_iftrue
Expression évaluée lorsque le test est positif.
Expression m_test
Expression de test.
Operateur generique pour les expressions conditionnnelle.
Int32 Integer
Type représentant un entier.
ConstArrayView< Integer > IntegerConstArrayView
Equivalent C d'un tableau à une dimension d'entiers.
Definition UtilsTypes.h:573