12#ifndef ARCANE_UTILS_ARRAYEXTENTS_H
13#define ARCANE_UTILS_ARRAYEXTENTS_H
17#include "arcane/utils/ArrayView.h"
18#include "arcane/utils/ArrayIndex.h"
19#include "arcane/utils/ArrayLayout.h"
20#include "arcane/utils/ArrayExtentsValue.h"
22#include "arccore/base/Span.h"
36class ArrayStridesBase<0>
40 ArrayStridesBase() =
default;
62template <
int RankValue>
67 ArrayStridesBase() =
default;
69 ARCCORE_HOST_DEVICE
Int32 stride(
int i)
const {
return m_strides[i]; }
70 ARCCORE_HOST_DEVICE
Int32 operator()(
int i)
const {
return m_strides[i]; }
71 ARCCORE_HOST_DEVICE SmallSpan<const Int32> asSpan()
const {
return { m_strides.data(), RankValue }; }
76 for (
int i = 0; i < RankValue; i++)
77 nb_element *= m_strides[i];
81 ARCCORE_HOST_DEVICE
ArrayStridesBase<RankValue - 1> removeFirstStride()
const
91 ArrayStridesBase<RankValue> v;
93 for (
int i = 0; i < RankValue; ++i)
94 v.m_strides[i] = strides[i];
100 std::array<Int32, RankValue> m_strides = {};
116 ArrayExtentsBase() =
default;
133template <
typename Extents>
134class ArrayExtentsBase
135:
protected Extents::ArrayExtentsValueType
139 using BaseClass =
typename Extents::ArrayExtentsValueType;
140 using ArrayExtentsPreviousRank = ArrayExtentsBase<typename Extents::RemovedFirstExtentsType>;
141 using DynamicDimsType =
typename Extents::DynamicDimsType;
145 using BaseClass::asStdArray;
146 using BaseClass::constExtent;
147 using BaseClass::dynamicExtents;
148 using BaseClass::getIndices;
149 using BaseClass::totalNbElement;
153 ARCCORE_HOST_DEVICE
constexpr ArrayExtentsBase()
164 explicit constexpr ARCCORE_HOST_DEVICE ArrayExtentsBase(DynamicDimsType extents)
175 ARCCORE_HOST_DEVICE ArrayExtentsPreviousRank removeFirstExtent()
const
177 auto x = BaseClass::_removeFirstExtent();
182 template <Int32 I>
constexpr ARCCORE_HOST_DEVICE Int64 constLargeExtent()
const
184 return BaseClass::template constExtent<I>();
192 return ArrayExtentsBase<Extents>(extents);
201template <
typename SizeType_,
int X0>
203:
public ArrayExtentsBase<ExtentsV<SizeType_, X0>>
208 using BaseClass = ArrayExtentsBase<ExtentsType>;
209 using BaseClass::totalNbElement;
210 using DynamicDimsType =
typename ExtentsType::DynamicDimsType;
214 ArrayExtents() =
default;
215 constexpr ARCCORE_HOST_DEVICE ArrayExtents(
const BaseClass& rhs)
218 constexpr ARCCORE_HOST_DEVICE ArrayExtents(
const DynamicDimsType& extents)
223 constexpr ARCCORE_HOST_DEVICE
explicit ArrayExtents(
Int32 dim1_size)
225 static_assert(ExtentsType::nb_dynamic == 1,
"This method is only allowed for full dynamic extents");
226 this->m_extent0.v = dim1_size;
235template <
typename SizeType_,
int X0,
int X1>
237:
public ArrayExtentsBase<ExtentsV<SizeType_, X0, X1>>
242 using BaseClass = ArrayExtentsBase<ExtentsType>;
243 using BaseClass::totalNbElement;
244 using DynamicDimsType =
typename ExtentsType::DynamicDimsType;
248 ArrayExtents() =
default;
249 constexpr ARCCORE_HOST_DEVICE ArrayExtents(
const BaseClass& rhs)
252 constexpr ARCCORE_HOST_DEVICE ArrayExtents(
const DynamicDimsType& extents)
257 constexpr ARCCORE_HOST_DEVICE ArrayExtents(
Int32 dim1_size,
Int32 dim2_size)
259 static_assert(ExtentsType::nb_dynamic == 2,
"This method is only allowed for full dynamic extents");
260 this->m_extent0.v = dim1_size;
261 this->m_extent1.v = dim2_size;
270template <
typename SizeType_,
int X0,
int X1,
int X2>
272:
public ArrayExtentsBase<ExtentsV<SizeType_, X0, X1, X2>>
277 using BaseClass = ArrayExtentsBase<ExtentsType>;
278 using BaseClass::totalNbElement;
279 using DynamicDimsType =
typename BaseClass::DynamicDimsType;
283 ArrayExtents() =
default;
284 constexpr ARCCORE_HOST_DEVICE ArrayExtents(
const BaseClass& rhs)
287 constexpr ARCCORE_HOST_DEVICE ArrayExtents(
const DynamicDimsType& extents)
292 constexpr ARCCORE_HOST_DEVICE ArrayExtents(
Int32 dim1_size,
Int32 dim2_size,
Int32 dim3_size)
294 static_assert(ExtentsType::nb_dynamic == 3,
"This method is only allowed for full dynamic extents");
295 this->m_extent0.v = dim1_size;
296 this->m_extent1.v = dim2_size;
297 this->m_extent2.v = dim3_size;
306template <
typename SizeType_,
int X0,
int X1,
int X2,
int X3>
307class ArrayExtents<
ExtentsV<SizeType_, X0, X1, X2, X3>>
308:
public ArrayExtentsBase<ExtentsV<SizeType_, X0, X1, X2, X3>>
313 using BaseClass = ArrayExtentsBase<ExtentsType>;
314 using BaseClass::totalNbElement;
315 using DynamicDimsType =
typename BaseClass::DynamicDimsType;
319 ArrayExtents() =
default;
320 constexpr ARCCORE_HOST_DEVICE ArrayExtents(
const BaseClass& rhs)
323 constexpr ARCCORE_HOST_DEVICE ArrayExtents(
const DynamicDimsType& extents)
328 constexpr ARCCORE_HOST_DEVICE ArrayExtents(
Int32 dim1_size,
Int32 dim2_size,
Int32 dim3_size,
Int32 dim4_size)
330 static_assert(ExtentsType::nb_dynamic == 4,
"This method is only allowed for full dynamic extents");
331 this->m_extent0.v = dim1_size;
332 this->m_extent1.v = dim2_size;
333 this->m_extent2.v = dim3_size;
334 this->m_extent3.v = dim4_size;
346template <
typename SizeType_,
int X0,
typename LayoutType>
347class ArrayExtentsWithOffset<
ExtentsV<SizeType_, X0>, LayoutType>
348:
private ArrayExtents<ExtentsV<SizeType_, X0>>
353 using BaseClass = ArrayExtents<ExtentsType>;
354 using BaseClass::asStdArray;
355 using BaseClass::extent0;
356 using BaseClass::getIndices;
357 using BaseClass::totalNbElement;
358 using Layout =
typename LayoutType::Layout1Type;
359 using DynamicDimsType =
typename BaseClass::DynamicDimsType;
360 using MDIndexType =
typename BaseClass::MDIndexType;
362 using IndexType ARCANE_DEPRECATED_REASON(
"Use 'MDIndexType' instead") =
typename BaseClass::MDIndexType;
366 ArrayExtentsWithOffset() =
default;
368 constexpr ARCCORE_HOST_DEVICE ArrayExtentsWithOffset(
const ArrayExtents<ExtentsType>& rhs)
372 constexpr ARCCORE_HOST_DEVICE ArrayExtentsWithOffset(
const DynamicDimsType& rhs)
376 constexpr ARCCORE_HOST_DEVICE
Int64 offset(
Int32 i)
const
378 BaseClass::_checkIndex(i);
381 constexpr ARCCORE_HOST_DEVICE
Int64 offset(MDIndexType idx)
const
383 BaseClass::_checkIndex(idx.id0());
386 constexpr BaseClass extents()
const
388 const BaseClass* b =
this;
398template <
typename SizeType_,
int X0,
int X1,
typename LayoutType>
399class ArrayExtentsWithOffset<
ExtentsV<SizeType_, X0, X1>, LayoutType>
400:
private ArrayExtents<ExtentsV<SizeType_, X0, X1>>
405 using BaseClass = ArrayExtents<ExtentsType>;
406 using BaseClass::asStdArray;
407 using BaseClass::extent0;
408 using BaseClass::extent1;
409 using BaseClass::getIndices;
410 using BaseClass::totalNbElement;
411 using Layout =
typename LayoutType::Layout2Type;
412 using DynamicDimsType =
typename BaseClass::DynamicDimsType;
413 using MDIndexType =
typename BaseClass::MDIndexType;
415 using IndexType ARCANE_DEPRECATED_REASON(
"Use 'MDIndexType' instead") =
typename BaseClass::MDIndexType;
419 ArrayExtentsWithOffset() =
default;
421 constexpr ARCCORE_HOST_DEVICE ArrayExtentsWithOffset(ArrayExtents<ExtentsType> rhs)
425 constexpr ARCCORE_HOST_DEVICE ArrayExtentsWithOffset(
const DynamicDimsType& rhs)
431 return offset({ i, j });
433 constexpr ARCCORE_HOST_DEVICE
Int64 offset(MDIndexType idx)
const
435 BaseClass::_checkIndex(idx);
436 return Layout::offset(idx, this->
template constExtent<Layout::LastExtent>());
438 constexpr BaseClass extents()
const
440 const BaseClass* b =
this;
450template <
typename SizeType_,
int X0,
int X1,
int X2,
typename LayoutType>
451class ArrayExtentsWithOffset<
ExtentsV<SizeType_, X0, X1, X2>, LayoutType>
452:
private ArrayExtents<ExtentsV<SizeType_, X0, X1, X2>>
457 using BaseClass = ArrayExtents<ExtentsType>;
458 using BaseClass::asStdArray;
459 using BaseClass::extent0;
460 using BaseClass::extent1;
461 using BaseClass::extent2;
462 using BaseClass::getIndices;
463 using BaseClass::totalNbElement;
464 using Layout =
typename LayoutType::Layout3Type;
465 using DynamicDimsType =
typename BaseClass::DynamicDimsType;
466 using MDIndexType =
typename BaseClass::MDIndexType;
468 using IndexType ARCANE_DEPRECATED_REASON(
"Use 'MDIndexType' instead") =
typename BaseClass::MDIndexType;
472 ArrayExtentsWithOffset() =
default;
474 constexpr ARCCORE_HOST_DEVICE ArrayExtentsWithOffset(ArrayExtents<ExtentsType> rhs)
479 constexpr ARCCORE_HOST_DEVICE ArrayExtentsWithOffset(
const DynamicDimsType& rhs)
486 return offset({ i, j, k });
488 constexpr ARCCORE_HOST_DEVICE
Int64 offset(MDIndexType idx)
const
490 this->_checkIndex(idx);
491 return Layout::offset(idx, this->
template constExtent<Layout::LastExtent>(), m_dim23_size);
493 constexpr BaseClass extents()
const
495 const BaseClass* b =
this;
501 ARCCORE_HOST_DEVICE
void _computeOffsets()
503 const BaseClass& b = *
this;
504 m_dim23_size = Layout::computeOffsetIndexes(b);
509 Int64 m_dim23_size = 0;
517template <
typename SizeType_,
int X0,
int X1,
int X2,
int X3,
typename LayoutType>
518class ArrayExtentsWithOffset<
ExtentsV<SizeType_, X0, X1, X2, X3>, LayoutType>
519:
private ArrayExtents<ExtentsV<SizeType_, X0, X1, X2, X3>>
524 using BaseClass = ArrayExtents<ExtentsType>;
525 using BaseClass::asStdArray;
526 using BaseClass::extent0;
527 using BaseClass::extent1;
528 using BaseClass::extent2;
529 using BaseClass::extent3;
530 using BaseClass::getIndices;
531 using BaseClass::totalNbElement;
532 using Layout =
typename LayoutType::Layout4Type;
533 using DynamicDimsType =
typename BaseClass::DynamicDimsType;
534 using MDIndexType =
typename BaseClass::MDIndexType;
536 using IndexType ARCANE_DEPRECATED_REASON(
"Use 'MDIndexType' instead") =
typename BaseClass::MDIndexType;
540 ArrayExtentsWithOffset() =
default;
542 constexpr ARCCORE_HOST_DEVICE ArrayExtentsWithOffset(ArrayExtents<ExtentsType> rhs)
547 constexpr ARCCORE_HOST_DEVICE ArrayExtentsWithOffset(
const DynamicDimsType& rhs)
554 return offset({ i, j, k, l });
556 constexpr ARCCORE_HOST_DEVICE
Int64 offset(MDIndexType idx)
const
558 this->_checkIndex(idx);
559 return (
m_dim234_size * idx.largeId0()) +
m_dim34_size * idx.largeId1() + this->m_extent3.v * idx.largeId2() + idx.largeId3();
561 BaseClass extents()
const
563 const BaseClass* b =
this;
569 ARCCORE_HOST_DEVICE
void _computeOffsets()
constexpr __host__ __device__ SmallSpan< const Int32 > asSpan() const
Nombre d'élément de la i-ème dimension.
constexpr __host__ __device__ Int32 totalNbElement() const
Nombre total d'eléments.
Classe pour conserver le nombre d'éléments dans chaque dimension.
__host__ __device__ void setExtent0(Int32 v)
TEMPORARY: Positionne à v le nombre d'éléments de la dimension 0.
__host__ static __device__ ArrayExtentsBase< Extents > fromSpan(SmallSpan< const Int32 > extents)
Construit une instance à partir des valeurs données dans extents.
Int64 m_dim234_size
dim2 * dim3 * dim4
Int64 m_dim34_size
dim3 * dim4
__host__ __device__ SmallSpan< const Int32 > asSpan() const
Valeur du pas de la i-ème dimension.
__host__ __device__ Int64 totalStride() const
Value totale du pas.
Classe pour conserver le pas dans chaque dimension.
__host__ static __device__ ArrayStridesBase< RankValue > fromSpan(Span< const Int32 > strides)
Construit une instance à partir des valeurs données dans stride.
__host__ __device__ Int64 totalStride() const
Valeur totale du pas.
__host__ __device__ Int32 stride(int i) const
Valeur du pas de la i-ème dimension.
Vue d'un tableau d'éléments de type T.
Vue d'un tableau d'éléments de type T.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.