Arcane  v3.14.10.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-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
44 };
45
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/*---------------------------------------------------------------------------*/
87template<typename T,typename SizeType,SizeType Extent,SizeType MinValue>
89{
90 public:
91
93 using size_type = SizeType;
94 using ElementType = T;
95 using element_type = ElementType;
96 using value_type = typename std::remove_cv_t<ElementType>;
97 using const_value_type = typename std::add_const_t<value_type>;
98 using index_type = SizeType;
99 using difference_type = SizeType;
100 using pointer = ElementType*;
101 using const_pointer = const ElementType*;
102 using reference = ElementType&;
103 using const_reference = const ElementType&;
106 using view_type = typename detail::ViewTypeT<ElementType>::view_type;
107 using reverse_iterator = std::reverse_iterator<iterator>;
108 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
109
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
117 constexpr ARCCORE_HOST_DEVICE SpanImpl() noexcept : m_ptr(nullptr), m_size(0) {}
118
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
134 constexpr ARCCORE_HOST_DEVICE SpanImpl(pointer ptr, SizeType asize) noexcept
135 : m_ptr(ptr)
136 , m_size(asize)
137 {}
138
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
145 template<std::size_t N,typename X,typename = is_same_const_type<X> >
146 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(std::array<X,N>& from)
147 {
148 m_ptr = from.data();
150 return (*this);
151 }
152
153 public:
154
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
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
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
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
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
209 constexpr ARCCORE_HOST_DEVICE SizeType size() const noexcept { return m_size; }
211 constexpr ARCCORE_HOST_DEVICE SizeType sizeBytes() const noexcept { return static_cast<SizeType>(m_size * sizeof(value_type)); }
213 constexpr ARCCORE_HOST_DEVICE SizeType length() const noexcept { return m_size; }
214
218 constexpr ARCCORE_HOST_DEVICE iterator begin() const noexcept { return iterator(m_ptr); }
222 constexpr ARCCORE_HOST_DEVICE iterator end() const noexcept { return iterator(m_ptr+m_size); }
224 constexpr ARCCORE_HOST_DEVICE reverse_iterator rbegin() const noexcept { return std::make_reverse_iterator(end()); }
226 constexpr ARCCORE_HOST_DEVICE reverse_iterator rend() const noexcept { return std::make_reverse_iterator(begin()); }
227
228 public:
229
231 ARCCORE_DEPRECATED_REASON("Y2023: Use begin()/end() instead")
232 ArrayRange<pointer> range() const
233 {
235 }
236
237 public:
238
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 {
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 {
257 m_ptr[i] = value;
258 }
259
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
270 constexpr view_type smallView()
271 {
273 return view_type(s,m_ptr);
274 }
275
284
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
304 constexpr ARCCORE_HOST_DEVICE ThatClass subPart(SizeType abegin,SizeType asize) const
305 {
306 return subSpan(abegin,asize);
307
308 }
309
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
324 constexpr ARCCORE_HOST_DEVICE ThatClass subspan(SizeType abegin,SizeType asize) const
325 {
326 return subSpan(abegin,asize);
327 }
328
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
337 constexpr ThatClass subSpanInterval(SizeType index,SizeType nb_interval) const
338 {
339 return impl::subViewInterval<ThatClass>(*this,index,nb_interval);
340 }
341
343 constexpr ThatClass subPartInterval(SizeType index,SizeType nb_interval) const
344 {
345 return impl::subViewInterval<ThatClass>(*this,index,nb_interval);
346 }
347
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
372 constexpr ARCCORE_HOST_DEVICE bool empty() const noexcept { return m_size==0; }
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
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
419 constexpr ARCCORE_HOST_DEVICE pointer data() const noexcept { return m_ptr; }
420
422 template<typename X,SizeType Extent2,SizeType MinValue2, typename = std::enable_if_t<std::is_same_v<X,value_type>>> friend bool
427
429 template<typename X,SizeType Extent2,SizeType MinValue2,typename = std::enable_if_t<std::is_same_v<X,value_type>>> friend bool
434
436 template<SizeType Extent2,SizeType MinValue2> friend bool
441
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
463 constexpr void _setArray(pointer v,SizeType s) noexcept { m_ptr = v; m_size = s; }
464
471 constexpr void _setPtr(pointer v) noexcept { m_ptr = v; }
472
479 constexpr void _setSize(SizeType s) noexcept { m_size = s; }
480
481 private:
482
483 pointer m_ptr;
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/*---------------------------------------------------------------------------*/
507template <typename T, Int64 Extent, Int64 MinValue>
508class Span
509: public SpanImpl<T, Int64, Extent, MinValue>
510{
511 public:
512
515 using size_type = Int64;
516 using value_type = typename BaseClass::value_type;
517 using pointer = typename BaseClass::pointer;
518 template <typename X>
519 using is_same_const_type = std::enable_if_t<std::is_same_v<X, T> || std::is_same_v<std::add_const_t<X>, T>>;
520
521 public:
522
524 Span() = default;
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
554 constexpr ARCCORE_HOST_DEVICE Span(pointer ptr, Int64 asize) noexcept
555 : BaseClass(ptr, asize)
556 {}
557
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
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
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
590 constexpr ARCCORE_HOST_DEVICE Span<T,DynExtent> subspan(Int64 abegin,Int64 asize) const
591 {
592 return BaseClass::subspan(abegin,asize);
593 }
594
602 constexpr ARCCORE_HOST_DEVICE Span<T,DynExtent> subSpan(Int64 abegin,Int64 asize) const
603 {
604 return BaseClass::subSpan(abegin,asize);
605 }
606
614 constexpr ARCCORE_HOST_DEVICE Span<T, DynExtent> subPart(Int64 abegin, Int64 asize) const
615 {
616 return BaseClass::subPart(abegin, asize);
617 }
618
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
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
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
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/*---------------------------------------------------------------------------*/
667template <typename T, Int32 Extent, Int32 MinValue>
669: public SpanImpl<T, Int32, Extent, MinValue>
670{
671 public:
672
675 using size_type = Int32;
676 using value_type = typename BaseClass::value_type;
677 using pointer = typename BaseClass::pointer;
678 template <typename X>
679 using is_same_const_type = std::enable_if_t<std::is_same_v<X, T> || std::is_same_v<std::add_const_t<X>, T>>;
680
681 public:
682
684 SmallSpan() = default;
685
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
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
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
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
741 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subspan(Int32 abegin, Int32 asize) const
742 {
743 return BaseClass::subspan(abegin,asize);
744 }
745
753 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subSpan(Int32 abegin, Int32 asize) const
754 {
755 return BaseClass::subSpan(abegin,asize);
756 }
757
765 constexpr ARCCORE_HOST_DEVICE SmallSpan<T, DynExtent> subPart(Int32 abegin, Int32 asize) const
766 {
767 return BaseClass::subSpan(abegin, asize);
768 }
769
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
777 constexpr ARCCORE_HOST_DEVICE ThatClass subPartInterval(Int32 index,Int32 nb_interval) const
778 {
779 return subSpanInterval(index,nb_interval);
780 }
781
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
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/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
854template<typename DataType> inline void
856{
857 _sampleSpan<DataType,Int64,Int64>(values,indexes,result);
858}
859
860/*---------------------------------------------------------------------------*/
861/*---------------------------------------------------------------------------*/
868template<typename DataType> inline void
870{
871 _sampleSpan<DataType,Int32,Int64>(values,indexes,result);
872}
873
874/*---------------------------------------------------------------------------*/
875/*---------------------------------------------------------------------------*/
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
889template <typename DataType>
890inline SmallSpan<const std::byte>
892{
893 return asBytes(SmallSpan<DataType>(s));
894}
895
899template <typename DataType>
900inline SmallSpan<const std::byte>
905
906/*---------------------------------------------------------------------------*/
907/*---------------------------------------------------------------------------*/
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
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/*---------------------------------------------------------------------------*/
972template<typename DataType,Int64 Extent> inline Span<DataType>
974{
975 return detail::asSpanInternal<std::byte,DataType,Extent>(bytes);
976}
981template<typename DataType,Int64 Extent> inline Span<const DataType>
983{
984 return detail::asSpanInternal<const std::byte,const DataType,Extent>(bytes);
985}
990template<typename DataType,Int32 Extent> inline SmallSpan<DataType>
992{
993 return detail::asSmallSpanInternal<std::byte,DataType,Extent>(bytes);
994}
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/*---------------------------------------------------------------------------*/
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}
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/*---------------------------------------------------------------------------*/
1033extern "C++" ARCCORE_BASE_EXPORT void
1034binaryWrite(std::ostream& ostr,const Span<const std::byte>& bytes);
1035
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
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
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 ARCCORE_HOST_DEVICE ThatClass & operator=(std::array< X, N > &from)
Opérateur de recopie.
Definition Span.h:717
constexpr ARCCORE_HOST_DEVICE ThatClass subPartInterval(Int32 index, Int32 nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:777
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 ARCCORE_HOST_DEVICE SmallSpan< T > subViewInterval(Int32 index, Int32 nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:797
SmallSpan()=default
Construit une vue vide.
constexpr ARCCORE_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 ARCCORE_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 ARCCORE_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 ARCCORE_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 ARCCORE_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
constexpr ARCCORE_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
constexpr ARCCORE_HOST_DEVICE SmallSpan(const ArrayView< value_type > &from) noexcept
Constructeur de recopie depuis une autre vue.
Definition Span.h:687
Vue d'un tableau d'éléments de type T.
Definition Span.h:89
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
ARCCORE_HOST_DEVICE void fill(T o)
Remplit le tableau avec la valeur o.
Definition Span.h:261
constexpr ARCCORE_HOST_DEVICE reference operator()(SizeType i) const
i-ème élément du tableau.
Definition Span.h:180
constexpr ARCCORE_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 ARCCORE_HOST_DEVICE SpanImpl(std::array< X, N > &from)
Construit une vue depuis un std::array.
Definition Span.h:141
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 ARCCORE_HOST_DEVICE void setItem(SizeType i, const_reference v) noexcept
Positionne le i-ème élément du tableau.
Definition Span.h:202
ARCCORE_DEPRECATED_REASON("Y2023: Use begin()/end() instead") ArrayRange< pointer > range() const
Intervalle d'itération du premier au dernièr élément.
Definition Span.h:231
constexpr ARCCORE_HOST_DEVICE SpanImpl() noexcept
Construit une vue vide.
Definition Span.h:117
constexpr ARCCORE_HOST_DEVICE iterator begin() const noexcept
Itérateur sur le premier élément du tableau.
Definition Span.h:218
constexpr ARCCORE_HOST_DEVICE reference item(SizeType i) const
i-ème élément du tableau.
Definition Span.h:191
constexpr ThatClass subSpanInterval(SizeType index, SizeType nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:337
constexpr ARCCORE_HOST_DEVICE ThatClass & operator=(std::array< X, N > &from)
Opérateur de recopie.
Definition Span.h:146
constexpr ARCCORE_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 void _setPtr(pointer v) noexcept
Modifie le pointeur du début du tableau.
Definition Span.h:471
constexpr ARCCORE_HOST_DEVICE SizeType sizeBytes() const noexcept
Retourne la taille du tableau en octets.
Definition Span.h:211
constexpr ARCCORE_HOST_DEVICE pointer ptrAt(SizeType index) const
Addresse du index-ème élément.
Definition Span.h:240
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 ARCCORE_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
ARCCORE_HOST_DEVICE bool contains(const_reference v) const
true si le tableau contient l'élément de valeur v
Definition Span.h:374
SizeType m_size
Nombre d'éléments du tableau.
Definition Span.h:484
pointer m_ptr
Pointeur sur le tableau.
Definition Span.h:483
constexpr ARCCORE_HOST_DEVICE bool empty() const noexcept
Retourne true si le tableau est vide (dimension nulle)
Definition Span.h:372
constexpr ARCCORE_HOST_DEVICE iterator end() const noexcept
Itérateur sur le premier élément après la fin du tableau.
Definition Span.h:222
constexpr ThatClass subViewInterval(SizeType index, SizeType nb_interval) const
Sous-vue correspondant à l'interval index sur nb_interval.
Definition Span.h:331
constexpr ARCCORE_HOST_DEVICE SizeType length() const noexcept
Nombre d'éléments du tableau.
Definition Span.h:213
constexpr ARCCORE_HOST_DEVICE reference operator[](SizeType i) const
i-ème élément du tableau.
Definition Span.h:169
constexpr ARCCORE_HOST_DEVICE ThatClass subspan(SizeType abegin, SizeType asize) const
Pour compatibilité avec le C++20.
Definition Span.h:324
constexpr ARCCORE_HOST_DEVICE SpanImpl(const SpanImpl< X, SizeType, XExtent, XMinValue > &from) noexcept
Constructeur de recopie depuis une autre vue.
Definition Span.h:122
ARCCORE_HOST_DEVICE void copy(const U &copy_array)
Recopie le tableau copy_array dans l'instance.
Definition Span.h:357
constexpr ARCCORE_HOST_DEVICE pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:419
constexpr ARCCORE_HOST_DEVICE SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:209
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 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 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
constexpr ARCCORE_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
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
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 ARCCORE_HOST_DEVICE reverse_iterator rbegin() const noexcept
Itérateur inverse sur le premier élément du tableau.
Definition Span.h:224
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
constexpr ARCCORE_HOST_DEVICE Span(const ArrayView< value_type > &from) noexcept
Constructeur de recopie depuis une autre vue.
Definition Span.h:526
constexpr ARCCORE_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
Span()=default
Construit une vue vide.
constexpr ARCCORE_HOST_DEVICE ThatClass & operator=(std::array< X, N > &from) noexcept
Opérateur de recopie.
Definition Span.h:565
constexpr ARCCORE_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 ARCCORE_HOST_DEVICE Span(std::array< X, N > &from) noexcept
Construit une vue à partir d'un std::array.
Definition Span.h:560
constexpr ARCCORE_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
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 ARCCORE_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 ARCCORE_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
constexpr ARCCORE_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 ARCCORE_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 ARCCORE_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
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
constexpr ARCCORE_HOST_DEVICE Integer arccoreCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
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
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
ARCCORE_HOST_DEVICE void arccoreCheckAt(Int64 i, Int64 max_size)
Vérifie un éventuel débordement de tableau.
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.
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition rapidjson.h:385