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