12#ifndef ARCCORE_BASE_SPAN2_H
13#define ARCCORE_BASE_SPAN2_H
18#include "arccore/base/TraceInfo.h"
65template <
typename T,
typename SizeType, SizeType Extent1, SizeType Extent2>
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;
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>>;
91 ARCCORE_HOST_DEVICE
Span2Impl(pointer ptr, SizeType dim1_size, SizeType dim2_size)
93 , m_dim1_size(dim1_size)
94 , m_dim2_size(dim2_size)
100 template <
typename X,
typename = std::enable_if_t<std::is_same_v<X, value_type>>>
107 template <
typename X,
typename = std::enable_if_t<std::is_same_v<X, value_type>>>
117 constexpr ARCCORE_HOST_DEVICE SizeType
dim1Size()
const {
return m_dim1_size; }
119 constexpr ARCCORE_HOST_DEVICE SizeType
dim2Size()
const {
return m_dim2_size; }
121 constexpr ARCCORE_HOST_DEVICE SizeType
totalNbElement()
const {
return m_dim1_size * m_dim2_size; }
127 ARCCORE_CHECK_AT(i, m_dim1_size);
131 constexpr ARCCORE_HOST_DEVICE SpanImpl<ElementType, SizeType> operator()(SizeType i)
const
133 ARCCORE_CHECK_AT(i, m_dim1_size);
134 return SpanImpl<ElementType, SizeType>(m_ptr + (m_dim2_size * i), m_dim2_size);
137 constexpr ARCCORE_HOST_DEVICE reference operator()(SizeType i, SizeType j)
const
139 ARCCORE_CHECK_AT2(i, j, m_dim1_size, m_dim2_size);
140 return m_ptr[(m_dim2_size * i) + j];
143#ifdef ARCCORE_HAS_MULTI_SUBSCRIPT
144 constexpr ARCCORE_HOST_DEVICE reference operator[](SizeType i, SizeType j)
const
146 ARCCORE_CHECK_AT2(i, j, m_dim1_size, m_dim2_size);
147 return m_ptr[(m_dim2_size * i) + j];
152 constexpr ARCCORE_HOST_DEVICE ElementType
item(SizeType i, SizeType j)
const
154 ARCCORE_CHECK_AT2(i, j, m_dim1_size, m_dim2_size);
155 return m_ptr[(m_dim2_size * i) + j];
159 constexpr ARCCORE_HOST_DEVICE ElementType
setItem(SizeType i, SizeType j,
const ElementType& value)
161 ARCCORE_CHECK_AT2(i, j, m_dim1_size, m_dim2_size);
162 m_ptr[(m_dim2_size * i) + j] = value;
174 return view_type(m_ptr, s1, s2);
193 constexpr ARCCORE_HOST_DEVICE ElementType*
data() {
return m_ptr; }
196 constexpr ARCCORE_HOST_DEVICE
const ElementType*
data()
const {
return m_ptr; }
201 template <
typename X, SizeType XExtent1, SizeType XExtent2,
typename = std::enable_if_t<std::is_same_v<X, value_type>>>
204 return Arcane::Impl::areEqual2D(rhs, lhs);
207 template <
typename X, SizeType XExtent1, SizeType XExtent2,
typename = std::enable_if_t<std::is_same_v<X, value_type>>>
210 return !Arcane::Impl::areEqual2D(rhs, lhs);
213 template <SizeType XExtent1, SizeType XExtent2>
216 return Arcane::Impl::areEqual2D(rhs, lhs);
219 template <SizeType XExtent1, SizeType XExtent2>
222 return !Arcane::Impl::areEqual2D(rhs, lhs);
227 ElementType* m_ptr =
nullptr;
228 SizeType m_dim1_size = 0;
229 SizeType m_dim2_size = 0;
243template <
class T, Int32 Extent1, Int32 Extent2>
245:
public Span2Impl<T, Int32, Extent1, Extent2>
247 friend class Span2<T>;
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;
262 using BaseClass::m_dim1_size;
263 using BaseClass::m_dim2_size;
264 using BaseClass::m_ptr;
270 : BaseClass(ptr, dim1_size, dim2_size)
282 template <
typename X,
typename = std::enable_if_t<std::is_same_v<X, value_type>>>
287 template <
typename X,
typename = std::enable_if_t<std::is_same_v<X, value_type>>>
294 ARCCORE_HOST_DEVICE SmallSpan<ElementType> operator[](
Int32 i)
const
296 ARCCORE_CHECK_AT(i, m_dim1_size);
297 return SmallSpan<ElementType>(m_ptr + (m_dim2_size * i), m_dim2_size);
300 ARCCORE_HOST_DEVICE SmallSpan<ElementType> operator()(
Int32 i)
const
302 ARCCORE_CHECK_AT(i, m_dim1_size);
303 return SmallSpan<ElementType>(m_ptr + (m_dim2_size * i), m_dim2_size);
318template <
class T, Int64 Extent1, Int64 Extent2>
320:
public Span2Impl<T, Int64, 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;
335 using BaseClass::m_dim1_size;
336 using BaseClass::m_dim2_size;
337 using BaseClass::m_ptr;
343 : BaseClass(ptr, dim1_size, dim2_size)
355 template <
typename X,
typename = std::enable_if_t<std::is_same_v<X, value_type>>>
366 template <
typename X,
typename = std::enable_if_t<std::is_same_v<X, value_type>>>
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)
379 ARCCORE_HOST_DEVICE Span<ElementType> operator[](
Int64 i)
const
381 ARCCORE_CHECK_AT(i, m_dim1_size);
382 return Span<ElementType>(m_ptr + (m_dim2_size * i), m_dim2_size);
385 ARCCORE_HOST_DEVICE Span<ElementType> operator()(
Int64 i)
const
387 ARCCORE_CHECK_AT(i, m_dim1_size);
388 return Span<ElementType>(m_ptr + (m_dim2_size * i), m_dim2_size);
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 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()
Crée une vue 2D vide.
__host__ __device__ SmallSpan2(pointer ptr, Int32 dim1_size, Int32 dim2_size)
Crée une vue 2D de dimension [dim1_size][dim2_size].
SmallSpan2(const Array2View< value_type > &from)
Constructeur de copie à partir d'une autre vue.
friend bool operator!=(const ThatClass &lhs, const Span2Impl< T, SizeType, XExtent1, XExtent2 > &rhs)
Opérateur d'inégalité
constexpr __host__ __device__ ElementType * data()
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).
friend bool operator==(const ThatClass &lhs, const Span2Impl< T, SizeType, XExtent1, XExtent2 > &rhs)
Opérateur d'égalité
constexpr __host__ __device__ Int32 dim2Size() const
constexpr ElementType * unguardedBasePointer()
Pointeur sur la mémoire allouée.
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.
__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.
constexpr __host__ __device__ ElementType item(SizeType i, SizeType j) const
Valeur de l'élément [i][j].
Span2Impl()=default
Crée une vue 2D vide.
constexpr __host__ __device__ SizeType totalNbElement() const
Nombre total d'éléments.
constexpr __host__ __device__ ElementType setItem(SizeType i, SizeType j, const ElementType &value)
Positionne l'élément [i][j] à value.
constexpr __host__ __device__ const ElementType * data() const
Pointeur sur la mémoire allouée.
constexpr __host__ __device__ Int32 dim1Size() const
Vue pour un tableau 2D dont la taille est un 'Int64'.
__host__ __device__ Span2(pointer ptr, Int64 dim1_size, Int64 dim2_size)
Crée une vue 2D de dimension [dim1_size][dim2_size].
__host__ __device__ Span2()
Crée une vue 2D vide.
Span2(const SmallSpan2< T > &from)
Constructeur de recopie depuis un 'SmallSpan'.
Span2(const Array2View< value_type > &from)
Constructeur de copie à partir d'une autre vue.
Vue d'un tableau d'éléments de type T.
-- 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.