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&;
 
   79  using view_type = 
typename detail::View2TypeT<ElementType>::view_type;
 
   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;
 
  257  : BaseClass(ptr,dim1_size,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>> >
 
  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;
 
  323  : BaseClass(ptr,dim1_size,dim2_size) {}
 
 
  325  ARCCORE_HOST_DEVICE 
Span2() : BaseClass() {}
 
  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 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éé une vue 2D vide.
__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.
friend bool operator!=(const ThatClass &lhs, const Span2Impl< T, SizeType, XExtent1, XExtent2 > &rhs)
Opérateur d'inégalité
constexpr __host__ __device__ ElementType * data()
Pointeur sur la mémoire allouée.
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)
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'.
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__ SizeType dim2Size() const
Nombre d'éléments de la deuxième dimension.
constexpr ElementType * unguardedBasePointer()
Pointeur sur la mémoire allouée.
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].
constexpr __host__ __device__ SizeType totalNbElement() const
Nombre total d'éléments.
__host__ __device__ Span2Impl()
Créé une vue 2D vide.
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__ SizeType dim1Size() const
Nombre d'éléments de la première dimension.
Vue pour un tableau 2D dont la taille est un 'Int64'.
__host__ __device__ Span2(pointer ptr, Int64 dim1_size, Int64 dim2_size)
Créé une vue 2D de dimension [dim1_size][dim2_size].
__host__ __device__ Span2()
Créé une vue 2D vide.
Span2(const SmallSpan2< T > &from)
Constructeur de recopie depuis un 'SmallSpan'.
Span2(const Array2View< value_type > &from)
Constructeur de recopie depuis 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.