Arcane  v3.16.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Span2.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* Span2.h (C) 2000-2025 */
9/* */
10/* Vue d'un tableau 2D dont les dimensions utilisent des Int64. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_BASE_SPAN2_H
13#define ARCCORE_BASE_SPAN2_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18#include "arccore/base/TraceInfo.h"
19#include "arccore/base/Array2View.h"
20
21#include <type_traits>
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28
29namespace detail
30{
31// Pour indiquer que Span2<T>::view() retourne un Array2View
32// et Span2<const T>::view() retourne un ConstArray2View.
33template<typename T>
35{
36 public:
37 using view_type = Array2View<T>;
38};
39template<typename T>
40class View2TypeT<const T>
41{
42 public:
43 using view_type = ConstArray2View<T>;
44};
45}
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49/*!
50 * \ingroup Collection
51 *
52 * \brief Vue pour un tableau 2D.
53 *
54 * Comme toute vue, une instance de cette classe n'est valide que tant
55 * que le conteneur dont elle est issue ne change pas de nombre d'éléments.
56 * La vue est non modifiable si l'argument template est de type 'const T'.
57 * Cette classe permet d'accéder et d'utiliser un tableau d'éléments du
58 * type \a T de la même manière qu'un tableau C standard. \a SizeType est le
59 * type utilisé pour conserver le nombre d'éléments du tableau. Cela peut
60 * être 'Int32' ou 'Int64'.
61 */
62template<typename T,typename SizeType,SizeType Extent1,SizeType Extent2>
64{
66
67 public:
68
69 using ElementType = T;
70 using element_type = ElementType;
71 using value_type = typename std::remove_cv<ElementType>::type;
72 using index_type = SizeType;
73 using difference_type = SizeType;
74 using size_type = SizeType;
75 using pointer = ElementType*;
76 using const_pointer = typename std::add_const<ElementType*>::type;
77 using reference = ElementType&;
78 using const_reference = const ElementType&;
79 using view_type = typename detail::View2TypeT<ElementType>::view_type;
80
81 //! Indique si on peut convertir un 'X' ou 'const X' en un 'T'
82 template<typename X>
83 using is_same_const_type = std::enable_if_t<std::is_same_v<X,T> || std::is_same_v<std::add_const_t<X>,T>>;
84
85 public:
86
87 //! Créé une vue 2D de dimension [\a dim1_size][\a dim2_size]
88 ARCCORE_HOST_DEVICE Span2Impl(pointer ptr,SizeType dim1_size,SizeType dim2_size)
89 : m_ptr(ptr), m_dim1_size(dim1_size), m_dim2_size(dim2_size) {}
90 //! Créé une vue 2D vide.
91 ARCCORE_HOST_DEVICE Span2Impl() : m_ptr(nullptr), m_dim1_size(0), m_dim2_size(0) {}
92 // Constructeur à partir d'un ConstArrayView. Cela n'est autorisé que
93 // si T est const.
94 template<typename X,typename = std::enable_if_t<std::is_same_v<X,value_type>> >
95 Span2Impl(const ConstArray2View<X>& from)
96 : m_ptr(from.data()), m_dim1_size(from.dim1Size()),m_dim2_size(from.dim2Size()) {}
97 // Pour un Span<const T>, on a le droit de construire depuis un Span<T>
98 template<typename X,typename = std::enable_if_t<std::is_same_v<X,value_type>> >
99 ARCCORE_HOST_DEVICE Span2Impl(const Span2<X>& from)
100 : m_ptr(from.data()), m_dim1_size(from.dim1Size()),m_dim2_size(from.dim2Size()) {}
101
102 public:
103
104 //! Nombre d'éléments de la première dimension
105 constexpr ARCCORE_HOST_DEVICE SizeType dim1Size() const { return m_dim1_size; }
106 //! Nombre d'éléments de la deuxième dimension
107 constexpr ARCCORE_HOST_DEVICE SizeType dim2Size() const { return m_dim2_size; }
108 //! Nombre total d'éléments.
109 constexpr ARCCORE_HOST_DEVICE SizeType totalNbElement() const { return m_dim1_size*m_dim2_size; }
110
111 public:
112
113 constexpr ARCCORE_HOST_DEVICE SpanImpl<ElementType,SizeType> operator[](SizeType i) const
114 {
115 ARCCORE_CHECK_AT(i,m_dim1_size);
116 return SpanImpl<ElementType,SizeType>(m_ptr + (m_dim2_size*i),m_dim2_size);
117 }
118
119 constexpr ARCCORE_HOST_DEVICE SpanImpl<ElementType,SizeType> operator()(SizeType i) const
120 {
121 ARCCORE_CHECK_AT(i,m_dim1_size);
122 return SpanImpl<ElementType,SizeType>(m_ptr + (m_dim2_size*i),m_dim2_size);
123 }
124
125 constexpr ARCCORE_HOST_DEVICE reference operator()(SizeType i,SizeType j) const
126 {
127 ARCCORE_CHECK_AT2(i,j,m_dim1_size,m_dim2_size);
128 return m_ptr[(m_dim2_size*i) + j];
129 }
130
131#ifdef ARCCORE_HAS_MULTI_SUBSCRIPT
132 constexpr ARCCORE_HOST_DEVICE reference operator[](SizeType i,SizeType j) const
133 {
134 ARCCORE_CHECK_AT2(i,j,m_dim1_size,m_dim2_size);
135 return m_ptr[(m_dim2_size*i) + j];
136 }
137#endif
138
139 //! Valeur de l'élément [\a i][\a j]
140 constexpr ARCCORE_HOST_DEVICE ElementType item(SizeType i,SizeType j) const
141 {
142 ARCCORE_CHECK_AT2(i,j,m_dim1_size,m_dim2_size);
143 return m_ptr[(m_dim2_size*i) + j];
144 }
145
146 //! Positionne l'élément [\a i][\a j] à \a value
147 constexpr ARCCORE_HOST_DEVICE ElementType setItem(SizeType i,SizeType j,const ElementType& value)
148 {
149 ARCCORE_CHECK_AT2(i,j,m_dim1_size,m_dim2_size);
150 m_ptr[(m_dim2_size*i) + j] = value;
151 }
152
153 public:
154
155 /*!
156 * \brief Vue constante sur cette vue.
157 */
158 constexpr view_type smallView()
159 {
160 Integer s1 = arccoreCheckArraySize(m_dim1_size);
161 Integer s2 = arccoreCheckArraySize(m_dim2_size);
162 return view_type(m_ptr,s1,s2);
163 }
164
165 /*!
166 * \brief Vue constante sur cette vue.
167 */
169 {
170 Integer s1 = arccoreCheckArraySize(m_dim1_size);
171 Integer s2 = arccoreCheckArraySize(m_dim2_size);
172 return ConstArrayView<value_type>(m_ptr,s1,s2);
173 }
174
175 public:
176
177 //! Pointeur sur la mémoire allouée.
178 constexpr ElementType* unguardedBasePointer() { return m_ptr; }
179
180 //! Pointeur sur la mémoire allouée.
181 constexpr ARCCORE_HOST_DEVICE ElementType* data() { return m_ptr; }
182
183 //! Pointeur sur la mémoire allouée.
184 constexpr ARCCORE_HOST_DEVICE const ElementType* data() const { return m_ptr; }
185
186 public:
187
188 //! Opérateur d'égalité (valide si T est const mais pas X)
189 template<typename X,SizeType XExtent1,SizeType XExtent2, typename = std::enable_if_t<std::is_same_v<X,value_type>>>
190 friend bool operator==(const ThatClass& lhs, const Span2Impl<X,SizeType,XExtent1,XExtent2>& rhs)
191 {
192 return impl::areEqual2D(rhs,lhs);
193 }
194 //! Opérateur d'inégalité (valide si T est const mais pas X)
195 template<typename X,SizeType XExtent1,SizeType XExtent2, typename = std::enable_if_t<std::is_same_v<X,value_type>>>
196 friend bool operator!=(const ThatClass& lhs, const Span2Impl<X,SizeType,XExtent1,XExtent2>& rhs)
197 {
198 return !impl::areEqual2D(rhs,lhs);
199 }
200 //! Opérateur d'égalité
201 template<SizeType XExtent1,SizeType XExtent2>
202 friend bool operator==(const ThatClass& lhs, const Span2Impl<T,SizeType,XExtent1,XExtent2>& rhs)
203 {
204 return impl::areEqual2D(rhs,lhs);
205 }
206 //! Opérateur d'inégalité
207 template<SizeType XExtent1,SizeType XExtent2>
208 friend bool operator!=(const ThatClass& lhs, const Span2Impl<T,SizeType,XExtent1,XExtent2>& rhs)
209 {
210 return !impl::areEqual2D(rhs,lhs);
211 }
212
213 protected:
214
215 ElementType* m_ptr;
216 SizeType m_dim1_size;
217 SizeType m_dim2_size;
218};
219
220/*---------------------------------------------------------------------------*/
221/*---------------------------------------------------------------------------*/
222/*!
223 * \ingroup Collection
224 *
225 * \brief Vue pour un tableau 2D dont la taille est un 'Int32'
226 *
227 * Comme toute vue, une instance de cette classe n'est valide que tant
228 * que le conteneur dont elle est issue ne change pas de nombre d'éléments.
229 */
230template<class T,Int32 Extent1,Int32 Extent2>
232: public Span2Impl<T,Int32,Extent1,Extent2>
233{
234 friend class Span2<T>;
235
236 public:
237
238 using ThatClass = SmallSpan2<T,Extent1,Extent2>;
239 using BaseClass = Span2Impl<T,Int32,Extent1,Extent2>;
240 using size_type = Int32;
241 using value_type = typename BaseClass::value_type;
242 using pointer = typename BaseClass::pointer;
243 using BaseClass::operator();
244 using BaseClass::operator[];
245 using ElementType = typename BaseClass::ElementType;
246
247 private:
248
249 using BaseClass::m_ptr;
250 using BaseClass::m_dim1_size;
251 using BaseClass::m_dim2_size;
252
253 public:
254
255 //! Créé une vue 2D de dimension [\a dim1_size][\a dim2_size]
256 ARCCORE_HOST_DEVICE SmallSpan2(pointer ptr,Int32 dim1_size,Int32 dim2_size)
257 : BaseClass(ptr,dim1_size,dim2_size) {}
258 //! Créé une vue 2D vide.
259 ARCCORE_HOST_DEVICE SmallSpan2() : BaseClass() {}
260 //! Constructeur de recopie depuis une autre vue
262 : BaseClass(from.m_ptr,from.dim1Size(),from.dim2Size()) {}
263 // Constructeur à partir d'un ConstArrayView. Cela n'est autorisé que
264 // si T est const.
265 template<typename X,typename = std::enable_if_t<std::is_same_v<X,value_type>> >
266 SmallSpan2(const ConstArray2View<X>& from)
267 : BaseClass(from.m_ptr,from.dim1Size(),from.dim2Size()) {}
268 // Pour un Span<const T>, on a le droit de construire depuis un Span<T>
269 template<typename X,typename = std::enable_if_t<std::is_same_v<X,value_type>> >
270 ARCCORE_HOST_DEVICE SmallSpan2(const SmallSpan2<X>& from)
271 : BaseClass(from.data(),from.dim1Size(),from.dim2Size()) {}
272
273 public:
274
275 ARCCORE_HOST_DEVICE SmallSpan<ElementType> operator[](Int32 i) const
276 {
277 ARCCORE_CHECK_AT(i,m_dim1_size);
278 return SmallSpan<ElementType>(m_ptr + (m_dim2_size*i),m_dim2_size);
279 }
280
281 ARCCORE_HOST_DEVICE SmallSpan<ElementType> operator()(Int32 i) const
282 {
283 ARCCORE_CHECK_AT(i,m_dim1_size);
284 return SmallSpan<ElementType>(m_ptr + (m_dim2_size*i),m_dim2_size);
285 }
286};
287
288/*---------------------------------------------------------------------------*/
289/*---------------------------------------------------------------------------*/
290/*!
291 * \ingroup Collection
292 *
293 * \brief Vue pour un tableau 2D dont la taille est un 'Int64'
294 *
295 * Comme toute vue, une instance de cette classe n'est valide que tant
296 * que le conteneur dont elle est issue ne change pas de nombre d'éléments.
297 */
298template<class T,Int64 Extent1,Int64 Extent2>
299class Span2
300: public Span2Impl<T,Int64,Extent1,Extent2>
301{
302 public:
303
304 using ThatClass = Span2<T,Extent1,Extent2>;
305 using BaseClass = Span2Impl<T,Int64,Extent1,Extent2>;
306 using size_type = Int64;
307 using value_type = typename BaseClass::value_type;
308 using pointer = typename BaseClass::pointer;
309 using BaseClass::operator();
310 using BaseClass::operator[];
311 using ElementType = typename BaseClass::ElementType;
312
313 private:
314
315 using BaseClass::m_ptr;
316 using BaseClass::m_dim1_size;
317 using BaseClass::m_dim2_size;
318
319 public:
320
321 //! Créé une vue 2D de dimension [\a dim1_size][\a dim2_size]
322 ARCCORE_HOST_DEVICE Span2(pointer ptr,Int64 dim1_size,Int64 dim2_size)
323 : BaseClass(ptr,dim1_size,dim2_size) {}
324 //! Créé une vue 2D vide.
325 ARCCORE_HOST_DEVICE Span2() : BaseClass() {}
326 //! Constructeur de recopie depuis une autre vue
328 : BaseClass(from.m_ptr,from.dim1Size(),from.dim2Size()) {}
329 // Constructeur à partir d'un ConstArrayView. Cela n'est autorisé que
330 // si T est const.
331 template<typename X,typename = std::enable_if_t<std::is_same_v<X,value_type>> >
332 Span2(const ConstArray2View<X>& from)
333 : BaseClass(from.m_ptr,from.dim1Size(),from.dim2Size()) {}
334
335 //! Constructeur de recopie depuis un 'SmallSpan'
336 Span2(const SmallSpan2<T>& from)
337 : BaseClass(from.m_ptr,from.dim1Size(),from.dim2Size()) {}
338
339 // Pour un Span<const T>, on a le droit de construire depuis un Span<T>
340 template<typename X,typename = std::enable_if_t<std::is_same_v<X,value_type>> >
341 ARCCORE_HOST_DEVICE Span2(const Span2<X>& from)
342 : BaseClass(from) {}
343
344 // Pour un Span<const T>, on a le droit de construire depuis un Span<T>
345 template<typename X,typename = std::enable_if_t<std::is_same_v<X,value_type>> >
346 ARCCORE_HOST_DEVICE Span2(const SmallSpan2<X>& from)
347 : BaseClass(from.data(), from.dim1Size(), from.dim2Size()) {}
348
349 public:
350
351 ARCCORE_HOST_DEVICE Span<ElementType> operator[](Int64 i) const
352 {
353 ARCCORE_CHECK_AT(i,m_dim1_size);
354 return Span<ElementType>(m_ptr + (m_dim2_size*i),m_dim2_size);
355 }
356
357 ARCCORE_HOST_DEVICE Span<ElementType> operator()(Int64 i) const
358 {
359 ARCCORE_CHECK_AT(i,m_dim1_size);
360 return Span<ElementType>(m_ptr + (m_dim2_size*i),m_dim2_size);
361 }
362};
363
364/*---------------------------------------------------------------------------*/
365/*---------------------------------------------------------------------------*/
366
367} // End namespace Arccore
368
369/*---------------------------------------------------------------------------*/
370/*---------------------------------------------------------------------------*/
371
372#endif
Déclarations des types de la composante 'base' de Arccore.
Vue modifiable pour un tableau 2D.
Vue constante d'un tableau de type T.
Vue pour un tableau 2D dont la taille est un 'Int32'.
Definition Span2.h:233
__host__ __device__ SmallSpan2()
Créé une vue 2D vide.
Definition Span2.h:259
__host__ __device__ SmallSpan2(pointer ptr, Int32 dim1_size, Int32 dim2_size)
Créé une vue 2D de dimension [dim1_size][dim2_size].
Definition Span2.h:256
SmallSpan2(const Array2View< value_type > &from)
Constructeur de recopie depuis une autre vue.
Definition Span2.h:261
friend bool operator!=(const ThatClass &lhs, const Span2Impl< T, SizeType, XExtent1, XExtent2 > &rhs)
Opérateur d'inégalité
Definition Span2.h:208
constexpr __host__ __device__ ElementType * data()
Pointeur sur la mémoire allouée.
Definition Span2.h:181
friend bool operator==(const ThatClass &lhs, const Span2Impl< X, SizeType, XExtent1, XExtent2 > &rhs)
Opérateur d'égalité (valide si T est const mais pas X)
Definition Span2.h:190
std::enable_if_t< std::is_same_v< X, T >||std::is_same_v< std::add_const_t< X >, T > > is_same_const_type
Indique si on peut convertir un 'X' ou 'const X' en un 'T'.
Definition Span2.h:83
friend bool operator!=(const ThatClass &lhs, const Span2Impl< X, SizeType, XExtent1, XExtent2 > &rhs)
Opérateur d'inégalité (valide si T est const mais pas X)
Definition Span2.h:196
friend bool operator==(const ThatClass &lhs, const Span2Impl< T, SizeType, XExtent1, XExtent2 > &rhs)
Opérateur d'égalité
Definition Span2.h:202
constexpr __host__ __device__ SizeType dim2Size() const
Nombre d'éléments de la deuxième dimension.
Definition Span2.h:107
constexpr ElementType * unguardedBasePointer()
Pointeur sur la mémoire allouée.
Definition Span2.h:178
constexpr ConstArrayView< value_type > constSmallView() const
Vue constante sur cette vue.
Definition Span2.h:168
__host__ __device__ Span2Impl(pointer ptr, SizeType dim1_size, SizeType dim2_size)
Créé une vue 2D de dimension [dim1_size][dim2_size].
Definition Span2.h:88
constexpr view_type smallView()
Vue constante sur cette vue.
Definition Span2.h:158
constexpr __host__ __device__ ElementType item(SizeType i, SizeType j) const
Valeur de l'élément [i][j].
Definition Span2.h:140
constexpr __host__ __device__ SizeType totalNbElement() const
Nombre total d'éléments.
Definition Span2.h:109
__host__ __device__ Span2Impl()
Créé une vue 2D vide.
Definition Span2.h:91
constexpr __host__ __device__ ElementType setItem(SizeType i, SizeType j, const ElementType &value)
Positionne l'élément [i][j] à value.
Definition Span2.h:147
constexpr __host__ __device__ const ElementType * data() const
Pointeur sur la mémoire allouée.
Definition Span2.h:184
constexpr __host__ __device__ SizeType dim1Size() const
Nombre d'éléments de la première dimension.
Definition Span2.h:105
Vue pour un tableau 2D dont la taille est un 'Int64'.
Definition Span2.h:301
__host__ __device__ Span2(pointer ptr, Int64 dim1_size, Int64 dim2_size)
Créé une vue 2D de dimension [dim1_size][dim2_size].
Definition Span2.h:322
__host__ __device__ Span2()
Créé une vue 2D vide.
Definition Span2.h:325
Span2(const SmallSpan2< T > &from)
Constructeur de recopie depuis un 'SmallSpan'.
Definition Span2.h:336
Span2(const Array2View< value_type > &from)
Constructeur de recopie depuis une autre vue.
Definition Span2.h:327
Vue d'un tableau d'éléments de type T.
Definition Span.h:92
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
constexpr __host__ __device__ Integer arccoreCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
std::int32_t Int32
Type entier signé sur 32 bits.