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