Arcane  4.2.1.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Span.h
Aller à la documentation de ce fichier.
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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-2026 */
9/* */
10/* Vues sur des tableaux C. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_BASE_SPAN_H
13#define ARCCORE_BASE_SPAN_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
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 dernier élément.
351 ARCCORE_DEPRECATED_REASON("Y2023: Utilisez begin()/end() à la place")
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: utilisez subSpan() à la place")
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: utilisez subSpanInterval() à la place")
450 constexpr SubSpanType subViewInterval(SizeType index, SizeType nb_interval) const
451 {
452 return Arcane::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 Arcane::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 Arcane::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 Arcane::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 Arcane::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 Arcane::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 static constexpr SizeType _min(SizeType a, SizeType b)
611 {
612 return ((a < b) ? a : b);
613 }
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 Arcane::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 Arcane::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 Arcane::Impl::subViewInterval<ThatClass>(*this, index, nb_interval);
780 }
781};
782
783/*---------------------------------------------------------------------------*/
784/*---------------------------------------------------------------------------*/
785
786/*!
787 * \ingroup Collection
788 * \brief Vue d'un tableau d'éléments de type \a T.
789 *
790 * La vue est non modifiable si l'argument template est de type 'const T'.
791 *
792 * Cette classe permet d'accéder et d'utiliser un tableau d'éléments du
793 * type \a T de la même manière qu'un tableau C standard. Elle est similaire à
794 * Span à ceci près que le nombre d'éléments est stocké sur un 'Int32'.
795 *
796 * \note Pour être valide, il faut aussi que le nombre d'octets associés à la vue
797 * (sizeBytes()) puisse tenir dans un \a Int32.
798 */
799template <typename T, Int32 Extent>
801: public SpanImpl<T, Int32, Extent>
802{
803 public:
804
805 using ThatClass = SmallSpan<T, Extent>;
806 using BaseClass = SpanImpl<T, Int32, Extent>;
807 using size_type = Int32;
808 using value_type = typename BaseClass::value_type;
809 using pointer = typename BaseClass::pointer;
810 template <typename X>
811 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>>;
812 static constexpr bool IsDynamic = (Extent == DynExtent);
813
814 public:
815
816 //! Construit une vue vide.
817 SmallSpan() = default;
818
819 //! Constructeur de recopie depuis une autre vue
820 constexpr ARCCORE_HOST_DEVICE SmallSpan(const ArrayView<value_type>& from) noexcept
821 : BaseClass(from.m_ptr, from.m_size)
822 {}
823
824 // Constructeur à partir d'un ConstArrayView. Cela n'est autorisé que
825 // si T est const.
826 template <typename X, typename = std::enable_if_t<std::is_same<X, value_type>::value>>
827 constexpr ARCCORE_HOST_DEVICE SmallSpan(const ConstArrayView<X>& from) noexcept
828 : BaseClass(from.m_ptr, from.m_size)
829 {}
830
831 // Pour un Span<const T>, on a le droit de construire depuis un Span<T>
832 template <typename X, typename = std::enable_if_t<std::is_same<X, value_type>::value>>
833 constexpr ARCCORE_HOST_DEVICE SmallSpan(const SmallSpan<X>& from) noexcept
834 : BaseClass(from)
835 {}
836
837 template <Int32 XExtent>
838 constexpr ARCCORE_HOST_DEVICE SmallSpan(const SpanImpl<T, Int32, XExtent>& from) noexcept
839 : BaseClass(from)
840 {}
841
842 //! Construit une vue sur une zone mémoire commencant par \a ptr et contenant \a asize éléments.
843 constexpr ARCCORE_HOST_DEVICE SmallSpan(pointer ptr, Int32 asize) noexcept
844 : BaseClass(ptr, asize)
845 {}
846
847 template <std::size_t N, typename X, typename = is_same_const_type<X>>
848 constexpr ARCCORE_HOST_DEVICE SmallSpan(std::array<X, N>& from)
849 : BaseClass(from)
850 {}
851
852 //! Construit une vue depuis un pointeur avec une taille fixe
853 explicit constexpr ARCCORE_HOST_DEVICE SmallSpan(T* ptr) requires(!IsDynamic)
854 : BaseClass(ptr)
855 {}
856
857 //! Opérateur de recopie
858 template <std::size_t N, typename X, typename = is_same_const_type<X>>
859 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(std::array<X, N>& from)
860 {
862 return (*this);
863 }
864
865 public:
866
867 //! Construit une vue sur une zone mémoire commencant par \a ptr et
868 // contenant \a asize éléments.
869 static constexpr ThatClass create(pointer ptr, size_type asize) noexcept
870 {
871 return ThatClass(ptr, asize);
872 }
873
874 public:
875
876 /*!
877 * \brief Sous-vue à partir de l'élément \a abegin
878 * et contenant \a asize éléments.
879 *
880 * Si `(abegin+asize` est supérieur à la taille du tableau,
881 * la vue est tronquée à cette taille, retournant éventuellement une vue vide.
882 */
883 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subspan(Int32 abegin, Int32 asize) const
884 {
885 return BaseClass::subspan(abegin, asize);
886 }
887
888 /*!
889 * \brief Sous-vue à partir de l'élément \a abegin
890 * et contenant \a asize éléments.
891 *
892 * Si `(abegin+asize)` est supérieur à la taille du tableau,
893 * la vue est tronquée à cette taille, retournant éventuellement une vue vide.
894 */
895 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subSpan(Int32 abegin, Int32 asize) const
896 {
897 return BaseClass::subSpan(abegin, asize);
898 }
899
900 /*!
901 * \brief Sous-vue à partir de l'élément \a abegin
902 * et contenant \a asize éléments.
903 *
904 * Si `(abegin+asize)` est supérieur à la taille du tableau,
905 * la vue est tronquée à cette taille, retournant éventuellement une vue vide.
906 */
907 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subPart(Int32 abegin, Int32 asize) const
908 {
909 return BaseClass::subSpan(abegin, asize);
910 }
911
912 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
913 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subSpanInterval(Int32 index, Int32 nb_interval) const
914 {
915 return Arcane::Impl::subViewInterval<ThatClass>(*this, index, nb_interval);
916 }
917
918 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
919 constexpr ARCCORE_HOST_DEVICE ThatClass subPartInterval(Int32 index, Int32 nb_interval) const
920 {
921 return subSpanInterval(index, nb_interval);
922 }
923
924 /*!
925 * \brief Sous-vue à partir de l'élément \a abegin
926 * et contenant \a asize éléments.
927 *
928 * Si `(abegin+asize)` est supérieur à la taille du tableau,
929 * la vue est tronquée à cette taille, retournant éventuellement une vue vide.
930 */
931 ARCCORE_DEPRECATED_REASON("Y2023: use subPart() instead")
932 constexpr ARCCORE_HOST_DEVICE SmallSpan<T> subView(Int32 abegin, Int32 asize) const
933 {
934 return subspan(abegin, asize);
935 }
936
937 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
938 ARCCORE_DEPRECATED_REASON("Y2023: use subPartInterval() instead")
939 constexpr ARCCORE_HOST_DEVICE SmallSpan<T> subViewInterval(Int32 index, Int32 nb_interval) const
940 {
941 return Arcane::Impl::subViewInterval<ThatClass>(*this, index, nb_interval);
942 }
943};
944
945/*---------------------------------------------------------------------------*/
946/*---------------------------------------------------------------------------*/
947
948/*!
949 * \brief Affiche sur le flot \a o les valeurs du tableau \a val.
950 *
951 * Si \a max_print est positif, alors au plus \a max_print valeurs
952 * sont affichées. Si la taille du tableau est supérieure à
953 * \a max_print, alors les (max_print/2) premiers et derniers
954 * éléments sont affichés.
955 */
956template <typename T, typename SizeType> inline void
957dumpArray(std::ostream& o, SpanImpl<const T, SizeType> val, int max_print)
958{
959 Arcane::Impl::dumpArray(o, val, max_print);
960}
961
962/*---------------------------------------------------------------------------*/
963/*---------------------------------------------------------------------------*/
964
965/*!
966 * \brief Extrait un sous-tableau à à partir d'une liste d'index.
967 *
968 * Remplit \a result avec les valeurs du tableau \a values correspondantes
969 * aux indices \a indexes.
970 *
971 * \pre results.size() >= indexes.size();
972 */
973template <typename DataType, typename IntegerType, typename SizeType> inline void
977{
978 const Int64 result_size = indexes.size();
979 [[maybe_unused]] const Int64 my_size = values.size();
980 const DataType* ptr = values.data();
981 for (Int64 i = 0; i < result_size; ++i) {
982 IntegerType index = indexes[i];
983 ARCCORE_CHECK_AT(index, my_size);
984 result[i] = ptr[index];
985 }
986}
987
988/*---------------------------------------------------------------------------*/
989/*---------------------------------------------------------------------------*/
990
991/*!
992 * \brief Extrait un sous-tableau à à partir d'une liste d'index.
993 *
994 * Remplit \a result avec les valeurs du tableau \a values correspondantes
995 * aux indices \a indexes.
996 *
997 * \pre results.size() >= indexes.size();
998 */
999template <typename DataType> inline void
1001{
1002 _sampleSpan<DataType, Int64, Int64>(values, indexes, result);
1003}
1004
1005/*---------------------------------------------------------------------------*/
1006/*---------------------------------------------------------------------------*/
1007
1008/*!
1009 * \brief Extrait un sous-tableau à partir d'une liste d'indices.
1010 *
1011 * Le résultat est stocké dans \a result, dont la taille doit être au moins
1012 * égale à celle de \a indexes.
1013 */
1014template <typename DataType> inline void
1016{
1017 _sampleSpan<DataType, Int32, Int64>(values, indexes, result);
1018}
1019
1020/*---------------------------------------------------------------------------*/
1021/*---------------------------------------------------------------------------*/
1022
1023/*!
1024 * \brief Convertit la vue en un tableau d'octets non modifiables.
1025 */
1026template <typename DataType, typename SizeType, SizeType Extent>
1027inline typename Impl::SpanTypeFromSize<const std::byte, SizeType>::SpanType
1029{
1030 return { reinterpret_cast<const std::byte*>(s.data()), s.sizeBytes() };
1031}
1032
1033/*!
1034 * \brief Convertit la vue en un tableau d'octets non modifiables.
1035 */
1036template <typename DataType>
1037inline SmallSpan<const std::byte>
1039{
1040 return asBytes(SmallSpan<DataType>(s));
1041}
1042
1043/*!
1044 * \brief Convertit la vue en un tableau d'octets non modifiables.
1045 */
1046template <typename DataType>
1047inline SmallSpan<const std::byte>
1052
1053/*---------------------------------------------------------------------------*/
1054/*---------------------------------------------------------------------------*/
1055
1056/*!
1057 * \brief Convertit la vue en un tableau d'octets modifiables.
1058 *
1059 * Cette méthode n'est accessible que si \a DataType n'est pas `const`.
1060 */
1061template <typename DataType, typename SizeType, SizeType Extent,
1062 typename std::enable_if_t<!std::is_const<DataType>::value, int> = 0>
1063inline typename Impl::SpanTypeFromSize<std::byte, SizeType>::SpanType
1065{
1066 return { reinterpret_cast<std::byte*>(s.data()), s.sizeBytes() };
1067}
1068
1069/*!
1070 * \brief Convertit la vue en un tableau d'octets modifiables.
1071 *
1072 * Cette méthode n'est accessible que si \a DataType n'est pas `const`.
1073 */
1074template <typename DataType> inline SmallSpan<std::byte>
1079
1080/*---------------------------------------------------------------------------*/
1081/*---------------------------------------------------------------------------*/
1082
1083namespace Impl
1084{
1085 template <typename ByteType, typename DataType, Int64 Extent> inline Span<DataType>
1086 asSpanInternal(Span<ByteType, Extent> bytes)
1087 {
1088 Int64 size = bytes.size();
1089 if (size == 0)
1090 return {};
1091 static constexpr Int64 data_type_size = static_cast<Int64>(sizeof(DataType));
1092 static_assert(data_type_size > 0, "Bad datatype size");
1093 ARCCORE_ASSERT((size % data_type_size) == 0, ("Size is not a multiple of sizeof(DataType)"));
1094 auto* ptr = reinterpret_cast<DataType*>(bytes.data());
1095 return { ptr, size / data_type_size };
1096 }
1097
1098 template <typename ByteType, typename DataType, Int32 Extent> inline SmallSpan<DataType>
1099 asSmallSpanInternal(SmallSpan<ByteType, Extent> bytes)
1100 {
1101 Int32 size = bytes.size();
1102 if (size == 0)
1103 return {};
1104 static constexpr Int32 data_type_size = static_cast<Int32>(sizeof(DataType));
1105 static_assert(data_type_size > 0, "Bad datatype size");
1106 ARCCORE_ASSERT((size % data_type_size) == 0, ("Size is not a multiple of sizeof(DataType)"));
1107 auto* ptr = reinterpret_cast<DataType*>(bytes.data());
1108 return { ptr, size / data_type_size };
1109 }
1110} // namespace Impl
1111
1112/*---------------------------------------------------------------------------*/
1113/*---------------------------------------------------------------------------*/
1114
1115/*!
1116 * \brief Convertit un Span<std::byte> en un Span<DataType>.
1117 * \pre bytes.size() % sizeof(DataType) == 0;
1118 */
1119template <typename DataType, Int64 Extent> inline Span<DataType>
1121{
1122 return Arcane::Impl::asSpanInternal<std::byte, DataType, Extent>(bytes);
1123}
1124
1125/*!
1126 * \brief Convertit un Span<std::byte> en un Span<const DataType>.
1127 * \pre bytes.size() % sizeof(DataType) == 0;
1128 */
1129template <typename DataType, Int64 Extent> inline Span<const DataType>
1131{
1132 return Arcane::Impl::asSpanInternal<const std::byte, const DataType, Extent>(bytes);
1133}
1134
1135/*!
1136 * \brief Convertit un SmallSpan<std::byte> en un SmallSpan<DataType>.
1137 * \pre bytes.size() % sizeof(DataType) == 0;
1138 */
1139template <typename DataType, Int32 Extent> inline SmallSpan<DataType>
1141{
1142 return Arcane::Impl::asSmallSpanInternal<std::byte, DataType, Extent>(bytes);
1143}
1144
1145/*!
1146 * \brief Convertit un SmallSpan<const std::byte> en un SmallSpan<const DataType>.
1147 * \pre bytes.size() % sizeof(DataType) == 0;
1148 */
1149template <typename DataType, Int32 Extent> inline SmallSpan<const DataType>
1151{
1152 return Arcane::Impl::asSmallSpanInternal<const std::byte, const DataType, Extent>(bytes);
1153}
1154
1155/*---------------------------------------------------------------------------*/
1156/*---------------------------------------------------------------------------*/
1157
1158/*!
1159 * \brief Retourne un Span associé au std::array.
1160 */
1161template <typename DataType, size_t SizeType> inline Span<DataType, SizeType>
1162asSpan(std::array<DataType, SizeType>& s)
1163{
1164 Int64 size = static_cast<Int64>(s.size());
1165 return { s.data(), size };
1166}
1167
1168/*!
1169 * \brief Retourne un Span associé au std::array.
1170 */
1171template <typename DataType, size_t SizeType> inline SmallSpan<DataType, SizeType>
1172asSmallSpan(std::array<DataType, SizeType>& s)
1173{
1174 Int32 size = static_cast<Int32>(s.size());
1175 return { s.data(), size };
1176}
1177
1178/*---------------------------------------------------------------------------*/
1179/*---------------------------------------------------------------------------*/
1180
1181/*!
1182 * \brief Ecrit en binaire le contenu de \a bytes sur le flot \a ostr.
1183 *
1184 * Cela revient à faire ostr.write(bytes.data(),bytes.size());
1185 */
1186extern "C++" ARCCORE_BASE_EXPORT void
1187binaryWrite(std::ostream& ostr, const Span<const std::byte>& bytes);
1188
1189/*!
1190 * \brief Lit en binaire le contenu de \a bytes depuis le flot \a istr.
1191 *
1192 * Cela revient à faire ostr.read(bytes.data(),bytes.size());
1193 */
1194extern "C++" ARCCORE_BASE_EXPORT void
1195binaryRead(std::istream& istr, const Span<std::byte>& bytes);
1196
1197/*---------------------------------------------------------------------------*/
1198/*---------------------------------------------------------------------------*/
1199
1200} // namespace Arcane
1201
1202/*---------------------------------------------------------------------------*/
1203/*---------------------------------------------------------------------------*/
1204
1205namespace Arccore
1206{
1207using Arcane::asBytes;
1209using Arcane::asSpan;
1211using Arcane::binaryRead;
1213using Arcane::sampleSpan;
1214} // namespace Arccore
1215
1216/*---------------------------------------------------------------------------*/
1217/*---------------------------------------------------------------------------*/
1218
1219#endif
Types et fonctions associés aux classes ArrayView et ConstArrayView.
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:802
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:883
constexpr __host__ __device__ SmallSpan< Pointer > subViewInterval(Int32 index, Int32 nb_interval) const
Definition Span.h:939
constexpr __host__ __device__ ThatClass & operator=(std::array< X, N > &from)
Opérateur de recopie.
Definition Span.h:859
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:913
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:907
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:820
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:843
constexpr __host__ __device__ SmallSpan< Pointer > subView(Int32 abegin, Int32 asize) const
Definition Span.h:932
constexpr __host__ __device__ SmallSpan(T *ptr)
Construit une vue depuis un pointeur avec une taille fixe.
Definition Span.h:853
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:869
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:895
constexpr __host__ __device__ ThatClass subPartInterval(Int32 index, Int32 nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:919
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:53
__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:1000
SmallSpan< DataType > asSmallSpan(SmallSpan< std::byte, Extent > bytes)
Convertit un SmallSpan<std::byte> en un SmallSpan<DataType>.
Definition Span.h:1140
Span< DataType > asSpan(Span< std::byte, Extent > bytes)
Convertit un Span<std::byte> en un Span<DataType>.
Definition Span.h:1120
void binaryRead(std::istream &istr, const Span< std::byte > &bytes)
Lit en binaire le contenu de bytes depuis le flot istr.
Definition ArrayView.cc:102
Impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Convertit la vue en un tableau d'octets non modifiables.
Definition Span.h:1028
Impl::SpanTypeFromSize< std::byte, SizeType >::SpanType asWritableBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Convertit la vue en un tableau d'octets modifiables.
Definition Span.h:1064
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:93
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:974
std::ostream & operator<<(std::ostream &ostr, eItemKind item_kind)
Opérateur de sortie sur un flot.
std::int32_t Int32
Type entier signé sur 32 bits.
Espace de nom de Arccore.