12#ifndef ARCCORE_BASE_SPAN2_H
13#define ARCCORE_BASE_SPAN2_H
18#include "arccore/base/TraceInfo.h"
19#include "arccore/base/Array2View.h"
62template<
typename T,
typename SizeType,SizeType Extent1,SizeType Extent2>
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&;
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>>;
89 : m_ptr(
ptr), m_dim1_size(dim1_size), m_dim2_size(dim2_size) {}
94 template<
typename X,
typename = std::enable_if_t<std::is_same_v<X,value_type>> >
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)
115 ARCCORE_CHECK_AT(i,m_dim1_size);
119 constexpr ARCCORE_HOST_DEVICE SpanImpl<ElementType,SizeType> operator()(SizeType i)
const
121 ARCCORE_CHECK_AT(i,m_dim1_size);
122 return SpanImpl<ElementType,SizeType>(m_ptr + (m_dim2_size*i),m_dim2_size);
125 constexpr ARCCORE_HOST_DEVICE reference operator()(SizeType i,SizeType j)
const
127 ARCCORE_CHECK_AT2(i,j,m_dim1_size,m_dim2_size);
128 return m_ptr[(m_dim2_size*i) + j];
131#ifdef ARCCORE_HAS_MULTI_SUBSCRIPT
132 constexpr ARCCORE_HOST_DEVICE reference operator[](SizeType i,SizeType j)
const
134 ARCCORE_CHECK_AT2(i,j,m_dim1_size,m_dim2_size);
135 return m_ptr[(m_dim2_size*i) + j];
142 ARCCORE_CHECK_AT2(i,
j,m_dim1_size,m_dim2_size);
143 return m_ptr[(m_dim2_size*i) +
j];
149 ARCCORE_CHECK_AT2(i,
j,m_dim1_size,m_dim2_size);
150 m_ptr[(m_dim2_size*i) +
j] = value;
162 return view_type(m_ptr,
s1,
s2);
189 template<
typename X,SizeType XExtent1,SizeType XExtent2,
typename = std::enable_if_t<std::is_same_v<X,value_type>>>
192 return impl::areEqual2D(
rhs,
lhs);
195 template<
typename X,SizeType XExtent1,SizeType XExtent2,
typename = std::enable_if_t<std::is_same_v<X,value_type>>>
198 return !impl::areEqual2D(
rhs,
lhs);
201 template<SizeType XExtent1,SizeType XExtent2>
204 return impl::areEqual2D(
rhs,
lhs);
207 template<SizeType XExtent1,SizeType XExtent2>
210 return !impl::areEqual2D(
rhs,
lhs);
216 SizeType m_dim1_size;
217 SizeType m_dim2_size;
230template<
class T,Int32 Extent1,Int32 Extent2>
232:
public Span2Impl<T,Int32,Extent1,Extent2>
234 friend class Span2<T>;
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;
249 using BaseClass::m_ptr;
250 using BaseClass::m_dim1_size;
251 using BaseClass::m_dim2_size;
265 template<
typename X,
typename = std::enable_if_t<std::is_same_v<X,value_type>> >
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)
275 ARCCORE_HOST_DEVICE SmallSpan<ElementType> operator[](Int32 i)
const
277 ARCCORE_CHECK_AT(i,m_dim1_size);
278 return SmallSpan<ElementType>(m_ptr + (m_dim2_size*i),m_dim2_size);
281 ARCCORE_HOST_DEVICE SmallSpan<ElementType> operator()(Int32 i)
const
283 ARCCORE_CHECK_AT(i,m_dim1_size);
284 return SmallSpan<ElementType>(m_ptr + (m_dim2_size*i),m_dim2_size);
298template<
class T,Int64 Extent1,Int64 Extent2>
300:
public 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;
315 using BaseClass::m_ptr;
316 using BaseClass::m_dim1_size;
317 using BaseClass::m_dim2_size;
331 template<
typename X,
typename = std::enable_if_t<std::is_same_v<X,value_type>> >
340 template<
typename X,
typename = std::enable_if_t<std::is_same_v<X,value_type>> >
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)
351 ARCCORE_HOST_DEVICE Span<ElementType> operator[](Int64 i)
const
353 ARCCORE_CHECK_AT(i,m_dim1_size);
354 return Span<ElementType>(m_ptr + (m_dim2_size*i),m_dim2_size);
357 ARCCORE_HOST_DEVICE Span<ElementType> operator()(Int64 i)
const
359 ARCCORE_CHECK_AT(i,m_dim1_size);
360 return Span<ElementType>(m_ptr + (m_dim2_size*i),m_dim2_size);
Déclarations des types de la composante 'base' de Arccore.
Référence à une instance.
Vue pour un tableau 2D dont la taille est un 'Int32'.
__host__ __device__ SmallSpan2(pointer ptr, Int32 dim1_size, Int32 dim2_size)
Créé une vue 2D de dimension [dim1_size][dim2_size].
SmallSpan2(const Array2View< value_type > &from)
Constructeur de recopie depuis une autre vue.
__host__ __device__ SmallSpan2()
Créé une vue 2D vide.
constexpr __host__ __device__ ElementType item(SizeType i, SizeType j) const
Valeur de l'élément [i][j].
friend bool operator!=(const ThatClass &lhs, const Span2Impl< T, SizeType, XExtent1, XExtent2 > &rhs)
Opérateur d'inégalité
constexpr __host__ __device__ SizeType dim1Size() const
Nombre d'éléments de la première dimension.
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)
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)
constexpr __host__ __device__ SizeType totalNbElement() const
Nombre total d'éléments.
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'.
constexpr ConstArrayView< value_type > constSmallView() const
Vue constante sur cette vue.
friend bool operator==(const ThatClass &lhs, const Span2Impl< T, SizeType, XExtent1, XExtent2 > &rhs)
Opérateur d'égalité
constexpr ElementType * unguardedBasePointer()
Pointeur sur la mémoire allouée.
constexpr __host__ __device__ const ElementType * data() const
Pointeur sur la mémoire allouée.
__host__ __device__ Span2Impl()
Créé une vue 2D vide.
constexpr __host__ __device__ SizeType dim2Size() const
Nombre d'éléments de la deuxième dimension.
constexpr __host__ __device__ ElementType setItem(SizeType i, SizeType j, const ElementType &value)
Positionne l'élément [i][j] à value.
constexpr __host__ __device__ ElementType * data()
Pointeur sur la mémoire allouée.
__host__ __device__ Span2Impl(pointer ptr, SizeType dim1_size, SizeType dim2_size)
Créé une vue 2D de dimension [dim1_size][dim2_size].
constexpr view_type smallView()
Vue constante sur cette vue.
Vue pour un tableau 2D dont la taille est un 'Int64'.
Span2(const SmallSpan2< T > &from)
Constructeur de recopie depuis un 'SmallSpan'.
__host__ __device__ Span2()
Créé une vue 2D vide.
__host__ __device__ Span2(pointer ptr, Int64 dim1_size, Int64 dim2_size)
Créé une vue 2D de dimension [dim1_size][dim2_size].
Span2(const Array2View< value_type > &from)
Constructeur de recopie depuis une autre vue.
Espace de nom de Arccore.
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.