Arcane  v3.14.10.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-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/* Span2.h (C) 2000-2023 */
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 Arccore
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:
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>;
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>;
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 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(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
__host__ __device__ SmallSpan2()
Créé une vue 2D vide.
Definition Span2.h:259
Vue pour un tableau 2D.
Definition Span2.h:64
constexpr __host__ __device__ ElementType item(SizeType i, SizeType j) const
Valeur de l'élément [i][j].
Definition Span2.h:140
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__ SizeType dim1Size() const
Nombre d'éléments de la première dimension.
Definition Span2.h:105
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
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
constexpr __host__ __device__ SizeType totalNbElement() const
Nombre total d'éléments.
Definition Span2.h:109
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
constexpr ConstArrayView< value_type > constSmallView() const
Vue constante sur cette vue.
Definition Span2.h:168
friend bool operator==(const ThatClass &lhs, const Span2Impl< T, SizeType, XExtent1, XExtent2 > &rhs)
Opérateur d'égalité
Definition Span2.h:202
constexpr ElementType * unguardedBasePointer()
Pointeur sur la mémoire allouée.
Definition Span2.h:178
constexpr __host__ __device__ const ElementType * data() const
Pointeur sur la mémoire allouée.
Definition Span2.h:184
__host__ __device__ Span2Impl()
Créé une vue 2D vide.
Definition Span2.h:91
constexpr __host__ __device__ SizeType dim2Size() const
Nombre d'éléments de la deuxième dimension.
Definition Span2.h:107
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__ ElementType * data()
Pointeur sur la mémoire allouée.
Definition Span2.h:181
__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
Vue pour un tableau 2D dont la taille est un 'Int64'.
Definition Span2.h:301
Span2(const SmallSpan2< T > &from)
Constructeur de recopie depuis un 'SmallSpan'.
Definition Span2.h:336
__host__ __device__ Span2()
Créé une vue 2D vide.
Definition Span2.h:325
__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
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:89
Espace de nom de Arccore.
Definition ArcaneTypes.h:24
Int32 Integer
Type représentant un entier.
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.
std::int32_t Int32
Type entier signé sur 32 bits.