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>>;
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) {}
91 ARCCORE_HOST_DEVICE
Span2Impl() : m_ptr(nullptr), m_dim1_size(0), m_dim2_size(0) {}
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)
105 constexpr ARCCORE_HOST_DEVICE SizeType
dim1Size()
const {
return m_dim1_size; }
107 constexpr ARCCORE_HOST_DEVICE SizeType
dim2Size()
const {
return m_dim2_size; }
109 constexpr ARCCORE_HOST_DEVICE SizeType
totalNbElement()
const {
return m_dim1_size*m_dim2_size; }
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];
140 constexpr ARCCORE_HOST_DEVICE ElementType
item(SizeType i,SizeType j)
const
142 ARCCORE_CHECK_AT2(i,j,m_dim1_size,m_dim2_size);
143 return m_ptr[(m_dim2_size*i) + j];
147 constexpr ARCCORE_HOST_DEVICE ElementType
setItem(SizeType i,SizeType j,
const ElementType& value)
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);
181 constexpr ARCCORE_HOST_DEVICE ElementType*
data() {
return m_ptr; }
184 constexpr ARCCORE_HOST_DEVICE
const ElementType*
data()
const {
return m_ptr; }
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.
Vue pour un tableau 2D constant.
Vue constante d'un tableau de type T.
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.
Vue d'un tableau d'éléments de type T.
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.