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
98template <typename SizeType, SizeType FixedExtent>
99class ExtentStorage
100{
101 template <typename T, typename SpanSizeType, SpanSizeType SpanExtent>
102 friend class ::Arcane::SpanImpl;
103
104 public:
105
106 explicit constexpr ExtentStorage(SizeType) noexcept {}
107
108 public:
109
110 constexpr SizeType size() const noexcept { return FixedExtent; }
111
112 private:
113
114 static constexpr SizeType m_size = FixedExtent;
115};
116
118template <>
119class ExtentStorage<Int32, DynExtent>
120: public DynamicExtentStorage<Int32>
121{
122 using BaseClass = DynamicExtentStorage<Int32>;
123
124 public:
125
126 explicit constexpr ExtentStorage(Int32 s) noexcept
127 : BaseClass(s)
128 {}
129};
130
132template <>
133class ExtentStorage<Int64, DynExtent>
134: public DynamicExtentStorage<Int64>
135{
136 using BaseClass = DynamicExtentStorage<Int64>;
137
138 public:
139
140 explicit constexpr ExtentStorage(Int64 s) noexcept
141 : BaseClass(s)
142 {}
143};
144
145/*---------------------------------------------------------------------------*/
146/*---------------------------------------------------------------------------*/
147
148} // namespace Arcane::Impl
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152
153namespace Arcane
154{
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
174template <typename T, typename SizeType, SizeType Extent>
176{
177 using ExtentStorageType = Impl::ExtentStorage<SizeType, Extent>;
178
179 public:
180
181 using ThatClass = SpanImpl<T, SizeType, Extent>;
182 using SubSpanType = SpanImpl<T, SizeType, DynExtent>;
183 using size_type = SizeType;
184 using ElementType = T;
185 using element_type = ElementType;
186 using value_type = typename std::remove_cv_t<ElementType>;
187 using const_value_type = typename std::add_const_t<value_type>;
188 using index_type = SizeType;
189 using difference_type = SizeType;
190 using pointer = ElementType*;
191 using const_pointer = const ElementType*;
192 using reference = ElementType&;
193 using const_reference = const ElementType&;
194 using iterator = ArrayIterator<pointer>;
195 using const_iterator = ArrayIterator<const_pointer>;
196 using view_type = typename Impl::ViewTypeT<ElementType>::view_type;
197 using reverse_iterator = std::reverse_iterator<iterator>;
198 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
199
201 template <typename X>
202 using is_same_const_type = std::enable_if_t<std::is_same_v<X, T> || std::is_same_v<std::add_const_t<X>, T>>;
203
204 public:
205
207 constexpr ARCCORE_HOST_DEVICE SpanImpl() noexcept
208 : m_ptr(nullptr)
209 , m_size(0)
210 {}
211
213 // Pour un Span<const T>, on a le droit de construire depuis un Span<T>
214 template <typename X, SizeType XExtent, typename = std::enable_if_t<std::is_same_v<const X, T>>>
215 constexpr ARCCORE_HOST_DEVICE SpanImpl(const SpanImpl<X, SizeType, XExtent>& from) noexcept
216 : m_ptr(from.data())
217 , m_size(from.size())
218 {}
219
220 template <SizeType XExtent>
221 constexpr ARCCORE_HOST_DEVICE SpanImpl(const SpanImpl<T, SizeType, XExtent>& from) noexcept
222 : m_ptr(from.data())
223 , m_size(from.size())
224 {}
225
227 constexpr ARCCORE_HOST_DEVICE SpanImpl(pointer ptr, SizeType asize) noexcept
228 : m_ptr(ptr)
229 , m_size(asize)
230 {}
231
233 template <std::size_t N, typename X, typename = is_same_const_type<X>>
234 constexpr ARCCORE_HOST_DEVICE SpanImpl(std::array<X, N>& from)
235 : m_ptr(from.data())
236 , m_size(ArraySizeChecker<SizeType>::check(from.size()))
237 {}
238
240 template <std::size_t N, typename X, typename = is_same_const_type<X>>
241 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(std::array<X, N>& from)
242 {
243 m_ptr = from.data();
244 m_size = ExtentStorageType(ArraySizeChecker<SizeType>::check(from.size()));
245 return (*this);
246 }
247
248 public:
249
251 // contenant \a asize éléments.
252 static constexpr ThatClass create(pointer ptr, SizeType asize) noexcept
253 {
254 return ThatClass(ptr, asize);
255 }
256
257 public:
258
264 constexpr ARCCORE_HOST_DEVICE reference operator[](SizeType i) const
265 {
266 ARCCORE_CHECK_AT(i, m_size.m_size);
267 return m_ptr[i];
268 }
269
275 constexpr ARCCORE_HOST_DEVICE reference operator()(SizeType i) const
276 {
277 ARCCORE_CHECK_AT(i, m_size.m_size);
278 return m_ptr[i];
279 }
280
286 constexpr ARCCORE_HOST_DEVICE reference item(SizeType i) const
287 {
288 ARCCORE_CHECK_AT(i, m_size.m_size);
289 return m_ptr[i];
290 }
291
297 constexpr ARCCORE_HOST_DEVICE void setItem(SizeType i, const_reference v) noexcept
298 {
299 ARCCORE_CHECK_AT(i, m_size.m_size);
300 m_ptr[i] = v;
301 }
302
304 constexpr ARCCORE_HOST_DEVICE SizeType size() const noexcept { return m_size.m_size; }
306 constexpr ARCCORE_HOST_DEVICE SizeType sizeBytes() const noexcept
307 {
308 // TODO: retourner toujours un Int64
309 return static_cast<SizeType>(m_size.m_size * sizeof(value_type));
310 }
311
312 constexpr ARCCORE_HOST_DEVICE SizeType length() const noexcept { return m_size.m_size; }
313
317 constexpr ARCCORE_HOST_DEVICE iterator begin() const noexcept { return iterator(m_ptr); }
321 constexpr ARCCORE_HOST_DEVICE iterator end() const noexcept { return iterator(m_ptr + m_size.m_size); }
323 constexpr ARCCORE_HOST_DEVICE reverse_iterator rbegin() const noexcept { return std::make_reverse_iterator(end()); }
325 constexpr ARCCORE_HOST_DEVICE reverse_iterator rend() const noexcept { return std::make_reverse_iterator(begin()); }
326
327 public:
328
330 ARCCORE_DEPRECATED_REASON("Y2023: Use begin()/end() instead")
331 ArrayRange<pointer> range() const
332 {
333 return ArrayRange<pointer>(m_ptr, m_ptr + m_size.m_size);
334 }
335
336 public:
337
339 constexpr ARCCORE_HOST_DEVICE pointer ptrAt(SizeType index) const
340 {
341 ARCCORE_CHECK_AT(index, m_size.m_size);
342 return m_ptr + index;
343 }
344
345 // Elément d'indice \a i. Vérifie toujours les débordements
346 constexpr ARCCORE_HOST_DEVICE reference at(SizeType i) const
347 {
348 arccoreCheckAt(i, m_size.m_size);
349 return m_ptr[i];
350 }
351
352 // Positionne l'élément d'indice \a i. Vérifie toujours les débordements
353 constexpr ARCCORE_HOST_DEVICE void setAt(SizeType i, const_reference value)
354 {
355 arccoreCheckAt(i, m_size.m_size);
356 m_ptr[i] = value;
357 }
358
360 ARCCORE_HOST_DEVICE inline void fill(T o)
361 {
362 for (SizeType i = 0, n = m_size.m_size; i < n; ++i)
363 m_ptr[i] = o;
364 }
365
369 constexpr view_type smallView()
370 {
372 return view_type(s, m_ptr);
373 }
374
383
391 constexpr ARCCORE_HOST_DEVICE SubSpanType subSpan(SizeType abegin, SizeType asize) const
392 {
393 if (abegin >= m_size.m_size)
394 return {};
395 asize = _min(asize, m_size.m_size - abegin);
396 return { m_ptr + abegin, asize };
397 }
398
403 constexpr ARCCORE_HOST_DEVICE SubSpanType subPart(SizeType abegin, SizeType asize) const
404 {
405 return subSpan(abegin, asize);
406 }
407
415 ARCCORE_DEPRECATED_REASON("Y2023: use subSpan() instead")
416 constexpr SubSpanType subView(SizeType abegin, SizeType asize) const
417 {
418 return subSpan(abegin, asize);
419 }
420
422 constexpr ARCCORE_HOST_DEVICE SubSpanType subspan(SizeType abegin, SizeType asize) const
423 {
424 return subSpan(abegin, asize);
425 }
426
428 ARCCORE_DEPRECATED_REASON("Y2023: use subSpanInterval() instead")
429 constexpr SubSpanType subViewInterval(SizeType index, SizeType nb_interval) const
430 {
431 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
432 }
433
435 constexpr SubSpanType subSpanInterval(SizeType index, SizeType nb_interval) const
436 {
437 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
438 }
439
441 constexpr SubSpanType subPartInterval(SizeType index, SizeType nb_interval) const
442 {
443 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
444 }
445
454 template <class U> ARCCORE_HOST_DEVICE void copy(const U& copy_array)
455 {
456 Int64 n = copy_array.size();
457 Int64 size_as_int64 = m_size.m_size;
458 arccoreCheckAt(n, size_as_int64 + 1);
459 const_pointer copy_begin = copy_array.data();
460 pointer to_ptr = m_ptr;
461 // On est sur que \a n tient sur un 'SizeType' car il est plus petit
462 // que \a m_size
463 SizeType n_as_sizetype = static_cast<SizeType>(n);
464 for (SizeType i = 0; i < n_as_sizetype; ++i)
465 to_ptr[i] = copy_begin[i];
466 }
467
469 constexpr ARCCORE_HOST_DEVICE bool empty() const noexcept { return m_size.m_size == 0; }
471 ARCCORE_HOST_DEVICE bool contains(const_reference v) const
472 {
473 for (SizeType i = 0; i < m_size.m_size; ++i) {
474 if (m_ptr[i] == v)
475 return true;
476 }
477 return false;
478 }
479
486 std::optional<SizeType> findFirst(const_reference v) const
487 {
488 for (SizeType i = 0; i < m_size.m_size; ++i) {
489 if (m_ptr[i] == v)
490 return i;
491 }
492 return std::nullopt;
493 }
494
495 public:
496
497 constexpr ARCCORE_HOST_DEVICE void setArray(const ArrayView<T>& v) noexcept
498 {
499 m_ptr = v.m_ptr;
500 m_size = v.m_size;
501 }
502 constexpr ARCCORE_HOST_DEVICE void setArray(const Span<T>& v) noexcept
503 {
504 m_ptr = v.m_ptr;
505 m_size = v.m_size;
506 }
507
516 constexpr ARCCORE_HOST_DEVICE pointer data() const noexcept { return m_ptr; }
517
519 template <typename X, SizeType Extent2, typename = std::enable_if_t<std::is_same_v<X, value_type>>> friend bool
521 {
522 return impl::areEqual(SpanImpl<T, SizeType>(rhs), SpanImpl<T, SizeType>(lhs));
523 }
524
526 template <typename X, SizeType Extent2, typename = std::enable_if_t<std::is_same_v<X, value_type>>> friend bool
528 {
529 return !operator==(rhs, lhs);
530 }
531
533 template <SizeType Extent2> friend bool
535 {
536 return impl::areEqual(SpanImpl<T, SizeType>(rhs), SpanImpl<T, SizeType>(lhs));
537 }
538
540 template <SizeType Extent2> friend bool
542 {
543 return !operator==(rhs, lhs);
544 }
545
546 friend inline std::ostream& operator<<(std::ostream& o, const ThatClass& val)
547 {
548 impl::dumpArray(o, Span<const T, DynExtent>(val.data(), val.size()), 500);
549 return o;
550 }
551
552 protected:
553
560 constexpr void _setArray(pointer v, SizeType s) noexcept
561 {
562 m_ptr = v;
563 m_size = s;
564 }
565
572 constexpr void _setPtr(pointer v) noexcept { m_ptr = v; }
573
580 constexpr void _setSize(SizeType s) noexcept { m_size = ExtentStorageType(s); }
581
582 private:
583
584 pointer m_ptr;
586 [[no_unique_address]] ExtentStorageType m_size;
587
588 private:
589
590 static constexpr SizeType _min(SizeType a, SizeType b)
591 {
592 return ((a < b) ? a : b);
593 }
594};
595
596/*---------------------------------------------------------------------------*/
597/*---------------------------------------------------------------------------*/
609template <typename T, Int64 Extent>
610class Span
611: public SpanImpl<T, Int64, Extent>
612{
613 public:
614
615 using ThatClass = Span<T, Extent>;
616 using BaseClass = SpanImpl<T, Int64, Extent>;
617 using size_type = Int64;
618 using value_type = typename BaseClass::value_type;
619 using pointer = typename BaseClass::pointer;
620 template <typename X>
621 using is_same_const_type = std::enable_if_t<std::is_same_v<X, T> || std::is_same_v<std::add_const_t<X>, T>>;
622
623 public:
624
626 Span() = default;
628 constexpr ARCCORE_HOST_DEVICE Span(const ArrayView<value_type>& from) noexcept
629 : BaseClass(from.m_ptr, from.m_size)
630 {}
631 // Constructeur à partir d'un ConstArrayView. Cela n'est autorisé que
632 // si T est const.
633 template <typename X, typename = std::enable_if_t<std::is_same_v<X, value_type>>>
634 constexpr ARCCORE_HOST_DEVICE Span(const ConstArrayView<X>& from) noexcept
635 : BaseClass(from.m_ptr, from.m_size)
636 {}
637 // Pour un Span<const T>, on a le droit de construire depuis un Span<T>
638 template <typename X, Int64 XExtent, typename = std::enable_if_t<std::is_same_v<const X, T>>>
639 constexpr ARCCORE_HOST_DEVICE Span(const Span<X, XExtent>& from) noexcept
640 : BaseClass(from)
641 {}
642 // Pour un Span<const T>, on a le droit de construire depuis un SmallSpan<T>
643 template <typename X, Int32 XExtent, typename = std::enable_if_t<std::is_same_v<const X, T>>>
644 constexpr ARCCORE_HOST_DEVICE Span(const SmallSpan<X, XExtent>& from) noexcept
645 : BaseClass(from.data(), from.size())
646 {}
647 template <Int64 XExtent>
648 constexpr ARCCORE_HOST_DEVICE Span(const SpanImpl<T, Int64, XExtent>& from) noexcept
649 : BaseClass(from)
650 {}
651 template <Int32 XExtent>
652 constexpr ARCCORE_HOST_DEVICE Span(const SpanImpl<T, Int32, XExtent>& from) noexcept
653 : BaseClass(from.data(), from.size())
654 {}
655
657 constexpr ARCCORE_HOST_DEVICE Span(pointer ptr, Int64 asize) noexcept
658 : BaseClass(ptr, asize)
659 {}
660
662 template <std::size_t N, typename X, typename = is_same_const_type<X>>
663 constexpr ARCCORE_HOST_DEVICE Span(std::array<X, N>& from) noexcept
664 : BaseClass(from.data(), from.size())
665 {}
666
668 template <std::size_t N, typename X, typename = is_same_const_type<X>>
669 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(std::array<X, N>& from) noexcept
670 {
671 this->_setPtr(from.data());
672 this->_setSize(from.size());
673 return (*this);
674 }
675
676 public:
677
679 // contenant \a asize éléments.
680 static constexpr ThatClass create(pointer ptr, size_type asize) noexcept
681 {
682 return ThatClass(ptr, asize);
683 }
684
685 public:
686
694 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subspan(Int64 abegin, Int64 asize) const
695 {
696 return BaseClass::subspan(abegin, asize);
697 }
698
706 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subSpan(Int64 abegin, Int64 asize) const
707 {
708 return BaseClass::subSpan(abegin, asize);
709 }
710
718 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subPart(Int64 abegin, Int64 asize) const
719 {
720 return BaseClass::subPart(abegin, asize);
721 }
722
724 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subSpanInterval(Int64 index, Int64 nb_interval) const
725 {
726 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
727 }
728
730 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subPartInterval(Int64 index, Int64 nb_interval) const
731 {
732 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
733 }
734
742 ARCCORE_DEPRECATED_REASON("Y2023: use subSpan() instead")
743 constexpr ARCCORE_HOST_DEVICE Span<T> subView(Int64 abegin, Int64 asize) const
744 {
745 return subspan(abegin, asize);
746 }
747
749 ARCCORE_DEPRECATED_REASON("Y2023: use subSpanInterval() instead")
750 constexpr ARCCORE_HOST_DEVICE Span<T> subViewInterval(Int64 index, Int64 nb_interval) const
751 {
752 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
753 }
754};
755
756/*---------------------------------------------------------------------------*/
757/*---------------------------------------------------------------------------*/
771template <typename T, Int32 Extent>
773: public SpanImpl<T, Int32, Extent>
774{
775 public:
776
777 using ThatClass = SmallSpan<T, Extent>;
778 using BaseClass = SpanImpl<T, Int32, Extent>;
779 using size_type = Int32;
780 using value_type = typename BaseClass::value_type;
781 using pointer = typename BaseClass::pointer;
782 template <typename X>
783 using is_same_const_type = std::enable_if_t<std::is_same_v<X, T> || std::is_same_v<std::add_const_t<X>, T>>;
784
785 public:
786
788 SmallSpan() = default;
789
791 constexpr ARCCORE_HOST_DEVICE SmallSpan(const ArrayView<value_type>& from) noexcept
792 : BaseClass(from.m_ptr, from.m_size)
793 {}
794
795 // Constructeur à partir d'un ConstArrayView. Cela n'est autorisé que
796 // si T est const.
797 template <typename X, typename = std::enable_if_t<std::is_same<X, value_type>::value>>
798 constexpr ARCCORE_HOST_DEVICE SmallSpan(const ConstArrayView<X>& from) noexcept
799 : BaseClass(from.m_ptr, from.m_size)
800 {}
801
802 // Pour un Span<const T>, on a le droit de construire depuis un Span<T>
803 template <typename X, typename = std::enable_if_t<std::is_same<X, value_type>::value>>
804 constexpr ARCCORE_HOST_DEVICE SmallSpan(const SmallSpan<X>& from) noexcept
805 : BaseClass(from)
806 {}
807
808 template <Int32 XExtent>
809 constexpr ARCCORE_HOST_DEVICE SmallSpan(const SpanImpl<T, Int32, XExtent>& from) noexcept
810 : BaseClass(from)
811 {}
812
814 constexpr ARCCORE_HOST_DEVICE SmallSpan(pointer ptr, Int32 asize) noexcept
815 : BaseClass(ptr, asize)
816 {}
817
818 template <std::size_t N, typename X, typename = is_same_const_type<X>>
819 constexpr ARCCORE_HOST_DEVICE SmallSpan(std::array<X, N>& from)
820 : BaseClass(from)
821 {}
822
824 template <std::size_t N, typename X, typename = is_same_const_type<X>>
825 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(std::array<X, N>& from)
826 {
828 return (*this);
829 }
830
831 public:
832
834 // contenant \a asize éléments.
835 static constexpr ThatClass create(pointer ptr, size_type asize) noexcept
836 {
837 return ThatClass(ptr, asize);
838 }
839
840 public:
841
849 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subspan(Int32 abegin, Int32 asize) const
850 {
851 return BaseClass::subspan(abegin, asize);
852 }
853
861 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subSpan(Int32 abegin, Int32 asize) const
862 {
863 return BaseClass::subSpan(abegin, asize);
864 }
865
873 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subPart(Int32 abegin, Int32 asize) const
874 {
875 return BaseClass::subSpan(abegin, asize);
876 }
877
879 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subSpanInterval(Int32 index, Int32 nb_interval) const
880 {
881 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
882 }
883
885 constexpr ARCCORE_HOST_DEVICE ThatClass subPartInterval(Int32 index, Int32 nb_interval) const
886 {
887 return subSpanInterval(index, nb_interval);
888 }
889
897 ARCCORE_DEPRECATED_REASON("Y2023: use subPart() instead")
898 constexpr ARCCORE_HOST_DEVICE SmallSpan<T> subView(Int32 abegin, Int32 asize) const
899 {
900 return subspan(abegin, asize);
901 }
902
904 ARCCORE_DEPRECATED_REASON("Y2023: use subPartInterval() instead")
905 constexpr ARCCORE_HOST_DEVICE SmallSpan<T> subViewInterval(Int32 index, Int32 nb_interval) const
906 {
907 return impl::subViewInterval<ThatClass>(*this, index, nb_interval);
908 }
909};
910
911/*---------------------------------------------------------------------------*/
912/*---------------------------------------------------------------------------*/
921template <typename T, typename SizeType> inline void
922dumpArray(std::ostream& o, SpanImpl<const T, SizeType> val, int max_print)
923{
924 impl::dumpArray(o, val, max_print);
925}
926
927/*---------------------------------------------------------------------------*/
928/*---------------------------------------------------------------------------*/
937template <typename DataType, typename IntegerType, typename SizeType> inline void
941{
942 const Int64 result_size = indexes.size();
943 [[maybe_unused]] const Int64 my_size = values.size();
944 const DataType* ptr = values.data();
945 for (Int64 i = 0; i < result_size; ++i) {
946 IntegerType index = indexes[i];
947 ARCCORE_CHECK_AT(index, my_size);
948 result[i] = ptr[index];
949 }
950}
951
952/*---------------------------------------------------------------------------*/
953/*---------------------------------------------------------------------------*/
962template <typename DataType> inline void
964{
965 _sampleSpan<DataType, Int64, Int64>(values, indexes, result);
966}
967
968/*---------------------------------------------------------------------------*/
969/*---------------------------------------------------------------------------*/
976template <typename DataType> inline void
978{
979 _sampleSpan<DataType, Int32, Int64>(values, indexes, result);
980}
981
982/*---------------------------------------------------------------------------*/
983/*---------------------------------------------------------------------------*/
987template <typename DataType, typename SizeType, SizeType Extent>
988inline typename Impl::SpanTypeFromSize<const std::byte, SizeType>::SpanType
990{
991 return { reinterpret_cast<const std::byte*>(s.data()), s.sizeBytes() };
992}
993
997template <typename DataType>
998inline SmallSpan<const std::byte>
1000{
1001 return asBytes(SmallSpan<DataType>(s));
1002}
1003
1007template <typename DataType>
1008inline SmallSpan<const std::byte>
1013
1014/*---------------------------------------------------------------------------*/
1015/*---------------------------------------------------------------------------*/
1021template <typename DataType, typename SizeType, SizeType Extent,
1022 typename std::enable_if_t<!std::is_const<DataType>::value, int> = 0>
1023inline typename Impl::SpanTypeFromSize<std::byte, SizeType>::SpanType
1025{
1026 return { reinterpret_cast<std::byte*>(s.data()), s.sizeBytes() };
1027}
1028
1034template <typename DataType> inline SmallSpan<std::byte>
1039
1040/*---------------------------------------------------------------------------*/
1041/*---------------------------------------------------------------------------*/
1042
1043namespace impl
1044{
1045
1046 template <typename ByteType, typename DataType, Int64 Extent> inline Span<DataType>
1047 asSpanInternal(Span<ByteType, Extent> bytes)
1048 {
1049 Int64 size = bytes.size();
1050 if (size == 0)
1051 return {};
1052 static constexpr Int64 data_type_size = static_cast<Int64>(sizeof(DataType));
1053 static_assert(data_type_size > 0, "Bad datatype size");
1054 ARCCORE_ASSERT((size % data_type_size) == 0, ("Size is not a multiple of sizeof(DataType)"));
1055 auto* ptr = reinterpret_cast<DataType*>(bytes.data());
1056 return { ptr, size / data_type_size };
1057 }
1058
1059 template <typename ByteType, typename DataType, Int32 Extent> inline SmallSpan<DataType>
1060 asSmallSpanInternal(SmallSpan<ByteType, Extent> bytes)
1061 {
1062 Int32 size = bytes.size();
1063 if (size == 0)
1064 return {};
1065 static constexpr Int32 data_type_size = static_cast<Int32>(sizeof(DataType));
1066 static_assert(data_type_size > 0, "Bad datatype size");
1067 ARCCORE_ASSERT((size % data_type_size) == 0, ("Size is not a multiple of sizeof(DataType)"));
1068 auto* ptr = reinterpret_cast<DataType*>(bytes.data());
1069 return { ptr, size / data_type_size };
1070 }
1071
1072} // namespace impl
1073
1074/*---------------------------------------------------------------------------*/
1075/*---------------------------------------------------------------------------*/
1080template <typename DataType, Int64 Extent> inline Span<DataType>
1082{
1083 return impl::asSpanInternal<std::byte, DataType, Extent>(bytes);
1084}
1085
1089template <typename DataType, Int64 Extent> inline Span<const DataType>
1091{
1092 return impl::asSpanInternal<const std::byte, const DataType, Extent>(bytes);
1093}
1094
1098template <typename DataType, Int32 Extent> inline SmallSpan<DataType>
1100{
1101 return impl::asSmallSpanInternal<std::byte, DataType, Extent>(bytes);
1102}
1103
1107template <typename DataType, Int32 Extent> inline SmallSpan<const DataType>
1109{
1110 return impl::asSmallSpanInternal<const std::byte, const DataType, Extent>(bytes);
1111}
1112
1113/*---------------------------------------------------------------------------*/
1114/*---------------------------------------------------------------------------*/
1118template <typename DataType, size_t SizeType> inline Span<DataType, SizeType>
1119asSpan(std::array<DataType, SizeType>& s)
1120{
1121 Int64 size = static_cast<Int64>(s.size());
1122 return { s.data(), size };
1123}
1124
1127template <typename DataType, size_t SizeType> inline SmallSpan<DataType, SizeType>
1128asSmallSpan(std::array<DataType, SizeType>& s)
1129{
1130 Int32 size = static_cast<Int32>(s.size());
1131 return { s.data(), size };
1132}
1133
1134/*---------------------------------------------------------------------------*/
1135/*---------------------------------------------------------------------------*/
1141extern "C++" ARCCORE_BASE_EXPORT void
1142binaryWrite(std::ostream& ostr, const Span<const std::byte>& bytes);
1143
1149extern "C++" ARCCORE_BASE_EXPORT void
1150binaryRead(std::istream& istr, const Span<std::byte>& bytes);
1151
1152/*---------------------------------------------------------------------------*/
1153/*---------------------------------------------------------------------------*/
1154
1155} // namespace Arcane
1156
1157/*---------------------------------------------------------------------------*/
1158/*---------------------------------------------------------------------------*/
1159
1160namespace Arccore
1161{
1162using Arcane::asBytes;
1164using Arcane::asSpan;
1166using Arcane::binaryRead;
1168using Arcane::sampleSpan;
1169} // namespace Arccore
1170
1171/*---------------------------------------------------------------------------*/
1172/*---------------------------------------------------------------------------*/
1173
1174#endif
Itérateur sur les classes tableau de Arccore.
Intervalle sur les classes tableau de Arccore.
Vue modifiable d'un tableau d'un type T.
Vue constante d'un tableau de type T.
Spécialisation pour le nombre d'éléments connu à la compilation.
Definition Span.h:100
Pour avoir le type (SmallSpan ou Span) en fonction de la taille (Int32 ou Int64)
Definition Span.h:50
Vue d'un tableau d'éléments de type T.
Definition Span.h:774
constexpr __host__ __device__ SmallSpan< T, DynExtent > subspan(Int32 abegin, Int32 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:849
constexpr __host__ __device__ SmallSpan< DataType > subViewInterval(Int32 index, Int32 nb_interval) const
Definition Span.h:905
constexpr __host__ __device__ ThatClass & operator=(std::array< X, N > &from)
Opérateur de recopie.
Definition Span.h:825
constexpr __host__ __device__ SmallSpan< T, DynExtent > subSpanInterval(Int32 index, Int32 nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:879
constexpr __host__ __device__ SmallSpan< T, DynExtent > subPart(Int32 abegin, Int32 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:873
SmallSpan()=default
Construit une vue vide.
constexpr __host__ __device__ SmallSpan(const ArrayView< value_type > &from) noexcept
Constructeur de recopie depuis une autre vue.
Definition Span.h:791
constexpr __host__ __device__ SmallSpan(pointer ptr, Int32 asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et contenant asize éléments.
Definition Span.h:814
constexpr __host__ __device__ SmallSpan< DataType > subView(Int32 abegin, Int32 asize) const
Definition Span.h:898
static constexpr ThatClass create(pointer ptr, size_type asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et.
Definition Span.h:835
constexpr __host__ __device__ SmallSpan< T, DynExtent > subSpan(Int32 abegin, Int32 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:861
constexpr __host__ __device__ ThatClass subPartInterval(Int32 index, Int32 nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:885
Vue d'un tableau d'éléments de type T.
Definition Span.h:176
constexpr __host__ __device__ SpanImpl(pointer ptr, SizeType asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et contenant asize éléments.
Definition Span.h:227
constexpr __host__ __device__ SpanImpl(const SpanImpl< X, SizeType, XExtent > &from) noexcept
Constructeur de recopie depuis une autre vue.
Definition Span.h:215
constexpr view_type smallView()
Vue constante sur cette vue.
Definition Span.h:369
__host__ __device__ void copy(const U &copy_array)
Recopie le tableau copy_array dans l'instance.
Definition Span.h:454
constexpr SubSpanType subView(SizeType abegin, SizeType asize) const
Definition Span.h:416
friend bool operator==(const SpanImpl< T, SizeType, Extent > &rhs, const SpanImpl< X, SizeType, Extent2 > &lhs)
Opérateur d'égalité (valide si T est const mais pas X)
Definition Span.h:520
constexpr __host__ __device__ SpanImpl(std::array< X, N > &from)
Construit une vue depuis un std::array.
Definition Span.h:234
std::optional< SizeType > findFirst(const_reference v) const
Definition Span.h:486
constexpr void _setArray(pointer v, SizeType s) noexcept
Modifie le pointeur et la taille du tableau.
Definition Span.h:560
constexpr __host__ __device__ pointer data() const noexcept
Definition Span.h:516
constexpr __host__ __device__ SizeType length() const noexcept
Nombre d'éléments du tableau.
Definition Span.h:312
constexpr __host__ __device__ iterator begin() const noexcept
Itérateur sur le premier élément du tableau.
Definition Span.h:317
__host__ __device__ void fill(T o)
Remplit le tableau avec la valeur o.
Definition Span.h:360
constexpr __host__ __device__ pointer ptrAt(SizeType index) const
Adresse du index-ème élément.
Definition Span.h:339
constexpr __host__ __device__ reference operator()(SizeType i) const
i-ème élément du tableau.
Definition Span.h:275
constexpr __host__ __device__ reference operator[](SizeType i) const
i-ème élément du tableau.
Definition Span.h:264
ArrayRange< pointer > range() const
Definition Span.h:331
constexpr __host__ __device__ bool empty() const noexcept
Retourne true si le tableau est vide (dimension nulle)
Definition Span.h:469
constexpr SubSpanType subViewInterval(SizeType index, SizeType nb_interval) const
Definition Span.h:429
constexpr __host__ __device__ SubSpanType subSpan(SizeType abegin, SizeType asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:391
constexpr __host__ __device__ reference item(SizeType i) const
i-ème élément du tableau.
Definition Span.h:286
constexpr ConstArrayView< value_type > constSmallView() const
Vue constante sur cette vue.
Definition Span.h:378
friend bool operator==(const SpanImpl< T, SizeType, Extent > &rhs, const SpanImpl< T, SizeType, Extent2 > &lhs)
Opérateur d'égalité
Definition Span.h:534
constexpr SubSpanType subPartInterval(SizeType index, SizeType nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:441
__host__ __device__ bool contains(const_reference v) const
true si le tableau contient l'élément de valeur v
Definition Span.h:471
constexpr __host__ __device__ ThatClass & operator=(std::array< X, N > &from)
Opérateur de recopie.
Definition Span.h:241
constexpr __host__ __device__ iterator end() const noexcept
Itérateur sur le premier élément après la fin du tableau.
Definition Span.h:321
constexpr void _setPtr(pointer v) noexcept
Modifie le pointeur du début du tableau.
Definition Span.h:572
friend bool operator!=(const SpanImpl< T, SizeType, Extent > &rhs, const SpanImpl< X, SizeType, Extent2 > &lhs)
Opérateur d'inégalité (valide si T est const mais pas X)
Definition Span.h:527
constexpr __host__ __device__ reverse_iterator rend() const noexcept
Itérateur inverse sur le premier élément après la fin du tableau.
Definition Span.h:325
constexpr __host__ __device__ SizeType size() const noexcept
Definition Span.h:304
constexpr __host__ __device__ SizeType sizeBytes() const noexcept
Retourne la taille du tableau en octets.
Definition Span.h:306
constexpr __host__ __device__ reverse_iterator rbegin() const noexcept
Itérateur inverse sur le premier élément du tableau.
Definition Span.h:323
friend bool operator!=(const SpanImpl< T, SizeType, Extent > &rhs, const SpanImpl< T, SizeType, Extent2 > &lhs)
Opérateur d'inégalité
Definition Span.h:541
constexpr void _setSize(SizeType s) noexcept
Modifie la taille du tableau.
Definition Span.h:580
constexpr __host__ __device__ SubSpanType subspan(SizeType abegin, SizeType asize) const
Pour compatibilité avec le C++20.
Definition Span.h:422
constexpr __host__ __device__ SubSpanType subPart(SizeType abegin, SizeType asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:403
constexpr __host__ __device__ SpanImpl() noexcept
Construit une vue vide.
Definition Span.h:207
constexpr SubSpanType subSpanInterval(SizeType index, SizeType nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:435
constexpr __host__ __device__ void setItem(SizeType i, const_reference v) noexcept
Positionne le i-ème élément du tableau.
Definition Span.h:297
static constexpr ThatClass create(pointer ptr, SizeType asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et.
Definition Span.h:252
std::enable_if_t< std::is_same_v< X, T >||std::is_same_v< std::add_const_t< X >, T > > is_same_const_type
Definition Span.h:202
Vue d'un tableau d'éléments de type T.
Definition Span.h:612
constexpr __host__ __device__ Span< T, DynExtent > subPart(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:718
constexpr __host__ __device__ Span< T, DynExtent > subSpanInterval(Int64 index, Int64 nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:724
static constexpr ThatClass create(pointer ptr, size_type asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et.
Definition Span.h:680
constexpr __host__ __device__ Span(std::array< X, N > &from) noexcept
Construit une vue à partir d'un std::array.
Definition Span.h:663
constexpr __host__ __device__ Span< DataType > subView(Int64 abegin, Int64 asize) const
Definition Span.h:743
constexpr __host__ __device__ Span(pointer ptr, Int64 asize) noexcept
Construit une vue sur une zone mémoire commencant par ptr et contenant asize éléments.
Definition Span.h:657
constexpr __host__ __device__ ThatClass & operator=(std::array< X, N > &from) noexcept
Opérateur de recopie.
Definition Span.h:669
constexpr __host__ __device__ Span(const ArrayView< value_type > &from) noexcept
Constructeur de recopie depuis une autre vue.
Definition Span.h:628
Span()=default
Construit une vue vide.
constexpr __host__ __device__ Span< DataType > subViewInterval(Int64 index, Int64 nb_interval) const
Definition Span.h:750
constexpr __host__ __device__ Span< T, DynExtent > subPartInterval(Int64 index, Int64 nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:730
constexpr __host__ __device__ Span< T, DynExtent > subSpan(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:706
constexpr __host__ __device__ Span< T, DynExtent > subspan(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Definition Span.h:694
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:963
SmallSpan< DataType > asSmallSpan(SmallSpan< std::byte, Extent > bytes)
Converti un SmallSpan<std::byte> en un SmallSpan<DataType>.
Definition Span.h:1099
Span< DataType > asSpan(Span< std::byte, Extent > bytes)
Converti un Span<std::byte> en un Span<DataType>.
Definition Span.h:1081
void binaryRead(std::istream &istr, const Span< std::byte > &bytes)
Lit en binaire le contenu de bytes depuis le flot istr.
Definition ArrayView.cc:70
Impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converti la vue en un tableau d'octets non modifiables.
Definition Span.h:989
Impl::SpanTypeFromSize< std::byte, SizeType >::SpanType asWritableBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converti la vue en un tableau d'octets modifiables.
Definition Span.h:1024
void _sampleSpan(SpanImpl< const DataType, SizeType > values, SpanImpl< const IntegerType, SizeType > indexes, SpanImpl< DataType, SizeType > result)
Extrait un sous-tableau à à partir d'une liste d'index.
Definition Span.h:938
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.
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition rapidjson.h:416