Arcane  v3.14.10.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>
39 class ViewTypeT<const T>
40 {
41 public:
42
43 using view_type = ConstArrayView<T>;
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&;
104 using iterator = ArrayIterator<pointer>;
105 using const_iterator = ArrayIterator<const_pointer>;
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>>>
122 constexpr ARCCORE_HOST_DEVICE SpanImpl(const SpanImpl<X, SizeType, XExtent, XMinValue>& from) noexcept
123 : m_ptr(from.data())
124 , m_size(from.size())
125 {}
126
127 template <SizeType XExtent, SizeType XMinValue>
128 constexpr ARCCORE_HOST_DEVICE SpanImpl(const SpanImpl<T, SizeType, XExtent, XMinValue>& from) noexcept
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();
149 m_size = ArraySizeChecker<SizeType>::check(from.size());
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 */
218 constexpr ARCCORE_HOST_DEVICE iterator begin() const noexcept { return iterator(m_ptr); }
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
261 ARCCORE_HOST_DEVICE inline void fill(T 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;
361 arccoreCheckAt(n,size_as_int64+1);
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
513 using ThatClass = Span<T, Extent, MinValue>;
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
526 constexpr ARCCORE_HOST_DEVICE Span(const ArrayView<value_type>& from) noexcept
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>> >
532 constexpr ARCCORE_HOST_DEVICE Span(const ConstArrayView<X>& from) noexcept
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.
554 constexpr ARCCORE_HOST_DEVICE Span(pointer ptr, Int64 asize) noexcept
555 : BaseClass(ptr, asize)
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 */
590 constexpr ARCCORE_HOST_DEVICE Span<T,DynExtent> subspan(Int64 abegin,Int64 asize) const
591 {
592 return BaseClass::subspan(abegin,asize);
593 }
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 */
602 constexpr ARCCORE_HOST_DEVICE Span<T,DynExtent> subSpan(Int64 abegin,Int64 asize) const
603 {
604 return BaseClass::subSpan(abegin,asize);
605 }
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 */
614 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subPart(Int64 abegin, Int64 asize) const
615 {
616 return BaseClass::subPart(abegin, asize);
617 }
618
619 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
620 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subSpanInterval(Int64 index, Int64 nb_interval) const
621 {
622 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
623 }
624
625 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
626 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subPartInterval(Int64 index, Int64 nb_interval) const
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")
639 constexpr ARCCORE_HOST_DEVICE Span<T> subView(Int64 abegin, Int64 asize) const
640 {
641 return subspan(abegin, asize);
642 }
643
644 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
645 ARCCORE_DEPRECATED_REASON("Y2023: use subSpanInterval() instead")
646 constexpr ARCCORE_HOST_DEVICE Span<T> subViewInterval(Int64 index,Int64 nb_interval) const
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
673 using ThatClass = SmallSpan<T, Extent, MinValue>;
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
687 constexpr ARCCORE_HOST_DEVICE SmallSpan(const ArrayView<value_type>& from) noexcept
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.
693 template<typename X,typename = std::enable_if_t<std::is_same<X,value_type>::value> >
694 constexpr ARCCORE_HOST_DEVICE SmallSpan(const ConstArrayView<X>& from) noexcept
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.
708 constexpr ARCCORE_HOST_DEVICE SmallSpan(pointer ptr,Int32 asize) noexcept
709 : BaseClass(ptr,asize) {}
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 */
741 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subspan(Int32 abegin, Int32 asize) const
742 {
743 return BaseClass::subspan(abegin,asize);
744 }
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 */
753 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subSpan(Int32 abegin, Int32 asize) const
754 {
755 return BaseClass::subSpan(abegin,asize);
756 }
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 */
765 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subPart(Int32 abegin, Int32 asize) const
766 {
767 return BaseClass::subSpan(abegin, asize);
768 }
769
770 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
771 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subSpanInterval(Int32 index, Int32 nb_interval) const
772 {
773 return impl::subViewInterval<ThatClass>(*this,index,nb_interval);
774 }
775
776 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
777 constexpr ARCCORE_HOST_DEVICE ThatClass subPartInterval(Int32 index,Int32 nb_interval) const
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")
790 constexpr ARCCORE_HOST_DEVICE SmallSpan<T> subView(Int32 abegin,Int32 asize) const
791 {
792 return subspan(abegin,asize);
793 }
794
795 //! Sous-vue correspondant à l'interval \a index sur \a nb_interval
796 ARCCORE_DEPRECATED_REASON("Y2023: use subPartInterval() instead")
797 constexpr ARCCORE_HOST_DEVICE SmallSpan<T> subViewInterval(Int32 index,Int32 nb_interval) const
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
814dumpArray(std::ostream& o,SpanImpl<const T,SizeType> val,int max_print)
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
856{
857 _sampleSpan<DataType,Int64,Int64>(values,indexes,result);
858}
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
870{
871 _sampleSpan<DataType,Int32,Int64>(values,indexes,result);
872}
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
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: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:24
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.