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