Arcane  v4.1.1.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Span.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* Span.h (C) 2000-2025 */
9/* */
10/* Vues sur des tableaux C. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_BASE_SPAN_H
13#define ARCCORE_BASE_SPAN_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/base/ArrayView.h"
18
19#include <type_traits>
20#include <optional>
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane::Impl
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31// Pour indiquer que Span<T>::view() retourne un ArrayView
32// et Span<const T>::view() retourne un ConstArrayView.
33template <typename T>
35{
36 public:
37
38 using view_type = ArrayView<T>;
39};
40template <typename T>
41class ViewTypeT<const T>
42{
43 public:
44
45 using view_type = ConstArrayView<T>;
46};
47
48//! Pour avoir le type (SmallSpan ou Span) en fonction de la taille (Int32 ou Int64)
49template <typename T, typename SizeType>
51
52template <typename T>
54{
55 public:
56
57 using SpanType = SmallSpan<T>;
58};
59
60template <typename T>
62{
63 public:
64
65 using SpanType = Span<T>;
66};
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
70/*!
71 * \brief Classe pour conserver la taille d'un SpanImpl.
72 *
73 * Si Extent != DynExtent, alors il n'est pas nécessaire d'avoir
74 * de conserver le nombre d'éléments dans un champ de l'instance.
75 */
76template <typename SizeType>
77class DynamicExtentStorage
78{
79 template <typename T, typename SpanSizeType, SpanSizeType SpanExtent>
80 friend class ::Arcane::SpanImpl;
81
82 public:
83
84 explicit constexpr DynamicExtentStorage(SizeType s) noexcept
85 : m_size(s)
86 {}
87
88 public:
89
90 constexpr SizeType size() const noexcept { return m_size; }
91
92 private:
93
94 SizeType m_size;
95};
96
97class ARCCORE_BASE_EXPORT ExtentStorageBase
98{
99 public:
100
101 static void _throwBadSize [[noreturn]] (Int64 wanted_size, Int64 expected_size);
102};
103
104//! Spécialisation pour le nombre d'éléments connu à la compilation
105template <typename SizeType, SizeType FixedExtent>
106class ExtentStorage
107{
108 template <typename T, typename SpanSizeType, SpanSizeType SpanExtent>
109 friend class ::Arcane::SpanImpl;
110
111 public:
112
113 explicit constexpr ExtentStorage([[maybe_unused]] SizeType s) noexcept
114 {
115#if defined(ARCCORE_CHECK) && !defined(ARCCORE_DEVICE_CODE)
116 if (s != FixedExtent)
117 ExtentStorageBase::_throwBadSize(s, FixedExtent);
118#endif
119 }
120 ExtentStorage() = default;
121
122 public:
123
124 constexpr SizeType size() const noexcept { return FixedExtent; }
125
126 private:
127
128 static constexpr SizeType m_size = FixedExtent;
129};
130
131//! Spécialisation pour le nombre d'éléments dynamique
132template <>
133class ExtentStorage<Int32, DynExtent>
134: public DynamicExtentStorage<Int32>
135{
136 using BaseClass = DynamicExtentStorage<Int32>;
137
138 public:
139
140 explicit constexpr ExtentStorage(Int32 s) noexcept
141 : BaseClass(s)
142 {}
143};
144
145//! Spécialisation pour le nombre d'éléments dynamique
146template <>
147class ExtentStorage<Int64, DynExtent>
148: public DynamicExtentStorage<Int64>
149{
150 using BaseClass = DynamicExtentStorage<Int64>;
151
152 public:
153
154 explicit constexpr ExtentStorage(Int64 s) noexcept
155 : BaseClass(s)
156 {}
157};
158
159/*---------------------------------------------------------------------------*/
160/*---------------------------------------------------------------------------*/
161
162} // namespace Arcane::Impl
163
164/*---------------------------------------------------------------------------*/
165/*---------------------------------------------------------------------------*/
166
167namespace Arcane
168{
169
170/*---------------------------------------------------------------------------*/
171/*---------------------------------------------------------------------------*/
172/*!
173 * \ingroup Collection
174 * \brief Vue d'un tableau d'éléments de type \a T.
175 *
176 * Cette classe ne doit pas être utilisée directement. Il faut utiliser
177 * Span ou SmallSpan à la place.
178 *
179 * La vue est non modifiable si l'argument template est de type 'const T'.
180 * Cette classe permet d'accéder et d'utiliser un tableau d'éléments du
181 * type \a T de la même manière qu'un tableau C standard. \a SizeType est le
182 * type utilisé pour conserver le nombre d'éléments du tableau. Cela peut
183 * être 'Int32' ou 'Int64'.
184 *
185 * Si \a Extent est différent de DynExtent (le défaut), la taille est
186 * variable, sinon elle est fixe et a pour valeur \a Extent.
187 */
188template <typename T, typename SizeType, SizeType Extent>
190{
191 using ExtentStorageType = Impl::ExtentStorage<SizeType, Extent>;
192
193 public:
194
195 using ThatClass = SpanImpl<T, SizeType, Extent>;
196 using SubSpanType = SpanImpl<T, SizeType, DynExtent>;
197 using size_type = SizeType;
198 using ElementType = T;
199 using element_type = ElementType;
200 using value_type = typename std::remove_cv_t<ElementType>;
201 using const_value_type = typename std::add_const_t<value_type>;
202 using index_type = SizeType;
203 using difference_type = SizeType;
204 using pointer = ElementType*;
205 using const_pointer = const ElementType*;
206 using reference = ElementType&;
207 using const_reference = const ElementType&;
208 using iterator = ArrayIterator<pointer>;
209 using const_iterator = ArrayIterator<const_pointer>;
210 using view_type = typename Impl::ViewTypeT<ElementType>::view_type;
211 using reverse_iterator = std::reverse_iterator<iterator>;
212 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
213
214 //! Indique si on peut convertir un 'X' ou 'const X' en un 'T'
215 template <typename X>
216 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>>;
217
218 static constexpr bool IsDynamic = (Extent == DynExtent);
219
220 public:
221
222 //! Construit une vue vide.
223 constexpr ARCCORE_HOST_DEVICE SpanImpl() noexcept
224 : m_ptr(nullptr)
225 , m_size(0)
226 {}
227
228 //! Constructeur de recopie depuis une autre vue
229 // Pour un Span<const T>, on a le droit de construire depuis un Span<T>
230 template <typename X, SizeType XExtent, typename = std::enable_if_t<std::is_same_v<const X, T>>>
231 constexpr ARCCORE_HOST_DEVICE SpanImpl(const SpanImpl<X, SizeType, XExtent>& from) noexcept
232 : m_ptr(from.data())
233 , m_size(from.size())
234 {}
235
236 template <SizeType XExtent>
237 constexpr ARCCORE_HOST_DEVICE SpanImpl(const SpanImpl<T, SizeType, XExtent>& from) noexcept
238 : m_ptr(from.data())
239 , m_size(from.size())
240 {}
241
242 //! Construit une vue sur une zone mémoire commencant par \a ptr et contenant \a asize éléments.
243 constexpr ARCCORE_HOST_DEVICE SpanImpl(pointer ptr, SizeType asize) noexcept
244 : m_ptr(ptr)
245 , m_size(asize)
246 {}
247
248 //! Construit une vue depuis un std::array
249 template <std::size_t N, typename X, typename = is_same_const_type<X>>
250 constexpr ARCCORE_HOST_DEVICE SpanImpl(std::array<X, N>& from)
251 : m_ptr(from.data())
252 , m_size(ArraySizeChecker<SizeType>::check(from.size()))
253 {}
254
255 //! Construit une vue depuis un pointeur avec une taille fixe
256 explicit constexpr ARCCORE_HOST_DEVICE SpanImpl(T* ptr) requires(!IsDynamic)
257 : m_ptr(ptr)
258 {}
259
260 //! Opérateur de recopie
261 template <std::size_t N, typename X, typename = is_same_const_type<X>>
262 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(std::array<X, N>& from)
263 {
264 m_ptr = from.data();
265 m_size = ExtentStorageType(ArraySizeChecker<SizeType>::check(from.size()));
266 return (*this);
267 }
268
269 public:
270
271 //! Construit une vue sur une zone mémoire commencant par \a ptr et
272 // contenant \a asize éléments.
273 static constexpr ThatClass create(pointer ptr, SizeType asize) noexcept
274 {
275 return ThatClass(ptr, asize);
276 }
277
278 public:
279
280 /*!
281 * \brief i-ème élément du tableau.
282 *
283 * En mode \a check, vérifie les débordements.
284 */
285 constexpr ARCCORE_HOST_DEVICE reference operator[](SizeType i) const
286 {
287 ARCCORE_CHECK_AT(i, m_size.m_size);
288 return m_ptr[i];
289 }
290
291 /*!
292 * \brief i-ème élément du tableau.
293 *
294 * En mode \a check, vérifie les débordements.
295 */
296 constexpr ARCCORE_HOST_DEVICE reference operator()(SizeType i) const
297 {
298 ARCCORE_CHECK_AT(i, m_size.m_size);
299 return m_ptr[i];
300 }
301
302 /*!
303 * \brief i-ème élément du tableau.
304 *
305 * En mode \a check, vérifie les débordements.
306 */
307 constexpr ARCCORE_HOST_DEVICE reference item(SizeType i) const
308 {
309 ARCCORE_CHECK_AT(i, m_size.m_size);
310 return m_ptr[i];
311 }
312
313 /*!
314 * \brief Positionne le i-ème élément du tableau.
315 *
316 * En mode \a check, vérifie les débordements.
317 */
318 constexpr ARCCORE_HOST_DEVICE void setItem(SizeType i, const_reference v) noexcept
319 {
320 ARCCORE_CHECK_AT(i, m_size.m_size);
321 m_ptr[i] = v;
322 }
323
324 //! Retourne la taille du tableau
325 constexpr ARCCORE_HOST_DEVICE SizeType size() const noexcept { return m_size.m_size; }
326 //! Retourne la taille du tableau en octets
327 constexpr ARCCORE_HOST_DEVICE SizeType sizeBytes() const noexcept
328 {
329 // TODO: retourner toujours un Int64
330 return static_cast<SizeType>(m_size.m_size * sizeof(value_type));
331 }
332 //! Nombre d'éléments du tableau
333 constexpr ARCCORE_HOST_DEVICE SizeType length() const noexcept { return m_size.m_size; }
334
335 /*!
336 * \brief Itérateur sur le premier élément du tableau.
337 */
338 constexpr ARCCORE_HOST_DEVICE iterator begin() const noexcept { return iterator(m_ptr); }
339 /*!
340 * \brief Itérateur sur le premier élément après la fin du tableau.
341 */
342 constexpr ARCCORE_HOST_DEVICE iterator end() const noexcept { return iterator(m_ptr + m_size.m_size); }
343 //! Itérateur inverse sur le premier élément du tableau.
344 constexpr ARCCORE_HOST_DEVICE reverse_iterator rbegin() const noexcept { return std::make_reverse_iterator(end()); }
345 //! Itérateur inverse sur le premier élément après la fin du tableau.
346 constexpr ARCCORE_HOST_DEVICE reverse_iterator rend() const noexcept { return std::make_reverse_iterator(begin()); }
347
348 public:
349
350 //! Intervalle d'itération du premier au dernièr élément.
351 ARCCORE_DEPRECATED_REASON("Y2023: Use begin()/end() instead")
352 ArrayRange<pointer> range() const
353 {
354 return ArrayRange<pointer>(m_ptr, m_ptr + m_size.m_size);
355 }
356
357 public:
358
359 //! Adresse du index-ème élément
360 constexpr ARCCORE_HOST_DEVICE pointer ptrAt(SizeType index) const
361 {
362 ARCCORE_CHECK_AT(index, m_size.m_size);
363 return m_ptr + index;
364 }
365
366 // Elément d'indice \a i. Vérifie toujours les débordements
367 constexpr ARCCORE_HOST_DEVICE reference at(SizeType i) const
368 {
369 arccoreCheckAt(i, m_size.m_size);
370 return m_ptr[i];
371 }
372
373 // Positionne l'élément d'indice \a i. Vérifie toujours les débordements
374 constexpr ARCCORE_HOST_DEVICE void setAt(SizeType i, const_reference value)
375 {
376 arccoreCheckAt(i, m_size.m_size);
377 m_ptr[i] = value;
378 }
379
380 //! Remplit le tableau avec la valeur \a o
381 ARCCORE_HOST_DEVICE inline void fill(T o)
382 {
383 for (SizeType i = 0, n = m_size.m_size; i < n; ++i)
384 m_ptr[i] = o;
385 }
386
387 /*!
388 * \brief Vue constante sur cette vue.
389 */
390 constexpr view_type smallView()
391 {
392 Integer s = arccoreCheckArraySize(m_size.m_size);
393 return view_type(s, m_ptr);
394 }
395
396 /*!
397 * \brief Vue constante sur cette vue.
398 */
400 {
401 Integer s = arccoreCheckArraySize(m_size.m_size);
402 return ConstArrayView<value_type>(s, m_ptr);
403 }
404
405 /*!
406 * \brief Sous-vue à partir de l'élément \a abegin
407 * et contenant \a asize éléments.
408 *
409 * Si `(abegin+asize` est supérieur à la taille du tableau,
410 * la vue est tronquée à cette taille, retournant éventuellement une vue vide.
411 */
412 constexpr ARCCORE_HOST_DEVICE SubSpanType subSpan(SizeType abegin, SizeType asize) const
413 {
414 if (abegin >= m_size.m_size)
415 return {};
416 asize = _min(asize, m_size.m_size - abegin);
417 return { m_ptr + abegin, asize };
418 }
419
420 /*!
421 * \brief Sous-vue à partir de l'élément \a abegin et contenant \a asize éléments.
422 * \sa subSpan()
423 */
424 constexpr ARCCORE_HOST_DEVICE SubSpanType subPart(SizeType abegin, SizeType asize) const
425 {
426 return subSpan(abegin, asize);
427 }
428
429 /*!
430 * \brief Sous-vue à partir de l'élément \a abegin
431 * et contenant \a asize éléments.
432 *
433 * Si `(abegin+asize)` est supérieur à la taille du tableau,
434 * la vue est tronquée à cette taille, retournant éventuellement une vue vide.
435 */
436 ARCCORE_DEPRECATED_REASON("Y2023: use subSpan() instead")
437 constexpr SubSpanType subView(SizeType abegin, SizeType asize) const
438 {
439 return subSpan(abegin, asize);
440 }
441
442 //! Pour compatibilité avec le C++20
443 constexpr ARCCORE_HOST_DEVICE SubSpanType subspan(SizeType abegin, SizeType asize) const
444 {
445 return subSpan(abegin, asize);
446 }
447
448 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
449 ARCCORE_DEPRECATED_REASON("Y2023: use subSpanInterval() instead")
450 constexpr SubSpanType subViewInterval(SizeType index, SizeType nb_interval) const
451 {
452 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
453 }
454
455 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
456 constexpr SubSpanType subSpanInterval(SizeType index, SizeType nb_interval) const
457 {
458 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
459 }
460
461 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
462 constexpr SubSpanType subPartInterval(SizeType index, SizeType nb_interval) const
463 {
464 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
465 }
466
467 /*!
468 * \brief Recopie le tableau \a copy_array dans l'instance.
469 *
470 * Comme aucune allocation mémoire n'est effectuée, le
471 * nombre d'éléments de \a copy_array doit être inférieur ou égal au
472 * nombre d'éléments courant. S'il est inférieur, les éléments du
473 * tableau courant situés à la fin du tableau sont inchangés
474 */
475 template <class U> ARCCORE_HOST_DEVICE void copy(const U& copy_array)
476 {
477 Int64 n = copy_array.size();
478 Int64 size_as_int64 = m_size.m_size;
479 arccoreCheckAt(n, size_as_int64 + 1);
480 const_pointer copy_begin = copy_array.data();
481 pointer to_ptr = m_ptr;
482 // On est sur que \a n tient sur un 'SizeType' car il est plus petit
483 // que \a m_size
484 SizeType n_as_sizetype = static_cast<SizeType>(n);
485 for (SizeType i = 0; i < n_as_sizetype; ++i)
486 to_ptr[i] = copy_begin[i];
487 }
488
489 //! Retourne \a true si le tableau est vide (dimension nulle)
490 constexpr ARCCORE_HOST_DEVICE bool empty() const noexcept { return m_size.m_size == 0; }
491 //! \a true si le tableau contient l'élément de valeur \a v
492 ARCCORE_HOST_DEVICE bool contains(const_reference v) const
493 {
494 for (SizeType i = 0; i < m_size.m_size; ++i) {
495 if (m_ptr[i] == v)
496 return true;
497 }
498 return false;
499 }
500
501 /*!
502 * /brief Position du premier élément de valeur \a v
503 *
504 * /param v La valeur à trouver.
505 * /return La position du premier élément de valeur \a v si présent, std::nullopt sinon.
506 */
507 std::optional<SizeType> findFirst(const_reference v) const
508 {
509 for (SizeType i = 0; i < m_size.m_size; ++i) {
510 if (m_ptr[i] == v)
511 return i;
512 }
513 return std::nullopt;
514 }
515
516 public:
517
518 constexpr ARCCORE_HOST_DEVICE void setArray(const ArrayView<T>& v) noexcept
519 {
520 m_ptr = v.m_ptr;
521 m_size = v.m_size;
522 }
523 constexpr ARCCORE_HOST_DEVICE void setArray(const Span<T>& v) noexcept
524 {
525 m_ptr = v.m_ptr;
526 m_size = v.m_size;
527 }
528
529 /*!
530 * \brief Pointeur sur le début de la vue.
531 *
532 * \warning Les accès via le pointeur retourné ne pourront pas être
533 * pas vérifiés par Arcane à la différence des accès via
534 * operator[](): aucune vérification de dépassement n'est possible,
535 * même en mode vérification.
536 */
537 constexpr ARCCORE_HOST_DEVICE pointer data() const noexcept { return m_ptr; }
538
539 //! Opérateur d'égalité (valide si T est const mais pas X)
540 template <typename X, SizeType Extent2, typename = std::enable_if_t<std::is_same_v<X, value_type>>> friend bool
542 {
543 return impl::areEqual(SpanImpl<T, SizeType>(rhs), SpanImpl<T, SizeType>(lhs));
544 }
545
546 //! Opérateur d'inégalité (valide si T est const mais pas X)
547 template <typename X, SizeType Extent2, typename = std::enable_if_t<std::is_same_v<X, value_type>>> friend bool
549 {
550 return !operator==(rhs, lhs);
551 }
552
553 //! Opérateur d'égalité
554 template <SizeType Extent2> friend bool
556 {
557 return impl::areEqual(SpanImpl<T, SizeType>(rhs), SpanImpl<T, SizeType>(lhs));
558 }
559
560 //! Opérateur d'inégalité
561 template <SizeType Extent2> friend bool
563 {
564 return !operator==(rhs, lhs);
565 }
566
567 friend inline std::ostream& operator<<(std::ostream& o, const ThatClass& val)
568 {
569 impl::dumpArray(o, Span<const T, DynExtent>(val.data(), val.size()), 500);
570 return o;
571 }
572
573 protected:
574
575 /*!
576 * \brief Modifie le pointeur et la taille du tableau.
577 *
578 * C'est à la classe dérivée de vérifier la cohérence entre le pointeur
579 * alloué et la dimension donnée.
580 */
581 constexpr void _setArray(pointer v, SizeType s) noexcept
582 {
583 m_ptr = v;
584 m_size = s;
585 }
586
587 /*!
588 * \brief Modifie le pointeur du début du tableau.
589 *
590 * C'est à la classe dérivée de vérifier la cohérence entre le pointeur
591 * alloué et la dimension donnée.
592 */
593 constexpr void _setPtr(pointer v) noexcept { m_ptr = v; }
594
595 /*!
596 * \brief Modifie la taille du tableau.
597 *
598 * C'est à la classe dérivée de vérifier la cohérence entre le pointeur
599 * alloué et la dimension donnée.
600 */
601 constexpr void _setSize(SizeType s) noexcept { m_size = ExtentStorageType(s); }
602
603 private:
604
605 pointer m_ptr; //!< Pointeur sur le tableau
606 //! Nombre d'éléments du tableau
607 ARCCORE_NO_UNIQUE_ADDRESS ExtentStorageType m_size;
608
609 private:
610
611 static constexpr SizeType _min(SizeType a, SizeType b)
612 {
613 return ((a < b) ? a : b);
614 }
615};
616
617/*---------------------------------------------------------------------------*/
618/*---------------------------------------------------------------------------*/
619/*!
620 * \ingroup Collection
621 * \brief Vue d'un tableau d'éléments de type \a T.
622 *
623 * La vue est non modifiable si l'argument template est de type 'const T'.
624 Cette classe permet d'accéder et d'utiliser un tableau d'éléments du
625 type \a T de la même manière qu'un tableau C standard. Elle est similaire à
626 ArrayView à ceci près que le nombre d'éléments est stocké sur un 'Int64' et
627 peut donc dépasser 2Go. Elle est concue pour être similaire à la classe
628 std::span du C++20.
629*/
630template <typename T, Int64 Extent>
631class Span
632: public SpanImpl<T, Int64, Extent>
633{
634 public:
635
636 using ThatClass = Span<T, Extent>;
637 using BaseClass = SpanImpl<T, Int64, Extent>;
638 using size_type = Int64;
639 using value_type = typename BaseClass::value_type;
640 using pointer = typename BaseClass::pointer;
641 template <typename X>
642 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>>;
643 static constexpr bool IsDynamic = (Extent == DynExtent);
644
645 public:
646
647 //! Construit une vue vide.
648 Span() = default;
649 //! Constructeur de recopie depuis une autre vue
650 constexpr ARCCORE_HOST_DEVICE Span(const ArrayView<value_type>& from) noexcept
651 : BaseClass(from.m_ptr, from.m_size)
652 {}
653 // Constructeur à partir d'un ConstArrayView. Cela n'est autorisé que
654 // si T est const.
655 template <typename X, typename = std::enable_if_t<std::is_same_v<X, value_type>>>
656 constexpr ARCCORE_HOST_DEVICE Span(const ConstArrayView<X>& from) noexcept
657 : BaseClass(from.m_ptr, from.m_size)
658 {}
659 // Pour un Span<const T>, on a le droit de construire depuis un Span<T>
660 template <typename X, Int64 XExtent, typename = std::enable_if_t<std::is_same_v<const X, T>>>
661 constexpr ARCCORE_HOST_DEVICE Span(const Span<X, XExtent>& from) noexcept
662 : BaseClass(from)
663 {}
664 // Pour un Span<const T>, on a le droit de construire depuis un SmallSpan<T>
665 template <typename X, Int32 XExtent, typename = std::enable_if_t<std::is_same_v<const X, T>>>
666 constexpr ARCCORE_HOST_DEVICE Span(const SmallSpan<X, XExtent>& from) noexcept
667 : BaseClass(from.data(), from.size())
668 {}
669 template <Int64 XExtent>
670 constexpr ARCCORE_HOST_DEVICE Span(const SpanImpl<T, Int64, XExtent>& from) noexcept
671 : BaseClass(from)
672 {}
673 template <Int32 XExtent>
674 constexpr ARCCORE_HOST_DEVICE Span(const SpanImpl<T, Int32, XExtent>& from) noexcept
675 : BaseClass(from.data(), from.size())
676 {}
677
678 //! Construit une vue sur une zone mémoire commencant par \a ptr et contenant \a asize éléments.
679 constexpr ARCCORE_HOST_DEVICE Span(pointer ptr, Int64 asize) noexcept
680 : BaseClass(ptr, asize)
681 {}
682
683 //! Construit une vue à partir d'un std::array.
684 template <std::size_t N, typename X, typename = is_same_const_type<X>>
685 constexpr ARCCORE_HOST_DEVICE Span(std::array<X, N>& from) noexcept
686 : BaseClass(from.data(), from.size())
687 {}
688
689 //! Construit une vue depuis un pointeur avec une taille fixe
690 explicit constexpr ARCCORE_HOST_DEVICE Span(T* ptr) requires(!IsDynamic)
691 : BaseClass(ptr)
692 {}
693
694 //! Opérateur de recopie
695 template <std::size_t N, typename X, typename = is_same_const_type<X>>
696 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(std::array<X, N>& from) noexcept
697 {
698 this->_setPtr(from.data());
699 this->_setSize(from.size());
700 return (*this);
701 }
702
703 public:
704
705 //! Construit une vue sur une zone mémoire commencant par \a ptr et
706 // contenant \a asize éléments.
707 static constexpr ThatClass create(pointer ptr, size_type asize) noexcept
708 {
709 return ThatClass(ptr, asize);
710 }
711
712 public:
713
714 /*!
715 * \brief Sous-vue à partir de l'élément \a abegin
716 * et contenant \a asize éléments.
717 *
718 * Si `(abegin+asize` est supérieur à la taille du tableau,
719 * la vue est tronquée à cette taille, retournant éventuellement une vue vide.
720 */
721 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subspan(Int64 abegin, Int64 asize) const
722 {
723 return BaseClass::subspan(abegin, asize);
724 }
725
726 /*!
727 * \brief Sous-vue à partir de l'élément \a abegin
728 * et contenant \a asize éléments.
729 *
730 * Si `(abegin+asize)` est supérieur à la taille du tableau,
731 * la vue est tronquée à cette taille, retournant éventuellement une vue vide.
732 */
733 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subSpan(Int64 abegin, Int64 asize) const
734 {
735 return BaseClass::subSpan(abegin, asize);
736 }
737
738 /*!
739 * \brief Sous-vue à partir de l'élément \a abegin
740 * et contenant \a asize éléments.
741 *
742 * Si `(abegin+asize)` est supérieur à la taille du tableau,
743 * la vue est tronquée à cette taille, retournant éventuellement une vue vide.
744 */
745 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subPart(Int64 abegin, Int64 asize) const
746 {
747 return BaseClass::subPart(abegin, asize);
748 }
749
750 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
751 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subSpanInterval(Int64 index, Int64 nb_interval) const
752 {
753 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
754 }
755
756 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
757 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subPartInterval(Int64 index, Int64 nb_interval) const
758 {
759 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
760 }
761
762 /*!
763 * \brief Sous-vue à partir de l'élément \a abegin
764 * et contenant \a asize éléments.
765 *
766 * Si `(abegin+asize)` est supérieur à la taille du tableau,
767 * la vue est tronquée à cette taille, retournant éventuellement une vue vide.
768 */
769 ARCCORE_DEPRECATED_REASON("Y2023: use subSpan() instead")
770 constexpr ARCCORE_HOST_DEVICE Span<T> subView(Int64 abegin, Int64 asize) const
771 {
772 return subspan(abegin, asize);
773 }
774
775 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
776 ARCCORE_DEPRECATED_REASON("Y2023: use subSpanInterval() instead")
777 constexpr ARCCORE_HOST_DEVICE Span<T> subViewInterval(Int64 index, Int64 nb_interval) const
778 {
779 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
780 }
781};
782
783/*---------------------------------------------------------------------------*/
784/*---------------------------------------------------------------------------*/
785/*!
786 * \ingroup Collection
787 * \brief Vue d'un tableau d'éléments de type \a T.
788 *
789 * La vue est non modifiable si l'argument template est de type 'const T'.
790 *
791 * Cette classe permet d'accéder et d'utiliser un tableau d'éléments du
792 * type \a T de la même manière qu'un tableau C standard. Elle est similaire à
793 * Span à ceci près que le nombre d'éléments est stocké sur un 'Int32'.
794 *
795 * \note Pour être valide, il faut aussi que le nombre d'octets associés à la vue
796 * (sizeBytes()) puisse tenir dans un \a Int32.
797 */
798template <typename T, Int32 Extent>
800: public SpanImpl<T, Int32, Extent>
801{
802 public:
803
804 using ThatClass = SmallSpan<T, Extent>;
805 using BaseClass = SpanImpl<T, Int32, Extent>;
806 using size_type = Int32;
807 using value_type = typename BaseClass::value_type;
808 using pointer = typename BaseClass::pointer;
809 template <typename X>
810 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>>;
811 static constexpr bool IsDynamic = (Extent == DynExtent);
812
813 public:
814
815 //! Construit une vue vide.
816 SmallSpan() = default;
817
818 //! Constructeur de recopie depuis une autre vue
819 constexpr ARCCORE_HOST_DEVICE SmallSpan(const ArrayView<value_type>& from) noexcept
820 : BaseClass(from.m_ptr, from.m_size)
821 {}
822
823 // Constructeur à partir d'un ConstArrayView. Cela n'est autorisé que
824 // si T est const.
825 template <typename X, typename = std::enable_if_t<std::is_same<X, value_type>::value>>
826 constexpr ARCCORE_HOST_DEVICE SmallSpan(const ConstArrayView<X>& from) noexcept
827 : BaseClass(from.m_ptr, from.m_size)
828 {}
829
830 // Pour un Span<const T>, on a le droit de construire depuis un Span<T>
831 template <typename X, typename = std::enable_if_t<std::is_same<X, value_type>::value>>
832 constexpr ARCCORE_HOST_DEVICE SmallSpan(const SmallSpan<X>& from) noexcept
833 : BaseClass(from)
834 {}
835
836 template <Int32 XExtent>
837 constexpr ARCCORE_HOST_DEVICE SmallSpan(const SpanImpl<T, Int32, XExtent>& from) noexcept
838 : BaseClass(from)
839 {}
840
841 //! Construit une vue sur une zone mémoire commencant par \a ptr et contenant \a asize éléments.
842 constexpr ARCCORE_HOST_DEVICE SmallSpan(pointer ptr, Int32 asize) noexcept
843 : BaseClass(ptr, asize)
844 {}
845
846 template <std::size_t N, typename X, typename = is_same_const_type<X>>
847 constexpr ARCCORE_HOST_DEVICE SmallSpan(std::array<X, N>& from)
848 : BaseClass(from)
849 {}
850
851 //! Construit une vue depuis un pointeur avec une taille fixe
852 explicit constexpr ARCCORE_HOST_DEVICE SmallSpan(T* ptr) requires(!IsDynamic)
853 : BaseClass(ptr)
854 {}
855
856 //! Opérateur de recopie
857 template <std::size_t N, typename X, typename = is_same_const_type<X>>
858 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(std::array<X, N>& from)
859 {
861 return (*this);
862 }
863
864 public:
865
866 //! Construit une vue sur une zone mémoire commencant par \a ptr et
867 // contenant \a asize éléments.
868 static constexpr ThatClass create(pointer ptr, size_type asize) noexcept
869 {
870 return ThatClass(ptr, asize);
871 }
872
873 public:
874
875 /*!
876 * \brief Sous-vue à partir de l'élément \a abegin
877 * et contenant \a asize éléments.
878 *
879 * Si `(abegin+asize` est supérieur à la taille du tableau,
880 * la vue est tronquée à cette taille, retournant éventuellement une vue vide.
881 */
882 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subspan(Int32 abegin, Int32 asize) const
883 {
884 return BaseClass::subspan(abegin, asize);
885 }
886
887 /*!
888 * \brief Sous-vue à partir de l'élément \a abegin
889 * et contenant \a asize éléments.
890 *
891 * Si `(abegin+asize)` est supérieur à la taille du tableau,
892 * la vue est tronquée à cette taille, retournant éventuellement une vue vide.
893 */
894 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subSpan(Int32 abegin, Int32 asize) const
895 {
896 return BaseClass::subSpan(abegin, asize);
897 }
898
899 /*!
900 * \brief Sous-vue à partir de l'élément \a abegin
901 * et contenant \a asize éléments.
902 *
903 * Si `(abegin+asize)` est supérieur à la taille du tableau,
904 * la vue est tronquée à cette taille, retournant éventuellement une vue vide.
905 */
906 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subPart(Int32 abegin, Int32 asize) const
907 {
908 return BaseClass::subSpan(abegin, asize);
909 }
910
911 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
912 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subSpanInterval(Int32 index, Int32 nb_interval) const
913 {
914 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
915 }
916
917 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
918 constexpr ARCCORE_HOST_DEVICE ThatClass subPartInterval(Int32 index, Int32 nb_interval) const
919 {
920 return subSpanInterval(index, nb_interval);
921 }
922
923 /*!
924 * \brief Sous-vue à partir de l'élément \a abegin
925 * et contenant \a asize éléments.
926 *
927 * Si `(abegin+asize)` est supérieur à la taille du tableau,
928 * la vue est tronquée à cette taille, retournant éventuellement une vue vide.
929 */
930 ARCCORE_DEPRECATED_REASON("Y2023: use subPart() instead")
931 constexpr ARCCORE_HOST_DEVICE SmallSpan<T> subView(Int32 abegin, Int32 asize) const
932 {
933 return subspan(abegin, asize);
934 }
935
936 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
937 ARCCORE_DEPRECATED_REASON("Y2023: use subPartInterval() instead")
938 constexpr ARCCORE_HOST_DEVICE SmallSpan<T> subViewInterval(Int32 index, Int32 nb_interval) const
939 {
940 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
941 }
942};
943
944/*---------------------------------------------------------------------------*/
945/*---------------------------------------------------------------------------*/
946/*!
947 * \brief Affiche sur le flot \a o les valeurs du tableau \a val.
948 *
949 * Si \a max_print est positif, alors au plus \a max_print valeurs
950 * sont affichées. Si la taille du tableau est supérieure à
951 * \a max_print, alors les (max_print/2) premiers et derniers
952 * éléments sont affichés.
953 */
954template <typename T, typename SizeType> inline void
955dumpArray(std::ostream& o, SpanImpl<const T, SizeType> val, int max_print)
956{
957 impl::dumpArray(o, val, max_print);
958}
959
960/*---------------------------------------------------------------------------*/
961/*---------------------------------------------------------------------------*/
962/*!
963 * \brief Extrait un sous-tableau à à partir d'une liste d'index.
964 *
965 * Remplit \a result avec les valeurs du tableau \a values correspondantes
966 * aux indices \a indexes.
967 *
968 * \pre results.size() >= indexes.size();
969 */
970template <typename DataType, typename IntegerType, typename SizeType> inline void
974{
975 const Int64 result_size = indexes.size();
976 [[maybe_unused]] const Int64 my_size = values.size();
977 const DataType* ptr = values.data();
978 for (Int64 i = 0; i < result_size; ++i) {
979 IntegerType index = indexes[i];
980 ARCCORE_CHECK_AT(index, my_size);
981 result[i] = ptr[index];
982 }
983}
984
985/*---------------------------------------------------------------------------*/
986/*---------------------------------------------------------------------------*/
987/*!
988 * \brief Extrait un sous-tableau à à partir d'une liste d'index.
989 *
990 * Remplit \a result avec les valeurs du tableau \a values correspondantes
991 * aux indices \a indexes.
992 *
993 * \pre results.size() >= indexes.size();
994 */
995template <typename DataType> inline void
997{
998 _sampleSpan<DataType, Int64, Int64>(values, indexes, result);
999}
1000
1001/*---------------------------------------------------------------------------*/
1002/*---------------------------------------------------------------------------*/
1003/*!
1004 * \brief Extrait un sous-tableau à à partir d'une liste d'index.
1005 *
1006 * Le résultat est stocké dans \a result dont la taille doit être au moins
1007 * égale à celle de \a indexes.
1008 */
1009template <typename DataType> inline void
1011{
1012 _sampleSpan<DataType, Int32, Int64>(values, indexes, result);
1013}
1014
1015/*---------------------------------------------------------------------------*/
1016/*---------------------------------------------------------------------------*/
1017/*!
1018 * \brief Converti la vue en un tableau d'octets non modifiables.
1019 */
1020template <typename DataType, typename SizeType, SizeType Extent>
1021inline typename Impl::SpanTypeFromSize<const std::byte, SizeType>::SpanType
1023{
1024 return { reinterpret_cast<const std::byte*>(s.data()), s.sizeBytes() };
1025}
1026
1027/*!
1028 * \brief Converti la vue en un tableau d'octets non modifiables.
1029 */
1030template <typename DataType>
1031inline SmallSpan<const std::byte>
1033{
1034 return asBytes(SmallSpan<DataType>(s));
1035}
1036
1037/*!
1038 * \brief Converti la vue en un tableau d'octets non modifiables.
1039 */
1040template <typename DataType>
1041inline SmallSpan<const std::byte>
1046
1047/*---------------------------------------------------------------------------*/
1048/*---------------------------------------------------------------------------*/
1049/*!
1050 * \brief Converti la vue en un tableau d'octets modifiables.
1051 *
1052 * Cette méthode n'est accessible que si \a DataType n'est pas `const`.
1053 */
1054template <typename DataType, typename SizeType, SizeType Extent,
1055 typename std::enable_if_t<!std::is_const<DataType>::value, int> = 0>
1056inline typename Impl::SpanTypeFromSize<std::byte, SizeType>::SpanType
1058{
1059 return { reinterpret_cast<std::byte*>(s.data()), s.sizeBytes() };
1060}
1061
1062/*!
1063 * \brief Converti la vue en un tableau d'octets modifiables.
1064 *
1065 * Cette méthode n'est accessible que si \a DataType n'est pas `const`.
1066 */
1067template <typename DataType> inline SmallSpan<std::byte>
1072
1073/*---------------------------------------------------------------------------*/
1074/*---------------------------------------------------------------------------*/
1075
1076namespace impl
1077{
1078
1079 template <typename ByteType, typename DataType, Int64 Extent> inline Span<DataType>
1080 asSpanInternal(Span<ByteType, Extent> bytes)
1081 {
1082 Int64 size = bytes.size();
1083 if (size == 0)
1084 return {};
1085 static constexpr Int64 data_type_size = static_cast<Int64>(sizeof(DataType));
1086 static_assert(data_type_size > 0, "Bad datatype size");
1087 ARCCORE_ASSERT((size % data_type_size) == 0, ("Size is not a multiple of sizeof(DataType)"));
1088 auto* ptr = reinterpret_cast<DataType*>(bytes.data());
1089 return { ptr, size / data_type_size };
1090 }
1091
1092 template <typename ByteType, typename DataType, Int32 Extent> inline SmallSpan<DataType>
1093 asSmallSpanInternal(SmallSpan<ByteType, Extent> bytes)
1094 {
1095 Int32 size = bytes.size();
1096 if (size == 0)
1097 return {};
1098 static constexpr Int32 data_type_size = static_cast<Int32>(sizeof(DataType));
1099 static_assert(data_type_size > 0, "Bad datatype size");
1100 ARCCORE_ASSERT((size % data_type_size) == 0, ("Size is not a multiple of sizeof(DataType)"));
1101 auto* ptr = reinterpret_cast<DataType*>(bytes.data());
1102 return { ptr, size / data_type_size };
1103 }
1104
1105} // namespace impl
1106
1107/*---------------------------------------------------------------------------*/
1108/*---------------------------------------------------------------------------*/
1109/*!
1110 * \brief Converti un Span<std::byte> en un Span<DataType>.
1111 * \pre bytes.size() % sizeof(DataType) == 0;
1112 */
1113template <typename DataType, Int64 Extent> inline Span<DataType>
1115{
1116 return impl::asSpanInternal<std::byte, DataType, Extent>(bytes);
1117}
1118/*!
1119 * \brief Converti un Span<std::byte> en un Span<DataType>.
1120 * \pre bytes.size() % sizeof(DataType) == 0;
1121 */
1122template <typename DataType, Int64 Extent> inline Span<const DataType>
1124{
1125 return impl::asSpanInternal<const std::byte, const DataType, Extent>(bytes);
1126}
1127/*!
1128 * \brief Converti un SmallSpan<std::byte> en un SmallSpan<DataType>.
1129 * \pre bytes.size() % sizeof(DataType) == 0;
1130 */
1131template <typename DataType, Int32 Extent> inline SmallSpan<DataType>
1133{
1134 return impl::asSmallSpanInternal<std::byte, DataType, Extent>(bytes);
1135}
1136/*!
1137 * \brief Converti un SmallSpan<const std::byte> en un SmallSpan<const DataType>.
1138 * \pre bytes.size() % sizeof(DataType) == 0;
1139 */
1140template <typename DataType, Int32 Extent> inline SmallSpan<const DataType>
1142{
1143 return impl::asSmallSpanInternal<const std::byte, const DataType, Extent>(bytes);
1144}
1145
1146/*---------------------------------------------------------------------------*/
1147/*---------------------------------------------------------------------------*/
1148/*!
1149 * \brief Retourne un Span associé au std::array.
1150 */
1151template <typename DataType, size_t SizeType> inline Span<DataType, SizeType>
1152asSpan(std::array<DataType, SizeType>& s)
1153{
1154 Int64 size = static_cast<Int64>(s.size());
1155 return { s.data(), size };
1156}
1157/*!
1158 * \brief Retourne un Span associé au std::array.
1159 */
1160template <typename DataType, size_t SizeType> inline SmallSpan<DataType, SizeType>
1161asSmallSpan(std::array<DataType, SizeType>& s)
1162{
1163 Int32 size = static_cast<Int32>(s.size());
1164 return { s.data(), size };
1165}
1166
1167/*---------------------------------------------------------------------------*/
1168/*---------------------------------------------------------------------------*/
1169/*!
1170 * \brief Ecrit en binaire le contenu de \a bytes sur le flot \a ostr.
1171 *
1172 * Cela revient à faire ostr.write(bytes.data(),bytes.size());
1173 */
1174extern "C++" ARCCORE_BASE_EXPORT void
1175binaryWrite(std::ostream& ostr, const Span<const std::byte>& bytes);
1176
1177/*!
1178 * \brief Lit en binaire le contenu de \a bytes depuis le flot \a istr.
1179 *
1180 * Cela revient à faire ostr.read(bytes.data(),bytes.size());
1181 */
1182extern "C++" ARCCORE_BASE_EXPORT void
1183binaryRead(std::istream& istr, const Span<std::byte>& bytes);
1184
1185/*---------------------------------------------------------------------------*/
1186/*---------------------------------------------------------------------------*/
1187
1188} // namespace Arcane
1189
1190/*---------------------------------------------------------------------------*/
1191/*---------------------------------------------------------------------------*/
1192
1193namespace Arccore
1194{
1195using Arcane::asBytes;
1197using Arcane::asSpan;
1199using Arcane::binaryRead;
1201using Arcane::sampleSpan;
1202} // namespace Arccore
1203
1204/*---------------------------------------------------------------------------*/
1205/*---------------------------------------------------------------------------*/
1206
1207#endif
Itérateur sur les classes tableau de Arccore.
Intervalle sur les classes tableau de Arccore.
Vue modifiable d'un tableau d'un type T.
Vue constante d'un tableau de type T.
Spécialisation pour le nombre d'éléments connu à la compilation.
Definition Span.h:107
Pour avoir le type (SmallSpan ou Span) en fonction de la taille (Int32 ou Int64)
Definition Span.h:50
Vue d'un tableau d'éléments de type T.
Definition Span.h:801
constexpr __host__ __device__ SmallSpan< T, DynExtent > subspan(Int32 abegin, Int32 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:882
constexpr __host__ __device__ SmallSpan< Pointer > subViewInterval(Int32 index, Int32 nb_interval) const
Definition Span.h:938
constexpr __host__ __device__ ThatClass & operator=(std::array< X, N > &from)
Opérateur de recopie.
Definition Span.h:858
constexpr __host__ __device__ SmallSpan< T, DynExtent > subSpanInterval(Int32 index, Int32 nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:912
constexpr __host__ __device__ SmallSpan< T, DynExtent > subPart(Int32 abegin, Int32 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:906
SmallSpan()=default
Construit une vue vide.
constexpr __host__ __device__ SmallSpan(const ArrayView< value_type > &from) noexcept
Constructeur de recopie depuis une autre vue.
Definition Span.h:819
constexpr __host__ __device__ SmallSpan(pointer ptr, Int32 asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et contenant asize éléments.
Definition Span.h:842
constexpr __host__ __device__ SmallSpan< Pointer > subView(Int32 abegin, Int32 asize) const
Definition Span.h:931
constexpr __host__ __device__ SmallSpan(T *ptr)
Construit une vue depuis un pointeur avec une taille fixe.
Definition Span.h:852
static constexpr ThatClass create(pointer ptr, size_type asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et.
Definition Span.h:868
constexpr __host__ __device__ SmallSpan< T, DynExtent > subSpan(Int32 abegin, Int32 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:894
constexpr __host__ __device__ ThatClass subPartInterval(Int32 index, Int32 nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:918
Vue d'un tableau d'éléments de type T.
Definition Span.h:190
constexpr __host__ __device__ SpanImpl(pointer ptr, SizeType asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et contenant asize éléments.
Definition Span.h:243
constexpr __host__ __device__ SpanImpl(const SpanImpl< X, SizeType, XExtent > &from) noexcept
Constructeur de recopie depuis une autre vue.
Definition Span.h:231
constexpr view_type smallView()
Vue constante sur cette vue.
Definition Span.h:390
__host__ __device__ void copy(const U &copy_array)
Recopie le tableau copy_array dans l'instance.
Definition Span.h:475
constexpr SubSpanType subView(SizeType abegin, SizeType asize) const
Definition Span.h:437
friend bool operator==(const SpanImpl< T, SizeType, Extent > &rhs, const SpanImpl< X, SizeType, Extent2 > &lhs)
Opérateur d'égalité (valide si T est const mais pas X)
Definition Span.h:541
constexpr __host__ __device__ SpanImpl(std::array< X, N > &from)
Construit une vue depuis un std::array.
Definition Span.h:250
std::optional< SizeType > findFirst(const_reference v) const
Definition Span.h:507
constexpr void _setArray(pointer v, SizeType s) noexcept
Modifie le pointeur et la taille du tableau.
Definition Span.h:581
constexpr __host__ __device__ SpanImpl(T *ptr)
Construit une vue depuis un pointeur avec une taille fixe.
Definition Span.h:256
constexpr __host__ __device__ pointer data() const noexcept
Definition Span.h:537
constexpr __host__ __device__ SizeType length() const noexcept
Nombre d'éléments du tableau.
Definition Span.h:333
constexpr __host__ __device__ iterator begin() const noexcept
Itérateur sur le premier élément du tableau.
Definition Span.h:338
__host__ __device__ void fill(T o)
Remplit le tableau avec la valeur o.
Definition Span.h:381
constexpr __host__ __device__ pointer ptrAt(SizeType index) const
Adresse du index-ème élément.
Definition Span.h:360
constexpr __host__ __device__ reference operator()(SizeType i) const
i-ème élément du tableau.
Definition Span.h:296
constexpr __host__ __device__ reference operator[](SizeType i) const
i-ème élément du tableau.
Definition Span.h:285
ArrayRange< pointer > range() const
Definition Span.h:352
constexpr __host__ __device__ bool empty() const noexcept
Retourne true si le tableau est vide (dimension nulle)
Definition Span.h:490
constexpr SubSpanType subViewInterval(SizeType index, SizeType nb_interval) const
Definition Span.h:450
constexpr __host__ __device__ SubSpanType subSpan(SizeType abegin, SizeType asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:412
constexpr __host__ __device__ reference item(SizeType i) const
i-ème élément du tableau.
Definition Span.h:307
constexpr ConstArrayView< value_type > constSmallView() const
Vue constante sur cette vue.
Definition Span.h:399
friend bool operator==(const SpanImpl< T, SizeType, Extent > &rhs, const SpanImpl< T, SizeType, Extent2 > &lhs)
Opérateur d'égalité
Definition Span.h:555
constexpr SubSpanType subPartInterval(SizeType index, SizeType nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:462
__host__ __device__ bool contains(const_reference v) const
true si le tableau contient l'élément de valeur v
Definition Span.h:492
constexpr __host__ __device__ ThatClass & operator=(std::array< X, N > &from)
Opérateur de recopie.
Definition Span.h:262
constexpr __host__ __device__ iterator end() const noexcept
Itérateur sur le premier élément après la fin du tableau.
Definition Span.h:342
constexpr void _setPtr(pointer v) noexcept
Modifie le pointeur du début du tableau.
Definition Span.h:593
friend bool operator!=(const SpanImpl< T, SizeType, Extent > &rhs, const SpanImpl< X, SizeType, Extent2 > &lhs)
Opérateur d'inégalité (valide si T est const mais pas X)
Definition Span.h:548
constexpr __host__ __device__ reverse_iterator rend() const noexcept
Itérateur inverse sur le premier élément après la fin du tableau.
Definition Span.h:346
constexpr __host__ __device__ SizeType size() const noexcept
Definition Span.h:325
constexpr __host__ __device__ SizeType sizeBytes() const noexcept
Retourne la taille du tableau en octets.
Definition Span.h:327
constexpr __host__ __device__ reverse_iterator rbegin() const noexcept
Itérateur inverse sur le premier élément du tableau.
Definition Span.h:344
friend bool operator!=(const SpanImpl< T, SizeType, Extent > &rhs, const SpanImpl< T, SizeType, Extent2 > &lhs)
Opérateur d'inégalité
Definition Span.h:562
constexpr void _setSize(SizeType s) noexcept
Modifie la taille du tableau.
Definition Span.h:601
constexpr __host__ __device__ SubSpanType subspan(SizeType abegin, SizeType asize) const
Pour compatibilité avec le C++20.
Definition Span.h:443
constexpr __host__ __device__ SubSpanType subPart(SizeType abegin, SizeType asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:424
constexpr __host__ __device__ SpanImpl() noexcept
Construit une vue vide.
Definition Span.h:223
constexpr SubSpanType subSpanInterval(SizeType index, SizeType nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:456
constexpr __host__ __device__ void setItem(SizeType i, const_reference v) noexcept
Positionne le i-ème élément du tableau.
Definition Span.h:318
static constexpr ThatClass create(pointer ptr, SizeType asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et.
Definition Span.h:273
std::enable_if_t< std::is_same_v< X, T >||std::is_same_v< std::add_const_t< X >, T > > is_same_const_type
Definition Span.h:216
Vue d'un tableau d'éléments de type T.
Definition Span.h:633
constexpr __host__ __device__ Span< T, DynExtent > subPart(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:745
constexpr __host__ __device__ Span< T, DynExtent > subSpanInterval(Int64 index, Int64 nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:751
static constexpr ThatClass create(pointer ptr, size_type asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et.
Definition Span.h:707
constexpr __host__ __device__ Span(std::array< X, N > &from) noexcept
Construit une vue à partir d'un std::array.
Definition Span.h:685
constexpr __host__ __device__ Span< DataType > subView(Int64 abegin, Int64 asize) const
Definition Span.h:770
constexpr __host__ __device__ Span(pointer ptr, Int64 asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et contenant asize éléments.
Definition Span.h:679
constexpr __host__ __device__ ThatClass & operator=(std::array< X, N > &from) noexcept
Opérateur de recopie.
Definition Span.h:696
constexpr __host__ __device__ Span(T *ptr)
Construit une vue depuis un pointeur avec une taille fixe.
Definition Span.h:690
constexpr __host__ __device__ Span(const ArrayView< value_type > &from) noexcept
Constructeur de recopie depuis une autre vue.
Definition Span.h:650
Span()=default
Construit une vue vide.
constexpr __host__ __device__ Span< DataType > subViewInterval(Int64 index, Int64 nb_interval) const
Definition Span.h:777
constexpr __host__ __device__ Span< T, DynExtent > subPartInterval(Int64 index, Int64 nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:757
constexpr __host__ __device__ Span< T, DynExtent > subSpan(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:733
constexpr __host__ __device__ Span< T, DynExtent > subspan(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:721
-*- 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.
constexpr Int32 DynExtent
Constante pour indiquer que la dimension d'un tableau est dynamique.
Definition BaseTypes.h:54
__host__ __device__ void arccoreCheckAt(Int64 i, Int64 max_size)
Vérifie un éventuel débordement de tableau.
void dumpArray(std::ostream &o, ConstArrayView< T > val, int max_print)
Affiche sur le flot o les valeurs du tableau val.
void sampleSpan(Span< const DataType > values, Span< const Int64 > indexes, Span< DataType > result)
Extrait un sous-tableau à à partir d'une liste d'index.
Definition Span.h:996
SmallSpan< DataType > asSmallSpan(SmallSpan< std::byte, Extent > bytes)
Converti un SmallSpan<std::byte> en un SmallSpan<DataType>.
Definition Span.h:1132
Span< DataType > asSpan(Span< std::byte, Extent > bytes)
Converti un Span<std::byte> en un Span<DataType>.
Definition Span.h:1114
void binaryRead(std::istream &istr, const Span< std::byte > &bytes)
Lit en binaire le contenu de bytes depuis le flot istr.
Definition ArrayView.cc:71
Impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converti la vue en un tableau d'octets non modifiables.
Definition Span.h:1022
Impl::SpanTypeFromSize< std::byte, SizeType >::SpanType asWritableBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converti la vue en un tableau d'octets modifiables.
Definition Span.h:1057
void _sampleSpan(SpanImpl< const DataType, SizeType > values, SpanImpl< const IntegerType, SizeType > indexes, SpanImpl< DataType, SizeType > result)
Extrait un sous-tableau à à partir d'une liste d'index.
Definition Span.h:971
std::ostream & operator<<(std::ostream &ostr, eItemKind item_kind)
Opérateur de sortie sur un flot.
void binaryWrite(std::ostream &ostr, const Span< const std::byte > &bytes)
Ecrit en binaire le contenu de bytes sur le flot ostr.
Definition ArrayView.cc:61
std::int32_t Int32
Type entier signé sur 32 bits.
Espace de nom de Arccore.