Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Vector3.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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/* Vector3.h (C) 2000-2023 */
9/* */
10/* Vecteur à 3 dimensions. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_VECTOR3_H
13#define ARCANE_UTILS_VECTOR3_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19#include <iostream>
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29/*!
30 * \brief Classe gérant un vecteur de dimension 3 de type \a T
31 *
32 * Les 3 éléments du vecteur peuvent être accédés par \a x, \a y ou \a z.
33 */
34template <typename T>
36{
37 public:
38
39 using ThatClass = Vector3<T>;
40 using value_type = T;
41
42 public:
43
44 T x = {};
45 T y = {};
46 T z = {};
47
48 public:
49
50 //! Construit le vecteur nul.
51 constexpr ARCCORE_HOST_DEVICE
52 Vector3() = default;
53
54 //! Construit le triplet (ax,ay,az)
55 constexpr ARCCORE_HOST_DEVICE Vector3(const T& ax, const T& ay, const T& az)
56 : x(ax)
57 , y(ay)
58 , z(az)
59 {
60 }
61
62 //! Construit l'instance avec le triplet (v,v,v).
63 constexpr ARCCORE_HOST_DEVICE explicit Vector3(const T& v)
64 : x(v)
65 , y(v)
66 , z(v)
67 {
68 }
69
70 //! Construit l'instance avec le tableau \a v
71 constexpr explicit Vector3(const std::array<T, 3>& v)
72 : x(v[0])
73 , y(v[1])
74 , z(v[2])
75 {
76 }
77
78 //! Construit l'instance avec la liste \a v
79 constexpr Vector3(std::initializer_list<T> v)
80 {
81 _setFromList(v);
82 }
83
84 //! Positionne l'instance avec la liste \a v
85 constexpr Vector3& operator=(std::initializer_list<T> v)
86 {
87 _setFromList(v);
88 return (*this);
89 }
90
91 public:
92
93 friend constexpr ARCCORE_HOST_DEVICE bool
94 operator<(const Vector3<T>& v1, const Vector3<T>& v2)
95 {
96 if (v1.x == v2.x) {
97 if (v1.y == v2.y)
98 return v1.z < v2.z;
99 else
100 return v1.y < v2.y;
101 }
102 return (v1.x < v2.x);
103 }
104
105 //! Ecrit le triplet \a t sur le flot \a o
106 friend std::ostream& operator<<(std::ostream& o, const Vector3<T>& t)
107 {
108 t._print(o);
109 return o;
110 }
111
112 friend constexpr ARCCORE_HOST_DEVICE bool
113 operator==(const Vector3<T>& v1, const Vector3<T>& v2)
114 {
115 return v1.x == v2.x && v1.y == v2.y && v1.z == v2.z;
116 }
117
118 friend constexpr ARCCORE_HOST_DEVICE bool
119 operator!=(const Vector3<T>& v1, const Vector3<T>& v2)
120 {
121 return !(v1 == v2);
122 }
123
124 public:
125
126 //! Ajoute \a b à l'instance
127 constexpr ARCCORE_HOST_DEVICE void operator+=(const T& b)
128 {
129 x += b;
130 y += b;
131 z += b;
132 }
133 //! Ajoute \a b à l'instance
134 constexpr ARCCORE_HOST_DEVICE void operator+=(const ThatClass& b)
135 {
136 x += b.x;
137 y += b.y;
138 z += b.z;
139 }
140 //! Soustrait \a b à l'instance
141 constexpr ARCCORE_HOST_DEVICE void operator-=(const T& b)
142 {
143 x -= b;
144 y -= b;
145 z -= b;
146 }
147 //! Soustrait \a b à l'instance
148 constexpr ARCCORE_HOST_DEVICE void operator-=(const ThatClass& b)
149 {
150 x -= b.x;
151 y -= b.y;
152 z -= b.z;
153 }
154 //! Multiple chaque composante de l'instance par \a b
155 constexpr ARCCORE_HOST_DEVICE void operator*=(const T& b)
156 {
157 x *= b;
158 y *= b;
159 z *= b;
160 }
161 //! Divise chaque composante de l'instance par \a b
162 constexpr ARCCORE_HOST_DEVICE void operator/=(const T& b)
163 {
164 x /= b;
165 y /= b;
166 z /= b;
167 }
168 //! Somme composante par composante de \a a et \a b
169 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator+(const ThatClass& a, const ThatClass& b)
170 {
171 return ThatClass(a.x + b.x, a.y + b.y, a.z + b.z);
172 }
173 //! Retourne \a a en ajoutant \a b à chaque composante
174 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator+(const ThatClass& a, const T& b)
175 {
176 return ThatClass(a.x + b, a.y + b, a.z + b);
177 }
178 //! Retourne \a b en ajoutant \a a à chaque composante
179 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator+(const T& a, const ThatClass& b)
180 {
181 return ThatClass(a + b.x, a + b.y, a + b.z);
182 }
183 //! Soustrait chaque composante de \a a par chaque composante de \a b
184 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator-(const ThatClass& a, const ThatClass& b)
185 {
186 return ThatClass(a.x - b.x, a.y - b.y, a.z - b.z);
187 }
188 //! Soustrait chaque composante de \a a par \a b
189 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator-(const ThatClass& a, const T& b)
190 {
191 return ThatClass(a.x - b, a.y - b, a.z - b);
192 }
193 //! Retourne l'opposé de l'instance
194 constexpr ARCCORE_HOST_DEVICE ThatClass operator-() const { return ThatClass(-x, -y, -z); }
195
196 //! Multiplie chaque composante de \a b par \a a
197 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator*(const T& a, const ThatClass& b)
198 {
199 return ThatClass(b.x * a, b.y * a, b.z * a);
200 }
201 //! Multiplie chaque composante de \a a par \a b
202 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator*(const ThatClass& a, const T& b)
203 {
204 return ThatClass(a.x * b, a.y * b, a.z * b);
205 }
206 //! Divise chaque composante de \a a par \a b
207 friend constexpr ARCCORE_HOST_DEVICE ThatClass operator/(const ThatClass& a, const T& b)
208 {
209 return ThatClass(a.x / b, a.y / b, a.z / b);
210 }
211
212 private:
213
214 void _print(std::ostream& o) const
215 {
216 o << '{' << x << ',' << y << ',' << z << '}';
217 }
218 constexpr void _setFromList(std::initializer_list<T> v)
219 {
220 auto s = v.size();
221 auto ptr = v.begin();
222 if (s > 0)
223 x = *ptr;
224 ++ptr;
225 if (s > 1)
226 y = *ptr;
227 ++ptr;
228 if (s > 2)
229 z = *ptr;
230 }
231};
232
233/*---------------------------------------------------------------------------*/
234/*---------------------------------------------------------------------------*/
235
236} // namespace Arcane
237
238/*---------------------------------------------------------------------------*/
239/*---------------------------------------------------------------------------*/
240
241#endif
Déclarations des types utilisés dans Arcane.
Classe gérant un vecteur de dimension 3 de type T.
Definition Vector3.h:36
constexpr __host__ __device__ void operator-=(const T &b)
Soustrait b à l'instance.
Definition Vector3.h:141
friend std::ostream & operator<<(std::ostream &o, const Vector3< T > &t)
Ecrit le triplet t sur le flot o.
Definition Vector3.h:106
constexpr Vector3(std::initializer_list< T > v)
Construit l'instance avec la liste v.
Definition Vector3.h:79
friend constexpr __host__ __device__ ThatClass operator/(const ThatClass &a, const T &b)
Divise chaque composante de a par b.
Definition Vector3.h:207
friend constexpr __host__ __device__ ThatClass operator*(const T &a, const ThatClass &b)
Multiplie chaque composante de b par a.
Definition Vector3.h:197
constexpr __host__ __device__ void operator/=(const T &b)
Divise chaque composante de l'instance par b.
Definition Vector3.h:162
constexpr __host__ __device__ void operator*=(const T &b)
Multiple chaque composante de l'instance par b.
Definition Vector3.h:155
constexpr __host__ __device__ Vector3(const T &ax, const T &ay, const T &az)
Construit le triplet (ax,ay,az)
Definition Vector3.h:55
constexpr Vector3(const std::array< T, 3 > &v)
Construit l'instance avec le tableau v.
Definition Vector3.h:71
friend constexpr __host__ __device__ ThatClass operator-(const ThatClass &a, const ThatClass &b)
Soustrait chaque composante de a par chaque composante de b.
Definition Vector3.h:184
constexpr __host__ __device__ ThatClass operator-() const
Retourne l'opposé de l'instance.
Definition Vector3.h:194
friend constexpr __host__ __device__ ThatClass operator+(const T &a, const ThatClass &b)
Retourne b en ajoutant a à chaque composante.
Definition Vector3.h:179
constexpr __host__ __device__ void operator-=(const ThatClass &b)
Soustrait b à l'instance.
Definition Vector3.h:148
constexpr Vector3 & operator=(std::initializer_list< T > v)
Positionne l'instance avec la liste v.
Definition Vector3.h:85
friend constexpr __host__ __device__ ThatClass operator*(const ThatClass &a, const T &b)
Multiplie chaque composante de a par b.
Definition Vector3.h:202
friend constexpr __host__ __device__ ThatClass operator+(const ThatClass &a, const T &b)
Retourne a en ajoutant b à chaque composante.
Definition Vector3.h:174
constexpr __host__ __device__ void operator+=(const ThatClass &b)
Ajoute b à l'instance.
Definition Vector3.h:134
constexpr __host__ __device__ void operator+=(const T &b)
Ajoute b à l'instance.
Definition Vector3.h:127
constexpr __host__ __device__ Vector3()=default
Construit le vecteur nul.
constexpr __host__ __device__ Vector3(const T &v)
Construit l'instance avec le triplet (v,v,v).
Definition Vector3.h:63
friend constexpr __host__ __device__ ThatClass operator-(const ThatClass &a, const T &b)
Soustrait chaque composante de a par b.
Definition Vector3.h:189
friend constexpr __host__ __device__ ThatClass operator+(const ThatClass &a, const ThatClass &b)
Somme composante par composante de a et b.
Definition Vector3.h:169
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-