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