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