Arcane  v4.1.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
Span.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* Span.h (C) 2000-2025 */
9/* */
10/* Vues sur des tableaux C. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_BASE_SPAN_H
13#define ARCCORE_BASE_SPAN_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/base/ArrayView.h"
18
19#include <type_traits>
20#include <optional>
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane::Impl
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31// Pour indiquer que Span<T>::view() retourne un ArrayView
32// et Span<const T>::view() retourne un ConstArrayView.
33template <typename T>
35{
36 public:
37
38 using view_type = ArrayView<T>;
39};
40template <typename T>
41class ViewTypeT<const T>
42{
43 public:
44
45 using view_type = ConstArrayView<T>;
46};
47
49template <typename T, typename SizeType>
51
52template <typename T>
54{
55 public:
56
57 using SpanType = SmallSpan<T>;
58};
59
60template <typename T>
62{
63 public:
64
65 using SpanType = Span<T>;
66};
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
76template <typename SizeType>
77class DynamicExtentStorage
78{
79 template <typename T, typename SpanSizeType, SpanSizeType SpanExtent>
80 friend class ::Arcane::SpanImpl;
81
82 public:
83
84 explicit constexpr DynamicExtentStorage(SizeType s) noexcept
85 : m_size(s)
86 {}
87
88 public:
89
90 constexpr SizeType size() const noexcept { return m_size; }
91
92 private:
93
94 SizeType m_size;
95};
96
97class ARCCORE_BASE_EXPORT ExtentStorageBase
98{
99 public:
100
101 static void _throwBadSize [[noreturn]] (Int64 wanted_size, Int64 expected_size);
102};
103
105template <typename SizeType, SizeType FixedExtent>
106class ExtentStorage
107{
108 template <typename T, typename SpanSizeType, SpanSizeType SpanExtent>
109 friend class ::Arcane::SpanImpl;
110
111 public:
112
113 explicit constexpr ExtentStorage([[maybe_unused]] SizeType s) noexcept
114 {
115#if defined(ARCCORE_CHECK) && !defined(ARCCORE_DEVICE_CODE)
116 if (s != FixedExtent)
117 ExtentStorageBase::_throwBadSize(s, FixedExtent);
118#endif
119 }
120 ExtentStorage() = default;
121
122 public:
123
124 constexpr SizeType size() const noexcept { return FixedExtent; }
125
126 private:
127
128 static constexpr SizeType m_size = FixedExtent;
129};
130
132template <>
133class ExtentStorage<Int32, DynExtent>
134: public DynamicExtentStorage<Int32>
135{
136 using BaseClass = DynamicExtentStorage<Int32>;
137
138 public:
139
140 explicit constexpr ExtentStorage(Int32 s) noexcept
141 : BaseClass(s)
142 {}
143};
144
146template <>
147class ExtentStorage<Int64, DynExtent>
148: public DynamicExtentStorage<Int64>
149{
150 using BaseClass = DynamicExtentStorage<Int64>;
151
152 public:
153
154 explicit constexpr ExtentStorage(Int64 s) noexcept
155 : BaseClass(s)
156 {}
157};
158
159/*---------------------------------------------------------------------------*/
160/*---------------------------------------------------------------------------*/
161
162} // namespace Arcane::Impl
163
164/*---------------------------------------------------------------------------*/
165/*---------------------------------------------------------------------------*/
166
167namespace Arcane
168{
169
170/*---------------------------------------------------------------------------*/
171/*---------------------------------------------------------------------------*/
188template <typename T, typename SizeType, SizeType Extent>
190{
191 using ExtentStorageType = Impl::ExtentStorage<SizeType, Extent>;
192
193 public:
194
195 using ThatClass = SpanImpl<T, SizeType, Extent>;
196 using SubSpanType = SpanImpl<T, SizeType, DynExtent>;
197 using size_type = SizeType;
198 using ElementType = T;
199 using element_type = ElementType;
200 using value_type = typename std::remove_cv_t<ElementType>;
201 using const_value_type = typename std::add_const_t<value_type>;
202 using index_type = SizeType;
203 using difference_type = SizeType;
204 using pointer = ElementType*;
205 using const_pointer = const ElementType*;
206 using reference = ElementType&;
207 using const_reference = const ElementType&;
208 using iterator = ArrayIterator<pointer>;
209 using const_iterator = ArrayIterator<const_pointer>;
210 using view_type = typename Impl::ViewTypeT<ElementType>::view_type;
211 using reverse_iterator = std::reverse_iterator<iterator>;
212 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
213
215 template <typename X>
216 using is_same_const_type = std::enable_if_t<std::is_same_v<X, T> || std::is_same_v<std::add_const_t<X>, T>>;
217
218 static constexpr bool IsDynamic = (Extent == DynExtent);
219
220 public:
221
223 constexpr ARCCORE_HOST_DEVICE SpanImpl() noexcept
224 : m_ptr(nullptr)
225 , m_size(0)
226 {}
227
229 // Pour un Span<const T>, on a le droit de construire depuis un Span<T>
230 template <typename X, SizeType XExtent, typename = std::enable_if_t<std::is_same_v<const X, T>>>
231 constexpr ARCCORE_HOST_DEVICE SpanImpl(const SpanImpl<X, SizeType, XExtent>& from) noexcept
232 : m_ptr(from.data())
233 , m_size(from.size())
234 {}
235
236 template <SizeType XExtent>
237 constexpr ARCCORE_HOST_DEVICE SpanImpl(const SpanImpl<T, SizeType, XExtent>& from) noexcept
238 : m_ptr(from.data())
239 , m_size(from.size())
240 {}
241
243 constexpr ARCCORE_HOST_DEVICE SpanImpl(pointer ptr, SizeType asize) noexcept
244 : m_ptr(ptr)
245 , m_size(asize)
246 {}
247
249 template <std::size_t N, typename X, typename = is_same_const_type<X>>
250 constexpr ARCCORE_HOST_DEVICE SpanImpl(std::array<X, N>& from)
251 : m_ptr(from.data())
252 , m_size(ArraySizeChecker<SizeType>::check(from.size()))
253 {}
254
256 explicit constexpr ARCCORE_HOST_DEVICE SpanImpl(T* ptr) requires(!IsDynamic)
257 : m_ptr(ptr)
258 {}
259
261 template <std::size_t N, typename X, typename = is_same_const_type<X>>
262 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(std::array<X, N>& from)
263 {
264 m_ptr = from.data();
265 m_size = ExtentStorageType(ArraySizeChecker<SizeType>::check(from.size()));
266 return (*this);
267 }
268
269 public:
270
272 // contenant \a asize éléments.
273 static constexpr ThatClass create(pointer ptr, SizeType asize) noexcept
274 {
275 return ThatClass(ptr, asize);
276 }
277
278 public:
279
285 constexpr ARCCORE_HOST_DEVICE reference operator[](SizeType i) const
286 {
287 ARCCORE_CHECK_AT(i, m_size.m_size);
288 return m_ptr[i];
289 }
290
296 constexpr ARCCORE_HOST_DEVICE reference operator()(SizeType i) const
297 {
298 ARCCORE_CHECK_AT(i, m_size.m_size);
299 return m_ptr[i];
300 }
301
307 constexpr ARCCORE_HOST_DEVICE reference item(SizeType i) const
308 {
309 ARCCORE_CHECK_AT(i, m_size.m_size);
310 return m_ptr[i];
311 }
312
318 constexpr ARCCORE_HOST_DEVICE void setItem(SizeType i, const_reference v) noexcept
319 {
320 ARCCORE_CHECK_AT(i, m_size.m_size);
321 m_ptr[i] = v;
322 }
323
325 constexpr ARCCORE_HOST_DEVICE SizeType size() const noexcept { return m_size.m_size; }
327 constexpr ARCCORE_HOST_DEVICE SizeType sizeBytes() const noexcept
328 {
329 // TODO: retourner toujours un Int64
330 return static_cast<SizeType>(m_size.m_size * sizeof(value_type));
331 }
332
333 constexpr ARCCORE_HOST_DEVICE SizeType length() const noexcept { return m_size.m_size; }
334
338 constexpr ARCCORE_HOST_DEVICE iterator begin() const noexcept { return iterator(m_ptr); }
342 constexpr ARCCORE_HOST_DEVICE iterator end() const noexcept { return iterator(m_ptr + m_size.m_size); }
344 constexpr ARCCORE_HOST_DEVICE reverse_iterator rbegin() const noexcept { return std::make_reverse_iterator(end()); }
346 constexpr ARCCORE_HOST_DEVICE reverse_iterator rend() const noexcept { return std::make_reverse_iterator(begin()); }
347
348 public:
349
351 ARCCORE_DEPRECATED_REASON("Y2023: Use begin()/end() instead")
352 ArrayRange<pointer> range() const
353 {
354 return ArrayRange<pointer>(m_ptr, m_ptr + m_size.m_size);
355 }
356
357 public:
358
360 constexpr ARCCORE_HOST_DEVICE pointer ptrAt(SizeType index) const
361 {
362 ARCCORE_CHECK_AT(index, m_size.m_size);
363 return m_ptr + index;
364 }
365
366 // Elément d'indice \a i. Vérifie toujours les débordements
367 constexpr ARCCORE_HOST_DEVICE reference at(SizeType i) const
368 {
369 arccoreCheckAt(i, m_size.m_size);
370 return m_ptr[i];
371 }
372
373 // Positionne l'élément d'indice \a i. Vérifie toujours les débordements
374 constexpr ARCCORE_HOST_DEVICE void setAt(SizeType i, const_reference value)
375 {
376 arccoreCheckAt(i, m_size.m_size);
377 m_ptr[i] = value;
378 }
379
381 ARCCORE_HOST_DEVICE inline void fill(T o)
382 {
383 for (SizeType i = 0, n = m_size.m_size; i < n; ++i)
384 m_ptr[i] = o;
385 }
386
390 constexpr view_type smallView()
391 {
393 return view_type(s, m_ptr);
394 }
395
404
412 constexpr ARCCORE_HOST_DEVICE SubSpanType subSpan(SizeType abegin, SizeType asize) const
413 {
414 if (abegin >= m_size.m_size)
415 return {};
416 asize = _min(asize, m_size.m_size - abegin);
417 return { m_ptr + abegin, asize };
418 }
419
424 constexpr ARCCORE_HOST_DEVICE SubSpanType subPart(SizeType abegin, SizeType asize) const
425 {
426 return subSpan(abegin, asize);
427 }
428
436 ARCCORE_DEPRECATED_REASON("Y2023: use subSpan() instead")
437 constexpr SubSpanType subView(SizeType abegin, SizeType asize) const
438 {
439 return subSpan(abegin, asize);
440 }
441
443 constexpr ARCCORE_HOST_DEVICE SubSpanType subspan(SizeType abegin, SizeType asize) const
444 {
445 return subSpan(abegin, asize);
446 }
447
449 ARCCORE_DEPRECATED_REASON("Y2023: use subSpanInterval() instead")
450 constexpr SubSpanType subViewInterval(SizeType index, SizeType nb_interval) const
451 {
452 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
453 }
454
456 constexpr SubSpanType subSpanInterval(SizeType index, SizeType nb_interval) const
457 {
458 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
459 }
460
462 constexpr SubSpanType subPartInterval(SizeType index, SizeType nb_interval) const
463 {
464 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
465 }
466
475 template <class U> ARCCORE_HOST_DEVICE void copy(const U& copy_array)
476 {
477 Int64 n = copy_array.size();
478 Int64 size_as_int64 = m_size.m_size;
479 arccoreCheckAt(n, size_as_int64 + 1);
480 const_pointer copy_begin = copy_array.data();
481 pointer to_ptr = m_ptr;
482 // On est sur que \a n tient sur un 'SizeType' car il est plus petit
483 // que \a m_size
484 SizeType n_as_sizetype = static_cast<SizeType>(n);
485 for (SizeType i = 0; i < n_as_sizetype; ++i)
486 to_ptr[i] = copy_begin[i];
487 }
488
490 constexpr ARCCORE_HOST_DEVICE bool empty() const noexcept { return m_size.m_size == 0; }
492 ARCCORE_HOST_DEVICE bool contains(const_reference v) const
493 {
494 for (SizeType i = 0; i < m_size.m_size; ++i) {
495 if (m_ptr[i] == v)
496 return true;
497 }
498 return false;
499 }
500
507 std::optional<SizeType> findFirst(const_reference v) const
508 {
509 for (SizeType i = 0; i < m_size.m_size; ++i) {
510 if (m_ptr[i] == v)
511 return i;
512 }
513 return std::nullopt;
514 }
515
516 public:
517
518 constexpr ARCCORE_HOST_DEVICE void setArray(const ArrayView<T>& v) noexcept
519 {
520 m_ptr = v.m_ptr;
521 m_size = v.m_size;
522 }
523 constexpr ARCCORE_HOST_DEVICE void setArray(const Span<T>& v) noexcept
524 {
525 m_ptr = v.m_ptr;
526 m_size = v.m_size;
527 }
528
537 constexpr ARCCORE_HOST_DEVICE pointer data() const noexcept { return m_ptr; }
538
540 template <typename X, SizeType Extent2, typename = std::enable_if_t<std::is_same_v<X, value_type>>> friend bool
542 {
543 return impl::areEqual(SpanImpl<T, SizeType>(rhs), SpanImpl<T, SizeType>(lhs));
544 }
545
547 template <typename X, SizeType Extent2, typename = std::enable_if_t<std::is_same_v<X, value_type>>> friend bool
549 {
550 return !operator==(rhs, lhs);
551 }
552
554 template <SizeType Extent2> friend bool
556 {
557 return impl::areEqual(SpanImpl<T, SizeType>(rhs), SpanImpl<T, SizeType>(lhs));
558 }
559
561 template <SizeType Extent2> friend bool
563 {
564 return !operator==(rhs, lhs);
565 }
566
567 friend inline std::ostream& operator<<(std::ostream& o, const ThatClass& val)
568 {
569 impl::dumpArray(o, Span<const T, DynExtent>(val.data(), val.size()), 500);
570 return o;
571 }
572
573 protected:
574
581 constexpr void _setArray(pointer v, SizeType s) noexcept
582 {
583 m_ptr = v;
584 m_size = s;
585 }
586
593 constexpr void _setPtr(pointer v) noexcept { m_ptr = v; }
594
601 constexpr void _setSize(SizeType s) noexcept { m_size = ExtentStorageType(s); }
602
603 private:
604
605 pointer m_ptr;
607 ARCCORE_NO_UNIQUE_ADDRESS ExtentStorageType m_size;
608
609 private:
610
611 static constexpr SizeType _min(SizeType a, SizeType b)
612 {
613 return ((a < b) ? a : b);
614 }
615};
616
617/*---------------------------------------------------------------------------*/
618/*---------------------------------------------------------------------------*/
630template <typename T, Int64 Extent>
631class Span
632: public SpanImpl<T, Int64, Extent>
633{
634 public:
635
636 using ThatClass = Span<T, Extent>;
637 using BaseClass = SpanImpl<T, Int64, Extent>;
638 using size_type = Int64;
639 using value_type = typename BaseClass::value_type;
640 using pointer = typename BaseClass::pointer;
641 template <typename X>
642 using is_same_const_type = std::enable_if_t<std::is_same_v<X, T> || std::is_same_v<std::add_const_t<X>, T>>;
643 static constexpr bool IsDynamic = (Extent == DynExtent);
644
645 public:
646
648 Span() = default;
650 constexpr ARCCORE_HOST_DEVICE Span(const ArrayView<value_type>& from) noexcept
651 : BaseClass(from.m_ptr, from.m_size)
652 {}
653 // Constructeur à partir d'un ConstArrayView. Cela n'est autorisé que
654 // si T est const.
655 template <typename X, typename = std::enable_if_t<std::is_same_v<X, value_type>>>
656 constexpr ARCCORE_HOST_DEVICE Span(const ConstArrayView<X>& from) noexcept
657 : BaseClass(from.m_ptr, from.m_size)
658 {}
659 // Pour un Span<const T>, on a le droit de construire depuis un Span<T>
660 template <typename X, Int64 XExtent, typename = std::enable_if_t<std::is_same_v<const X, T>>>
661 constexpr ARCCORE_HOST_DEVICE Span(const Span<X, XExtent>& from) noexcept
662 : BaseClass(from)
663 {}
664 // Pour un Span<const T>, on a le droit de construire depuis un SmallSpan<T>
665 template <typename X, Int32 XExtent, typename = std::enable_if_t<std::is_same_v<const X, T>>>
666 constexpr ARCCORE_HOST_DEVICE Span(const SmallSpan<X, XExtent>& from) noexcept
667 : BaseClass(from.data(), from.size())
668 {}
669 template <Int64 XExtent>
670 constexpr ARCCORE_HOST_DEVICE Span(const SpanImpl<T, Int64, XExtent>& from) noexcept
671 : BaseClass(from)
672 {}
673 template <Int32 XExtent>
674 constexpr ARCCORE_HOST_DEVICE Span(const SpanImpl<T, Int32, XExtent>& from) noexcept
675 : BaseClass(from.data(), from.size())
676 {}
677
679 constexpr ARCCORE_HOST_DEVICE Span(pointer ptr, Int64 asize) noexcept
680 : BaseClass(ptr, asize)
681 {}
682
684 template <std::size_t N, typename X, typename = is_same_const_type<X>>
685 constexpr ARCCORE_HOST_DEVICE Span(std::array<X, N>& from) noexcept
686 : BaseClass(from.data(), from.size())
687 {}
688
690 explicit constexpr ARCCORE_HOST_DEVICE Span(T* ptr) requires(!IsDynamic)
691 : BaseClass(ptr)
692 {}
693
695 template <std::size_t N, typename X, typename = is_same_const_type<X>>
696 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(std::array<X, N>& from) noexcept
697 {
698 this->_setPtr(from.data());
699 this->_setSize(from.size());
700 return (*this);
701 }
702
703 public:
704
706 // contenant \a asize éléments.
707 static constexpr ThatClass create(pointer ptr, size_type asize) noexcept
708 {
709 return ThatClass(ptr, asize);
710 }
711
712 public:
713
721 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subspan(Int64 abegin, Int64 asize) const
722 {
723 return BaseClass::subspan(abegin, asize);
724 }
725
733 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subSpan(Int64 abegin, Int64 asize) const
734 {
735 return BaseClass::subSpan(abegin, asize);
736 }
737
745 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subPart(Int64 abegin, Int64 asize) const
746 {
747 return BaseClass::subPart(abegin, asize);
748 }
749
751 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subSpanInterval(Int64 index, Int64 nb_interval) const
752 {
753 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
754 }
755
757 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subPartInterval(Int64 index, Int64 nb_interval) const
758 {
759 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
760 }
761
769 ARCCORE_DEPRECATED_REASON("Y2023: use subSpan() instead")
770 constexpr ARCCORE_HOST_DEVICE Span<T> subView(Int64 abegin, Int64 asize) const
771 {
772 return subspan(abegin, asize);
773 }
774
776 ARCCORE_DEPRECATED_REASON("Y2023: use subSpanInterval() instead")
777 constexpr ARCCORE_HOST_DEVICE Span<T> subViewInterval(Int64 index, Int64 nb_interval) const
778 {
779 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
780 }
781};
782
783/*---------------------------------------------------------------------------*/
784/*---------------------------------------------------------------------------*/
798template <typename T, Int32 Extent>
800: public SpanImpl<T, Int32, Extent>
801{
802 public:
803
804 using ThatClass = SmallSpan<T, Extent>;
805 using BaseClass = SpanImpl<T, Int32, Extent>;
806 using size_type = Int32;
807 using value_type = typename BaseClass::value_type;
808 using pointer = typename BaseClass::pointer;
809 template <typename X>
810 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>>;
811 static constexpr bool IsDynamic = (Extent == DynExtent);
812
813 public:
814
816 SmallSpan() = default;
817
819 constexpr ARCCORE_HOST_DEVICE SmallSpan(const ArrayView<value_type>& from) noexcept
820 : BaseClass(from.m_ptr, from.m_size)
821 {}
822
823 // Constructeur à partir d'un ConstArrayView. Cela n'est autorisé que
824 // si T est const.
825 template <typename X, typename = std::enable_if_t<std::is_same<X, value_type>::value>>
826 constexpr ARCCORE_HOST_DEVICE SmallSpan(const ConstArrayView<X>& from) noexcept
827 : BaseClass(from.m_ptr, from.m_size)
828 {}
829
830 // Pour un Span<const T>, on a le droit de construire depuis un Span<T>
831 template <typename X, typename = std::enable_if_t<std::is_same<X, value_type>::value>>
832 constexpr ARCCORE_HOST_DEVICE SmallSpan(const SmallSpan<X>& from) noexcept
833 : BaseClass(from)
834 {}
835
836 template <Int32 XExtent>
837 constexpr ARCCORE_HOST_DEVICE SmallSpan(const SpanImpl<T, Int32, XExtent>& from) noexcept
838 : BaseClass(from)
839 {}
840
842 constexpr ARCCORE_HOST_DEVICE SmallSpan(pointer ptr, Int32 asize) noexcept
843 : BaseClass(ptr, asize)
844 {}
845
846 template <std::size_t N, typename X, typename = is_same_const_type<X>>
847 constexpr ARCCORE_HOST_DEVICE SmallSpan(std::array<X, N>& from)
848 : BaseClass(from)
849 {}
850
852 explicit constexpr ARCCORE_HOST_DEVICE SmallSpan(T* ptr) requires(!IsDynamic)
853 : BaseClass(ptr)
854 {}
855
857 template <std::size_t N, typename X, typename = is_same_const_type<X>>
858 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(std::array<X, N>& from)
859 {
861 return (*this);
862 }
863
864 public:
865
867 // contenant \a asize éléments.
868 static constexpr ThatClass create(pointer ptr, size_type asize) noexcept
869 {
870 return ThatClass(ptr, asize);
871 }
872
873 public:
874
882 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subspan(Int32 abegin, Int32 asize) const
883 {
884 return BaseClass::subspan(abegin, asize);
885 }
886
894 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subSpan(Int32 abegin, Int32 asize) const
895 {
896 return BaseClass::subSpan(abegin, asize);
897 }
898
906 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subPart(Int32 abegin, Int32 asize) const
907 {
908 return BaseClass::subSpan(abegin, asize);
909 }
910
912 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subSpanInterval(Int32 index, Int32 nb_interval) const
913 {
914 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
915 }
916
918 constexpr ARCCORE_HOST_DEVICE ThatClass subPartInterval(Int32 index, Int32 nb_interval) const
919 {
920 return subSpanInterval(index, nb_interval);
921 }
922
930 ARCCORE_DEPRECATED_REASON("Y2023: use subPart() instead")
931 constexpr ARCCORE_HOST_DEVICE SmallSpan<T> subView(Int32 abegin, Int32 asize) const
932 {
933 return subspan(abegin, asize);
934 }
935
937 ARCCORE_DEPRECATED_REASON("Y2023: use subPartInterval() instead")
938 constexpr ARCCORE_HOST_DEVICE SmallSpan<T> subViewInterval(Int32 index, Int32 nb_interval) const
939 {
940 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
941 }
942};
943
944/*---------------------------------------------------------------------------*/
945/*---------------------------------------------------------------------------*/
954template <typename T, typename SizeType> inline void
955dumpArray(std::ostream& o, SpanImpl<const T, SizeType> val, int max_print)
956{
957 impl::dumpArray(o, val, max_print);
958}
959
960/*---------------------------------------------------------------------------*/
961/*---------------------------------------------------------------------------*/
970template <typename DataType, typename IntegerType, typename SizeType> inline void
974{
975 const Int64 result_size = indexes.size();
976 [[maybe_unused]] const Int64 my_size = values.size();
977 const DataType* ptr = values.data();
978 for (Int64 i = 0; i < result_size; ++i) {
979 IntegerType index = indexes[i];
980 ARCCORE_CHECK_AT(index, my_size);
981 result[i] = ptr[index];
982 }
983}
984
985/*---------------------------------------------------------------------------*/
986/*---------------------------------------------------------------------------*/
995template <typename DataType> inline void
997{
998 _sampleSpan<DataType, Int64, Int64>(values, indexes, result);
999}
1000
1001/*---------------------------------------------------------------------------*/
1002/*---------------------------------------------------------------------------*/
1009template <typename DataType> inline void
1011{
1012 _sampleSpan<DataType, Int32, Int64>(values, indexes, result);
1013}
1014
1015/*---------------------------------------------------------------------------*/
1016/*---------------------------------------------------------------------------*/
1020template <typename DataType, typename SizeType, SizeType Extent>
1021inline typename Impl::SpanTypeFromSize<const std::byte, SizeType>::SpanType
1023{
1024 return { reinterpret_cast<const std::byte*>(s.data()), s.sizeBytes() };
1025}
1026
1030template <typename DataType>
1031inline SmallSpan<const std::byte>
1033{
1034 return asBytes(SmallSpan<DataType>(s));
1035}
1036
1040template <typename DataType>
1041inline SmallSpan<const std::byte>
1046
1047/*---------------------------------------------------------------------------*/
1048/*---------------------------------------------------------------------------*/
1054template <typename DataType, typename SizeType, SizeType Extent,
1055 typename std::enable_if_t<!std::is_const<DataType>::value, int> = 0>
1056inline typename Impl::SpanTypeFromSize<std::byte, SizeType>::SpanType
1058{
1059 return { reinterpret_cast<std::byte*>(s.data()), s.sizeBytes() };
1060}
1061
1067template <typename DataType> inline SmallSpan<std::byte>
1072
1073/*---------------------------------------------------------------------------*/
1074/*---------------------------------------------------------------------------*/
1075
1076namespace impl
1077{
1078
1079 template <typename ByteType, typename DataType, Int64 Extent> inline Span<DataType>
1080 asSpanInternal(Span<ByteType, Extent> bytes)
1081 {
1082 Int64 size = bytes.size();
1083 if (size == 0)
1084 return {};
1085 static constexpr Int64 data_type_size = static_cast<Int64>(sizeof(DataType));
1086 static_assert(data_type_size > 0, "Bad datatype size");
1087 ARCCORE_ASSERT((size % data_type_size) == 0, ("Size is not a multiple of sizeof(DataType)"));
1088 auto* ptr = reinterpret_cast<DataType*>(bytes.data());
1089 return { ptr, size / data_type_size };
1090 }
1091
1092 template <typename ByteType, typename DataType, Int32 Extent> inline SmallSpan<DataType>
1093 asSmallSpanInternal(SmallSpan<ByteType, Extent> bytes)
1094 {
1095 Int32 size = bytes.size();
1096 if (size == 0)
1097 return {};
1098 static constexpr Int32 data_type_size = static_cast<Int32>(sizeof(DataType));
1099 static_assert(data_type_size > 0, "Bad datatype size");
1100 ARCCORE_ASSERT((size % data_type_size) == 0, ("Size is not a multiple of sizeof(DataType)"));
1101 auto* ptr = reinterpret_cast<DataType*>(bytes.data());
1102 return { ptr, size / data_type_size };
1103 }
1104
1105} // namespace impl
1106
1107/*---------------------------------------------------------------------------*/
1108/*---------------------------------------------------------------------------*/
1113template <typename DataType, Int64 Extent> inline Span<DataType>
1115{
1116 return impl::asSpanInternal<std::byte, DataType, Extent>(bytes);
1117}
1118
1122template <typename DataType, Int64 Extent> inline Span<const DataType>
1124{
1125 return impl::asSpanInternal<const std::byte, const DataType, Extent>(bytes);
1126}
1127
1131template <typename DataType, Int32 Extent> inline SmallSpan<DataType>
1133{
1134 return impl::asSmallSpanInternal<std::byte, DataType, Extent>(bytes);
1135}
1136
1140template <typename DataType, Int32 Extent> inline SmallSpan<const DataType>
1142{
1143 return impl::asSmallSpanInternal<const std::byte, const DataType, Extent>(bytes);
1144}
1145
1146/*---------------------------------------------------------------------------*/
1147/*---------------------------------------------------------------------------*/
1151template <typename DataType, size_t SizeType> inline Span<DataType, SizeType>
1152asSpan(std::array<DataType, SizeType>& s)
1153{
1154 Int64 size = static_cast<Int64>(s.size());
1155 return { s.data(), size };
1156}
1157
1160template <typename DataType, size_t SizeType> inline SmallSpan<DataType, SizeType>
1161asSmallSpan(std::array<DataType, SizeType>& s)
1162{
1163 Int32 size = static_cast<Int32>(s.size());
1164 return { s.data(), size };
1165}
1166
1167/*---------------------------------------------------------------------------*/
1168/*---------------------------------------------------------------------------*/
1174extern "C++" ARCCORE_BASE_EXPORT void
1175binaryWrite(std::ostream& ostr, const Span<const std::byte>& bytes);
1176
1182extern "C++" ARCCORE_BASE_EXPORT void
1183binaryRead(std::istream& istr, const Span<std::byte>& bytes);
1184
1185/*---------------------------------------------------------------------------*/
1186/*---------------------------------------------------------------------------*/
1187
1188} // namespace Arcane
1189
1190/*---------------------------------------------------------------------------*/
1191/*---------------------------------------------------------------------------*/
1192
1193namespace Arccore
1194{
1195using Arcane::asBytes;
1197using Arcane::asSpan;
1199using Arcane::binaryRead;
1201using Arcane::sampleSpan;
1202} // namespace Arccore
1203
1204/*---------------------------------------------------------------------------*/
1205/*---------------------------------------------------------------------------*/
1206
1207#endif
Itérateur sur les classes tableau de Arccore.
Intervalle sur les classes tableau de Arccore.
Vue modifiable d'un tableau d'un type T.
Vue constante d'un tableau de type T.
Spécialisation pour le nombre d'éléments connu à la compilation.
Definition Span.h:107
Pour avoir le type (SmallSpan ou Span) en fonction de la taille (Int32 ou Int64)
Definition Span.h:50
Vue d'un tableau d'éléments de type T.
Definition Span.h:801
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:882
constexpr __host__ __device__ SmallSpan< DataType > subViewInterval(Int32 index, Int32 nb_interval) const
Definition Span.h:938
constexpr __host__ __device__ ThatClass & operator=(std::array< X, N > &from)
Opérateur de recopie.
Definition Span.h:858
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:912
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:906
SmallSpan()=default
Construit une vue vide.
constexpr __host__ __device__ SmallSpan(const ArrayView< value_type > &from) noexcept
Constructeur de recopie depuis une autre vue.
Definition Span.h:819
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:842
constexpr __host__ __device__ SmallSpan< DataType > subView(Int32 abegin, Int32 asize) const
Definition Span.h:931
constexpr __host__ __device__ SmallSpan(T *ptr)
Construit une vue depuis un pointeur avec une taille fixe.
Definition Span.h:852
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:868
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:894
constexpr __host__ __device__ ThatClass subPartInterval(Int32 index, Int32 nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:918
Vue d'un tableau d'éléments de type T.
Definition Span.h:190
constexpr __host__ __device__ SpanImpl(pointer ptr, SizeType asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et contenant asize éléments.
Definition Span.h:243
constexpr __host__ __device__ SpanImpl(const SpanImpl< X, SizeType, XExtent > &from) noexcept
Constructeur de recopie depuis une autre vue.
Definition Span.h:231
constexpr view_type smallView()
Vue constante sur cette vue.
Definition Span.h:390
__host__ __device__ void copy(const U &copy_array)
Recopie le tableau copy_array dans l'instance.
Definition Span.h:475
constexpr SubSpanType subView(SizeType abegin, SizeType asize) const
Definition Span.h:437
friend bool operator==(const SpanImpl< T, SizeType, Extent > &rhs, const SpanImpl< X, SizeType, Extent2 > &lhs)
Opérateur d'égalité (valide si T est const mais pas X)
Definition Span.h:541
constexpr __host__ __device__ SpanImpl(std::array< X, N > &from)
Construit une vue depuis un std::array.
Definition Span.h:250
std::optional< SizeType > findFirst(const_reference v) const
Definition Span.h:507
constexpr void _setArray(pointer v, SizeType s) noexcept
Modifie le pointeur et la taille du tableau.
Definition Span.h:581
constexpr __host__ __device__ SpanImpl(T *ptr)
Construit une vue depuis un pointeur avec une taille fixe.
Definition Span.h:256
constexpr __host__ __device__ pointer data() const noexcept
Definition Span.h:537
constexpr __host__ __device__ SizeType length() const noexcept
Nombre d'éléments du tableau.
Definition Span.h:333
constexpr __host__ __device__ iterator begin() const noexcept
Itérateur sur le premier élément du tableau.
Definition Span.h:338
__host__ __device__ void fill(T o)
Remplit le tableau avec la valeur o.
Definition Span.h:381
constexpr __host__ __device__ pointer ptrAt(SizeType index) const
Adresse du index-ème élément.
Definition Span.h:360
constexpr __host__ __device__ reference operator()(SizeType i) const
i-ème élément du tableau.
Definition Span.h:296
constexpr __host__ __device__ reference operator[](SizeType i) const
i-ème élément du tableau.
Definition Span.h:285
ArrayRange< pointer > range() const
Definition Span.h:352
constexpr __host__ __device__ bool empty() const noexcept
Retourne true si le tableau est vide (dimension nulle)
Definition Span.h:490
ARCCORE_NO_UNIQUE_ADDRESS ExtentStorageType m_size
Definition Span.h:607
constexpr SubSpanType subViewInterval(SizeType index, SizeType nb_interval) const
Definition Span.h:450
constexpr __host__ __device__ SubSpanType subSpan(SizeType abegin, SizeType asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:412
constexpr __host__ __device__ reference item(SizeType i) const
i-ème élément du tableau.
Definition Span.h:307
constexpr ConstArrayView< value_type > constSmallView() const
Vue constante sur cette vue.
Definition Span.h:399
friend bool operator==(const SpanImpl< T, SizeType, Extent > &rhs, const SpanImpl< T, SizeType, Extent2 > &lhs)
Opérateur d'égalité
Definition Span.h:555
constexpr SubSpanType subPartInterval(SizeType index, SizeType nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:462
__host__ __device__ bool contains(const_reference v) const
true si le tableau contient l'élément de valeur v
Definition Span.h:492
constexpr __host__ __device__ ThatClass & operator=(std::array< X, N > &from)
Opérateur de recopie.
Definition Span.h:262
constexpr __host__ __device__ iterator end() const noexcept
Itérateur sur le premier élément après la fin du tableau.
Definition Span.h:342
constexpr void _setPtr(pointer v) noexcept
Modifie le pointeur du début du tableau.
Definition Span.h:593
friend bool operator!=(const SpanImpl< T, SizeType, Extent > &rhs, const SpanImpl< X, SizeType, Extent2 > &lhs)
Opérateur d'inégalité (valide si T est const mais pas X)
Definition Span.h:548
constexpr __host__ __device__ reverse_iterator rend() const noexcept
Itérateur inverse sur le premier élément après la fin du tableau.
Definition Span.h:346
constexpr __host__ __device__ SizeType size() const noexcept
Definition Span.h:325
constexpr __host__ __device__ SizeType sizeBytes() const noexcept
Retourne la taille du tableau en octets.
Definition Span.h:327
constexpr __host__ __device__ reverse_iterator rbegin() const noexcept
Itérateur inverse sur le premier élément du tableau.
Definition Span.h:344
friend bool operator!=(const SpanImpl< T, SizeType, Extent > &rhs, const SpanImpl< T, SizeType, Extent2 > &lhs)
Opérateur d'inégalité
Definition Span.h:562
constexpr void _setSize(SizeType s) noexcept
Modifie la taille du tableau.
Definition Span.h:601
constexpr __host__ __device__ SubSpanType subspan(SizeType abegin, SizeType asize) const
Pour compatibilité avec le C++20.
Definition Span.h:443
constexpr __host__ __device__ SubSpanType subPart(SizeType abegin, SizeType asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:424
constexpr __host__ __device__ SpanImpl() noexcept
Construit une vue vide.
Definition Span.h:223
constexpr SubSpanType subSpanInterval(SizeType index, SizeType nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:456
constexpr __host__ __device__ void setItem(SizeType i, const_reference v) noexcept
Positionne le i-ème élément du tableau.
Definition Span.h:318
static constexpr ThatClass create(pointer ptr, SizeType asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et.
Definition Span.h:273
std::enable_if_t< std::is_same_v< X, T >||std::is_same_v< std::add_const_t< X >, T > > is_same_const_type
Definition Span.h:216
Vue d'un tableau d'éléments de type T.
Definition Span.h:633
constexpr __host__ __device__ Span< T, DynExtent > subPart(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:745
constexpr __host__ __device__ Span< T, DynExtent > subSpanInterval(Int64 index, Int64 nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:751
static constexpr ThatClass create(pointer ptr, size_type asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et.
Definition Span.h:707
constexpr __host__ __device__ Span(std::array< X, N > &from) noexcept
Construit une vue à partir d'un std::array.
Definition Span.h:685
constexpr __host__ __device__ Span< DataType > subView(Int64 abegin, Int64 asize) const
Definition Span.h:770
constexpr __host__ __device__ Span(pointer ptr, Int64 asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et contenant asize éléments.
Definition Span.h:679
constexpr __host__ __device__ ThatClass & operator=(std::array< X, N > &from) noexcept
Opérateur de recopie.
Definition Span.h:696
constexpr __host__ __device__ Span(T *ptr)
Construit une vue depuis un pointeur avec une taille fixe.
Definition Span.h:690
constexpr __host__ __device__ Span(const ArrayView< value_type > &from) noexcept
Constructeur de recopie depuis une autre vue.
Definition Span.h:650
Span()=default
Construit une vue vide.
constexpr __host__ __device__ Span< DataType > subViewInterval(Int64 index, Int64 nb_interval) const
Definition Span.h:777
constexpr __host__ __device__ Span< T, DynExtent > subPartInterval(Int64 index, Int64 nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:757
constexpr __host__ __device__ Span< T, DynExtent > subSpan(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:733
constexpr __host__ __device__ Span< T, DynExtent > subspan(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:721
std::ostream & operator<<(std::ostream &o, eExecutionPolicy exec_policy)
Affiche le nom de la politique d'exécution.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
constexpr __host__ __device__ Integer arccoreCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
constexpr Int32 DynExtent
Constante pour indiquer que la dimension d'un tableau est dynamique.
Definition BaseTypes.h:54
__host__ __device__ void arccoreCheckAt(Int64 i, Int64 max_size)
Vérifie un éventuel débordement de tableau.
void dumpArray(std::ostream &o, ConstArrayView< T > val, int max_print)
Affiche sur le flot o les valeurs du tableau val.
void sampleSpan(Span< const DataType > values, Span< const Int64 > indexes, Span< DataType > result)
Extrait un sous-tableau à à partir d'une liste d'index.
Definition Span.h:996
SmallSpan< DataType > asSmallSpan(SmallSpan< std::byte, Extent > bytes)
Converti un SmallSpan<std::byte> en un SmallSpan<DataType>.
Definition Span.h:1132
Span< DataType > asSpan(Span< std::byte, Extent > bytes)
Converti un Span<std::byte> en un Span<DataType>.
Definition Span.h:1114
void binaryRead(std::istream &istr, const Span< std::byte > &bytes)
Lit en binaire le contenu de bytes depuis le flot istr.
Definition ArrayView.cc:71
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:1022
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:1057
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:971
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:61
std::int32_t Int32
Type entier signé sur 32 bits.
Espace de nom de Arccore.
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition rapidjson.h:416