Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Real2Proxy.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/* Real2Proxy.h (C) 2000-2008 */
9/* */
10/* Proxy d'un 'Real2'. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_REAL2PROXY_H
13#define ARCANE_UTILS_REAL2PROXY_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Real2.h"
18#include "arcane/utils/BuiltInProxy.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23ARCANE_BEGIN_NAMESPACE
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27/*!
28 * \brief Classe gérant un vecteur de réel de dimension 2.
29
30 Le vecteur comprend deuxs composantes \a x et \a y qui sont du
31 type \b Real.
32
33 \code
34 Real2Proxy value (1.0,2.3); // Créé un couple (x=1.0, y=2.3)
35 cout << value.x; // Imprime la composante x
36 value.y += 3.2; // Ajoute 3.2 à la composante \b y
37 \endcode
38 */
39class ARCANE_UTILS_EXPORT Real2Proxy
40{
41 public:
42
43 //! Construit le couplet (ax,ay)
44 Real2Proxy(Real2& value,const MemoryAccessInfo& info)
45 : x(value.x,info), y(value.y,info), m_value(value), m_info(info) {}
46 //! Construit un couple identique à \a f
48 : x(f.x), y(f.y), m_value(f.m_value), m_info(f.m_info) {}
49 const Real2& operator=(Real2Proxy f)
50 { x=f.x; y=f.y; return m_value; }
51 const Real2& operator=(Real2 f)
52 { x=f.x; y=f.y; return m_value; }
53 //! Affecte à l'instance le couple (v,v).
54 const Real2& operator=(Real v)
55 { x = y = v; return m_value; }
56 operator Real2() const
57 {
58 return getValue();
59 }
60 //operator Real2&()
61 //{
62 // return getValueMutable();
63 //}
64 public:
65
66 RealProxy x; //!< première composante du couple
67 RealProxy y; //!< deuxième composante du couple
68
69 private:
70
71 Real2& m_value;
72 MemoryAccessInfo m_info;
73
74 public:
75
76 //! Retourne une copie du couple.
77 Real2 copy() const { return m_value; }
78 //! Réinitialise le couple avec les constructeurs par défaut.
79 Real2Proxy& reset() { x = y = 0.; return (*this); }
80 //! Affecte à l'instance le couple (ax,ay,az)
81 Real2Proxy& assign(Real ax,Real ay)
82 { x = ax; y = ay; return (*this); }
83 //! Copie le couple \a f
85 { x = f.x; y = f.y; return (*this); }
86 /*!
87 * \brief Compare le couple avec le couple nul.
88 *
89 * Dans le cas d'un type #value_type de type intégral, le couple est
90 * nul si et seulement si chacune de ses composantes est égal à 0.
91 *
92 * Pour #value_type du type flottant (float, double ou #Real), le couple
93 * est nul si et seulement si chacune de ses composant est inférieure
94 * à un espilon donné. La valeur de l'epsilon utilisée est celle
95 * de float_info<value_type>::nearlyEpsilon():
96 * \f[A=0 \Leftrightarrow |A.x|<\epsilon,|A.y|<\epsilon \f]
97 *
98 * \retval true si le couple est égal au couple nul,
99 * \retval false sinon.
100 */
101 bool isNearlyZero() const
102 {
103 return math::isNearlyZero(x.getValue()) && math::isNearlyZero(y.getValue());
104 }
105 //! Retourne la norme au carré du couple \f$x^2+y^2+z^2\f$
106 Real abs2() const
107 { return x*x + y*y; }
108 //! Retourne la norme du couple \f$\sqrt{x^2+y^2+z^2}\f$
109 Real abs() const
110 { return _sqrt(abs2()); }
111
112 /*!
113 * \brief Lit un couple sur le flot \a i
114 * Le couple est lu sous la forme de trois valeur de type #value_type.
115 */
116 istream& assign(istream& i);
117 //! Ecrit le couple sur le flot \a o lisible par un assign()
118 ostream& print(ostream& o) const;
119 //! Ecrit le couple sur le flot \a o sous la forme (x,y)
120 ostream& printXy(ostream& o) const;
121
122 //! Ajoute \a b au couple
123 Real2Proxy& add(Real2 b) { x+=b.x; y+=b.y; return (*this); }
124 //! Soustrait \a b au couple
125 Real2Proxy& sub(Real2 b) { x-=b.x; y-=b.y; return (*this); }
126 //! Multiple chaque composante du couple par la composant correspondant de \a b
127 Real2Proxy& mul(Real2 b) { x*=b.x; y*=b.y; return (*this); }
128 //! Divise chaque composante du couple par la composant correspondant de \a b
129 Real2Proxy& div(Real2 b) { x/=b.x; y/=b.y; return (*this); }
130 //! Ajoute \a b à chaque composante du couple
131 Real2Proxy& addSame(Real b) { x+=b; y+=b; return (*this); }
132 //! Soustrait \a b à chaque composante du couple
133 Real2Proxy& subSame(Real b) { x-=b; y-=b; return (*this); }
134 //! Multiplie chaque composante du couple par \a b
135 Real2Proxy& mulSame(Real b) { x*=b; y*=b; return (*this); }
136 //! Divise chaque composante du couple par \a b
137 Real2Proxy& divSame(Real b) { x/=b; y/=b; return (*this); }
138 //! Ajoute \a b au couple.
139 Real2Proxy& operator+=(Real2 b) { return add(b); }
140 //! Soustrait \a b au couple
141 Real2Proxy& operator-=(Real2 b) { return sub(b); }
142 //! Multiplie chaque composante du couple par la composant correspondant de \a b
143 Real2Proxy& operator*=(Real2 b) { return mul(b); }
144 //! Multiplie chaque composante du couple par le réel \a b
145 void operator*=(Real b) { x*=b; y*=b; }
146 //! Divise chaque composante du couple par la composant correspondant de \a b
147 Real2Proxy& operator/=(Real2 b) { return div(b); }
148 //! Divise chaque composante du couple par le réel \a b
149 void operator/=(Real b) { x/=b; y/=b; }
150 //! Créé un couple qui vaut ce couple ajouté à \a b
151 Real2 operator+(Real2 b) const { return Real2(x+b.x,y+b.y); }
152 //! Créé un couple qui vaut \a b soustrait de ce couple
153 Real2 operator-(Real2 b) const { return Real2(x-b.x,y-b.y); }
154 //! Créé un couple opposé au couple actuel
155 Real2 operator-() const { return Real2(-x,-y); }
156 /*!
157 * \brief Créé un couple qui vaut ce couple dont chaque composant a été
158 * multipliée par la composante correspondante de \a b.
159 */
160 Real2 operator*(Real2 b) const { return Real2(x*b.x,y*b.y); }
161 /*!
162 * \brief Créé un couple qui vaut ce couple dont chaque composant a été divisée
163 * par la composante correspondante de \a b.
164 */
165 Real2 operator/(Real2 b) const { return Real2(x/b.x,y/b.y); }
166
167 /*!
168 * \brief Normalise le couple.
169 *
170 * Si le couple est non nul, divise chaque composante par la norme du couple
171 * (abs()), de telle sorte qu'après l'appel à cette méthode, abs() valent \a 1.
172 * Si le couple est nul, ne fait rien.
173 */
175 {
176 Real d = abs();
177 if (!math::isZero(d))
178 divSame(d);
179 return (*this);
180 }
181
182 /*!
183 * \brief Compare le couple à \a b.
184 *
185 * Dans le cas d'un type #value_type de type intégral, deux couples
186 * sont égaux si et seulement si chacune de leur composant sont strictement
187 * égales.
188 *
189 * Pour #value_type du type flottant (float, double ou #Real), deux couples
190 * sont identiques si et seulement si la valeur absolue de la différence
191 * entre chacune de leur composant correspondante est inférieure
192 * à un espilon donné. La valeur de l'epsilon utilisée est celle
193 * de float_info<value_type>::nearlyEpsilon():
194 * \f[A=B \Leftrightarrow |A.x-B.x|<\epsilon,|A.y-B.y|<\epsilon,|A.z-B.z|<\epsilon \f]
195 * \retval true si les deux couples sont égaux,
196 * \retval false sinon.
197 */
198 bool operator==(Real2 b) const
199 { return _eq(x,b.x) && _eq(y,b.y); }
200 /*!
201 * \brief Compare deux couples.
202 * Pour la notion d'égalité, voir operator==()
203 * \retval true si les deux couples sont différents,
204 * \retval false sinon.
205 */
206 bool operator!=(Real2 b) const
207 { return !operator==(b); }
208
209 public:
210
211 Real2 getValue() const
212 {
213 m_info.setRead();
214 return m_value;
215 }
216 Real2& getValueMutable()
217 {
218 m_info.setReadOrWrite();
219 return m_value;
220 }
221
222 private:
223
224 /*!
225 * \brief Compare les valeurs de \a a et \a b avec le comparateur TypeEqualT
226 * \retval true si \a a et \a b sont égaux,
227 * \retval false sinon.
228 */
229 static bool _eq(Real a,Real b)
230 { return math::isEqual(a,b); }
231 //! Retourne la racine carrée de \a a
232 static Real _sqrt(Real a)
233 { return math::sqrt(a); }
234};
235
236/*---------------------------------------------------------------------------*/
237/*---------------------------------------------------------------------------*/
238/*!
239 * \brief Multiplication par un scalaire.
240 */
241inline Real2 operator*(Real sca,const Real2Proxy& vec)
242{
243 return Real2(vec.x*sca,vec.y*sca);
244}
245
246/*---------------------------------------------------------------------------*/
247/*---------------------------------------------------------------------------*/
248/*!
249 * \brief Multiplication par un scalaire.
250 */
251inline Real2
252operator*(const Real2Proxy& vec,Real sca)
253{
254 return Real2(vec.x*sca,vec.y*sca);
255}
256
257/*---------------------------------------------------------------------------*/
258/*---------------------------------------------------------------------------*/
259/*!
260 * \brief Division par un scalaire.
261 */
262inline Real2
263operator/(const Real2Proxy& vec,Real sca)
264{
265 return Real2(vec.x/sca,vec.y/sca);
266}
267
268/*---------------------------------------------------------------------------*/
269/*---------------------------------------------------------------------------*/
270/*!
271 * \brief Opérateur de comparaison.
272 *
273 * Cet opérateur permet de trier les Real2Proxy pour les utiliser par exemple
274 * dans les std::set
275 */
276inline bool
277operator<(const Real2Proxy& v1,const Real2Proxy& v2)
278{
279 return v1.getValue() < v2.getValue();
280}
281
282/*---------------------------------------------------------------------------*/
283/*---------------------------------------------------------------------------*/
284/*!
285 * \brief Ecrit le couple \a t sur le flot \a o
286 * \relates Real2Proxy
287 */
288inline ostream&
289operator<< (ostream& o,Real2Proxy t)
290{
291 return t.printXy(o);
292}
293/*!
294 * \brief Lit le couple \a t à partir du flot \a o.
295 * \relates Real2Proxy
296 */
297inline istream&
298operator>> (istream& i,Real2Proxy& t)
299{
300 return t.assign(i);
301}
302
303/*---------------------------------------------------------------------------*/
304/*---------------------------------------------------------------------------*/
305
306ARCANE_END_NAMESPACE
307
308/*---------------------------------------------------------------------------*/
309/*---------------------------------------------------------------------------*/
310
311#endif
312
Classe gérant un vecteur de réel de dimension 2.
Definition Real2Proxy.h:40
Real abs2() const
Retourne la norme au carré du couple .
Definition Real2Proxy.h:106
Real2 copy() const
Retourne une copie du couple.
Definition Real2Proxy.h:77
void operator/=(Real b)
Divise chaque composante du couple par le réel b.
Definition Real2Proxy.h:149
RealProxy x
première composante du couple
Definition Real2Proxy.h:66
Real2Proxy & subSame(Real b)
Soustrait b à chaque composante du couple.
Definition Real2Proxy.h:133
Real2 operator*(Real2 b) const
Créé un couple qui vaut ce couple dont chaque composant a été multipliée par la composante correspond...
Definition Real2Proxy.h:160
Real2Proxy & mulSame(Real b)
Multiplie chaque composante du couple par b.
Definition Real2Proxy.h:135
Real2Proxy & operator/=(Real2 b)
Divise chaque composante du couple par la composant correspondant de b.
Definition Real2Proxy.h:147
Real2Proxy & sub(Real2 b)
Soustrait b au couple.
Definition Real2Proxy.h:125
void operator*=(Real b)
Multiplie chaque composante du couple par le réel b.
Definition Real2Proxy.h:145
Real2Proxy & div(Real2 b)
Divise chaque composante du couple par la composant correspondant de b.
Definition Real2Proxy.h:129
Real2Proxy & assign(Real2 f)
Copie le couple f.
Definition Real2Proxy.h:84
Real2 operator-() const
Créé un couple opposé au couple actuel.
Definition Real2Proxy.h:155
ostream & print(ostream &o) const
Ecrit le couple sur le flot o lisible par un assign()
Real2Proxy & add(Real2 b)
Ajoute b au couple.
Definition Real2Proxy.h:123
bool operator!=(Real2 b) const
Compare deux couples. Pour la notion d'égalité, voir operator==()
Definition Real2Proxy.h:206
Real abs() const
Retourne la norme du couple .
Definition Real2Proxy.h:109
Real2Proxy & normalize()
Normalise le couple.
Definition Real2Proxy.h:174
Real2Proxy & operator-=(Real2 b)
Soustrait b au couple.
Definition Real2Proxy.h:141
Real2 operator+(Real2 b) const
Créé un couple qui vaut ce couple ajouté à b.
Definition Real2Proxy.h:151
Real2Proxy & operator*=(Real2 b)
Multiplie chaque composante du couple par la composant correspondant de b.
Definition Real2Proxy.h:143
ostream & printXy(ostream &o) const
Ecrit le couple sur le flot o sous la forme (x,y)
Real2Proxy & divSame(Real b)
Divise chaque composante du couple par b.
Definition Real2Proxy.h:137
bool operator==(Real2 b) const
Compare le couple à b.
Definition Real2Proxy.h:198
Real2Proxy & reset()
Réinitialise le couple avec les constructeurs par défaut.
Definition Real2Proxy.h:79
Real2Proxy & addSame(Real b)
Ajoute b à chaque composante du couple.
Definition Real2Proxy.h:131
Real2 operator/(Real2 b) const
Créé un couple qui vaut ce couple dont chaque composant a été divisée par la composante correspondant...
Definition Real2Proxy.h:165
Real2Proxy & mul(Real2 b)
Multiple chaque composante du couple par la composant correspondant de b.
Definition Real2Proxy.h:127
bool isNearlyZero() const
Compare le couple avec le couple nul.
Definition Real2Proxy.h:101
const Real2 & operator=(Real v)
Affecte à l'instance le couple (v,v).
Definition Real2Proxy.h:54
RealProxy y
deuxième composante du couple
Definition Real2Proxy.h:67
Real2Proxy & operator+=(Real2 b)
Ajoute b au couple.
Definition Real2Proxy.h:139
Real2Proxy & assign(Real ax, Real ay)
Affecte à l'instance le couple (ax,ay,az)
Definition Real2Proxy.h:81
istream & assign(istream &i)
Lit un couple sur le flot i Le couple est lu sous la forme de trois valeur de type #value_type.
Real2Proxy(Real2 &value, const MemoryAccessInfo &info)
Construit le couplet (ax,ay)
Definition Real2Proxy.h:44
Real2 operator-(Real2 b) const
Créé un couple qui vaut b soustrait de ce couple.
Definition Real2Proxy.h:153
Real2Proxy(const Real2Proxy &f)
Construit un couple identique à f.
Definition Real2Proxy.h:47
Classe gérant un vecteur de réel de dimension 2.
Definition Real2.h:121
Real2 operator*(Real sca, const Real2Proxy &vec)
Multiplication par un scalaire.
Definition Real2Proxy.h:241
bool operator<(const Item &item1, const Item &item2)
Compare deux entités.
Definition Item.h:533
Real2 operator/(const Real2Proxy &vec, Real sca)
Division par un scalaire.
Definition Real2Proxy.h:263
double Real
Type représentant un réel.
Real y
deuxième composante du couple
Definition Real2.h:35
Real x
première composante du couple
Definition Real2.h:34