deal.II version GIT relicensing-6809-ge913b9bb34 2026-09-25 17:20:01+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
array_view.h
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 2015 - 2026 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13#ifndef dealii_array_view_h
14#define dealii_array_view_h
15
16#include <deal.II/base/config.h>
17
22#include <deal.II/base/tensor.h>
23
24#include <boost/container/small_vector.hpp>
25
26#include <array>
27#include <type_traits>
28#include <vector>
29
31
32// Forward declaration
33template <class T>
34class AlignedVector;
35
36template <int N, typename T>
37class Table;
38
39template <typename number>
41
42
84template <typename ElementType, typename MemorySpaceType = MemorySpace::Host>
86{
87public:
92 using value_type = ElementType;
93
98
102 using const_iterator = const ElementType *;
103
108
132
136 ArrayView(const ArrayView &view) = default;
137
150 template <typename OtherElementType,
151 typename = std::enable_if_t<
152 std::is_same_v<ElementType, const OtherElementType> &&
153 !std::is_same_v<OtherElementType, const ElementType>>>
155
160 explicit ArrayView(value_type &element);
161
162#ifdef DEAL_II_HAVE_CXX20
180 template <typename ContiguousContainer>
181 ArrayView(const ContiguousContainer &container)
182 requires(std::is_same_v<
183 std::remove_const_t<ElementType>,
184 std::remove_const_t<typename ContiguousContainer::value_type>> &&
185 std::is_const_v<ElementType> &&
187
205 template <typename ContiguousContainer>
206 ArrayView(ContiguousContainer &container)
207 requires(std::is_same_v<
208 std::remove_const_t<ElementType>,
209 std::remove_const_t<typename ContiguousContainer::value_type>> &&
211
212#else
213
214
232 template <typename ContiguousContainer,
233 typename = decltype(std::data(std::declval<ContiguousContainer>())),
234 typename = decltype(std::size(std::declval<ContiguousContainer>())),
235 typename = std::enable_if_t<
236 std::is_same_v<std::remove_const_t<ElementType>,
237 std::remove_const_t<
238 typename ContiguousContainer::value_type>> &&
239 std::is_const_v<ElementType>>>
240 ArrayView(const ContiguousContainer &container);
241
259 template <typename ContiguousContainer,
260 typename = decltype(std::data(std::declval<ContiguousContainer>())),
261 typename = decltype(std::size(std::declval<ContiguousContainer>())),
262 typename = std::enable_if_t<std::is_same_v<
263 std::remove_const_t<ElementType>,
264 std::remove_const_t<typename ContiguousContainer::value_type>>>>
265 ArrayView(ContiguousContainer &container);
266
267#endif
268
283 template <std::size_t N>
284 ArrayView(value_type (&array)[N]);
285
329 ArrayView(const std::initializer_list<std::remove_const_t<value_type>>
330 &initializer_list)
331 DEAL_II_CXX20_REQUIRES(std::is_const_v<ElementType>);
332
337 operator=(const ArrayView &view) = default;
338
351 template <typename OtherElementType,
352 typename = std::enable_if_t<
353 std::is_same_v<ElementType, const OtherElementType> &&
354 !std::is_same_v<OtherElementType, const ElementType>>>
357
377 void
379
393 bool
395 const ArrayView<const value_type, MemorySpaceType> &other_view) const;
396
410 bool
411 operator==(const ArrayView<std::remove_const_t<value_type>, MemorySpaceType>
412 &other_view) const;
413
430 bool
432 const ArrayView<const value_type, MemorySpaceType> &other_view) const;
433
447 bool
448 operator!=(const ArrayView<std::remove_const_t<value_type>, MemorySpaceType>
449 &other_view) const;
450
455 std::size_t
456 size() const;
457
461 bool
462 empty() const;
463
469 data() const noexcept;
470
475 begin() const;
476
481 end() const;
482
487 cbegin() const;
488
493 cend() const;
494
507 value_type &
508 operator[](const std::size_t i) const;
509
510private:
516
521
522 friend class ArrayView<const ElementType, MemorySpaceType>;
523};
524
525
526
527//---------------------------------------------------------------------------
528
529
530template <typename ElementType, typename MemorySpaceType>
531inline ArrayView<ElementType, MemorySpaceType>::ArrayView()
532 : starting_element(nullptr)
533 , n_elements(0)
534{}
535
536
537
538template <typename ElementType, typename MemorySpaceType>
541 const std::size_t n_elements)
542 : // In debug mode, make sure that n_elements>0 and if it is not, set
543 // the pointer to a nullptr to trigger segfaults if anyone ever wanted
544 // to access elements of the array. In release mode, just take the
545 // pointer as given.
547 (n_elements > 0) ?
549 nullptr)
551{}
552
553
554
555template <typename ElementType, typename MemorySpaceType>
556inline void
558 const std::size_t n_elements)
559{
560 if constexpr (running_in_debug_mode())
561 {
562 if (n_elements > 0)
563 this->starting_element = starting_element;
564 else
565 this->starting_element = nullptr;
566 }
567 else
568 {
569 this->starting_element = starting_element;
570 }
571 this->n_elements = n_elements;
572}
573
574
575
576template <typename ElementType, typename MemorySpaceType>
578 : starting_element(&element)
579 , n_elements(1)
580{}
581
582
583
584template <typename ElementType, typename MemorySpaceType>
585template <typename OtherElementType, typename>
588 : starting_element(view.starting_element)
589 , n_elements(view.n_elements)
590{}
591
592
593#ifdef DEAL_II_HAVE_CXX20
594
595template <typename ElementType, typename MemorySpaceType>
596template <typename ContiguousContainer>
598 const ContiguousContainer &container)
599 requires(std::is_same_v<
600 std::remove_const_t<ElementType>,
601 std::remove_const_t<typename ContiguousContainer::value_type>> &&
602 std::is_const_v<ElementType> &&
604 : // use delegating constructor
605 ArrayView(container.data(), container.size())
606{}
607
608
609
610template <typename ElementType, typename MemorySpaceType>
611template <typename ContiguousContainer>
613 ContiguousContainer &container)
614 requires(std::is_same_v<
615 std::remove_const_t<ElementType>,
616 std::remove_const_t<typename ContiguousContainer::value_type>> &&
618 : // use delegating constructor
619 ArrayView(std::data(container), std::size(container))
620{}
621
622
623#else
624
625template <typename ElementType, typename MemorySpaceType>
626template <typename ContiguousContainer, typename, typename, typename>
628 const ContiguousContainer &container)
629 : // use delegating constructor
630 ArrayView(container.data(), container.size())
631{}
632
633
634
635template <typename ElementType, typename MemorySpaceType>
636template <typename ContiguousContainer, typename, typename, typename>
638 ContiguousContainer &container)
639 : // use delegating constructor
640 ArrayView(std::data(container), std::size(container))
641{}
642
643#endif
644
645
646
647template <typename ElementType, typename MemorySpaceType>
648template <std::size_t N>
650 ElementType (&array)[N])
651 : ArrayView(&array[0], N)
652{}
653
654
655template <typename ElementType, typename MemorySpaceType>
657 const std::initializer_list<std::remove_const_t<value_type>> &initializer)
658 DEAL_II_CXX20_REQUIRES(std::is_const_v<ElementType>)
659 : // use delegating constructor
660 ArrayView(initializer.begin(), initializer.size())
661{}
662
663
664
665template <typename ElementType, typename MemorySpaceType>
666template <typename OtherElementType, typename>
670{
671 starting_element = view.starting_element;
672 n_elements = view.n_elements;
673 return *this;
674}
675
676
677
678template <typename ElementType, typename MemorySpaceType>
679inline bool
681 const ArrayView<const value_type, MemorySpaceType> &other_view) const
682{
683 return (other_view.data() == starting_element) &&
684 (other_view.size() == n_elements);
685}
686
687
688
689template <typename ElementType, typename MemorySpaceType>
690inline bool
692 const ArrayView<std::remove_const_t<value_type>, MemorySpaceType> &other_view)
693 const
694{
695 return (other_view.data() == starting_element) &&
696 (other_view.size() == n_elements);
697}
698
699
700
701template <typename ElementType, typename MemorySpaceType>
702inline bool
704 const ArrayView<const value_type, MemorySpaceType> &other_view) const
705{
706 return !(*this == other_view);
707}
708
709
710
711template <typename ElementType, typename MemorySpaceType>
715{
716 if (n_elements == 0)
717 return nullptr;
718 else
719 return starting_element;
720}
721
722
723
724template <typename ElementType, typename MemorySpaceType>
725inline bool
727 const ArrayView<std::remove_const_t<value_type>, MemorySpaceType> &other_view)
728 const
729{
730 return !(*this == other_view);
731}
732
733
734
735template <typename ElementType, typename MemorySpaceType>
736inline std::size_t
738{
739 return n_elements;
740}
741
742
743
744template <typename ElementType, typename MemorySpaceType>
745inline bool
747{
748 return n_elements == 0;
749}
750
751
752
753template <typename ElementType, typename MemorySpaceType>
756{
757 return starting_element;
758}
759
760
761
762template <typename ElementType, typename MemorySpaceType>
765{
766 return starting_element + n_elements;
767}
768
769
770
771template <typename ElementType, typename MemorySpaceType>
774{
775 return starting_element;
776}
777
778
779
780template <typename ElementType, typename MemorySpaceType>
783{
784 return starting_element + n_elements;
785}
786
787
788
789template <typename ElementType, typename MemorySpaceType>
792{
793 AssertIndexRange(i, n_elements);
794
795 return *(starting_element + i);
796}
797
798
799
805template <typename ElementType, std::size_t stride = 1>
807{
808public:
813 using value_type = ElementType;
814
835
840 std::size_t
841 size() const;
842
846 bool
847 empty() const;
848
853 value_type *
854 data() const noexcept;
855
868 value_type &
869 operator[](const std::size_t i) const;
870
871protected:
877
882};
883
884
885
886template <typename ElementType, std::size_t stride>
887typename StridedArrayView<ElementType, stride>::value_type &
888StridedArrayView<ElementType, stride>::operator[](const std::size_t i) const
889{
890 AssertIndexRange(i, this->n_elements);
891
892 return *(this->starting_element + stride * i);
893}
894
895
896
897template <typename ElementType, std::size_t stride>
900{
901 if (this->n_elements == 0)
902 return nullptr;
903 else
904 return this->starting_element;
905}
906
907
908
909template <typename ElementType, std::size_t stride>
910bool
912{
913 return this->n_elements == 0;
914}
915
916
917
918template <typename ElementType, std::size_t stride>
919std::size_t
921{
922 return this->n_elements;
923}
924
925
926
927template <typename ElementType, std::size_t stride>
934
935
936
937#ifndef DOXYGEN
938namespace internal
939{
940 namespace ArrayViewHelper
941 {
947 template <class Iterator>
948 bool
949 is_contiguous(const Iterator &first, const Iterator &last)
950 {
951 const auto n = std::distance(first, last);
952 for (std::decay_t<decltype(n)> i = 0; i < n; ++i)
953 if (std::addressof(*(std::next(first, i))) !=
954 std::next(std::addressof(*first), i))
955 return false;
956 return true;
957 }
958
959
970 template <class T>
971 constexpr bool
972 is_contiguous(T *, T *)
973 {
974 return true;
975 }
976 } // namespace ArrayViewHelper
977} // namespace internal
978#endif
979
980
981
998template <typename Iterator, typename MemorySpaceType = MemorySpace::Host>
1000 std::remove_reference_t<typename std::iterator_traits<Iterator>::reference>,
1001 MemorySpaceType>
1002make_array_view(const Iterator begin, const Iterator end)
1003{
1004 static_assert(
1005 std::is_same_v<typename std::iterator_traits<Iterator>::iterator_category,
1006 typename std::random_access_iterator_tag>
1007#ifdef DEAL_II_HAVE_CXX20
1008 ||
1009 std::is_same_v<typename std::iterator_traits<Iterator>::iterator_category,
1010 typename std::contiguous_iterator_tag>
1011#endif
1012 ,
1013 "The provided iterator needs to be a random access iterator.");
1014 Assert(begin <= end,
1015 ExcMessage(
1016 "The beginning of the array view needs to be before the end."));
1017 Assert(internal::ArrayViewHelper::is_contiguous(begin, end),
1018 ExcMessage("The provided range isn't contiguous in memory!"));
1019 // the reference type, not the value type, knows the constness of the iterator
1020 return ArrayView<
1021 std::remove_reference_t<typename std::iterator_traits<Iterator>::reference>,
1022 MemorySpaceType>(std::addressof(*begin), end - begin);
1023}
1024
1025
1026
1036template <typename ElementType, typename MemorySpaceType = MemorySpace::Host>
1038make_array_view(ElementType *const begin, ElementType *const end)
1039{
1040 Assert(begin <= end,
1041 ExcMessage(
1042 "The beginning of the array view needs to be before the end."));
1044}
1045
1046
1047
1058template <typename Number, typename MemorySpaceType>
1061{
1062 return make_array_view(array_view.cbegin(), array_view.cend());
1063}
1064
1065
1066
1077template <typename Number, typename MemorySpaceType>
1080{
1081 return make_array_view(array_view.begin(), array_view.end());
1082}
1083
1084
1085
1099template <typename ElementType, int N>
1101make_array_view(ElementType (&array)[N])
1102{
1103 return ArrayView<ElementType>(array, N);
1104}
1105
1106
1107
1122template <typename ElementType>
1125{
1126 return ArrayView<ElementType>(vector.begin(), vector.size());
1127}
1128
1129
1130
1145template <typename ElementType>
1148{
1149 return ArrayView<const ElementType>(vector.begin(), vector.size());
1150}
1151
1152
1153
1168template <typename ElementType>
1170make_array_view(std::vector<ElementType> &vector)
1171{
1172 return ArrayView<ElementType>(vector.data(), vector.size());
1173}
1174
1175
1176
1191template <typename ElementType>
1193make_array_view(const std::vector<ElementType> &vector)
1194{
1195 return ArrayView<const ElementType>(vector.data(), vector.size());
1196}
1197
1198
1199
1219template <typename ElementType>
1221make_array_view(std::vector<ElementType> &vector,
1222 const std::size_t starting_index,
1223 const std::size_t size_of_view)
1224{
1225 Assert(starting_index + size_of_view <= vector.size(),
1226 ExcMessage("The starting index and size of the view you want to "
1227 "create would lead to a view that extends beyond the end "
1228 "of the given vector."));
1229 return ArrayView<ElementType>(&vector[starting_index], size_of_view);
1230}
1231
1232
1233
1253template <typename ElementType>
1255make_array_view(const std::vector<ElementType> &vector,
1256 const std::size_t starting_index,
1257 const std::size_t size_of_view)
1258{
1259 Assert(starting_index + size_of_view <= vector.size(),
1260 ExcMessage("The starting index and size of the view you want to "
1261 "create would lead to a view that extends beyond the end "
1262 "of the given vector."));
1263 return ArrayView<const ElementType>(&vector[starting_index], size_of_view);
1264}
1265
1266
1267
1275template <typename ElementType>
1278{
1279 return ArrayView<ElementType>(vector.data(), vector.size());
1280}
1281
1282
1283
1291template <typename ElementType>
1294{
1295 return ArrayView<const ElementType>(vector.data(), vector.size());
1296}
1297
1298
1299
1307template <typename ElementType>
1310 const std::size_t starting_index,
1311 const std::size_t size_of_view)
1312{
1313 Assert(starting_index + size_of_view <= vector.size(),
1314 ExcMessage("The starting index and size of the view you want to "
1315 "create would lead to a view that extends beyond the end "
1316 "of the given vector."));
1317 return ArrayView<ElementType>(&vector[starting_index], size_of_view);
1318}
1319
1320
1321
1329template <typename ElementType>
1332 const std::size_t starting_index,
1333 const std::size_t size_of_view)
1334{
1335 Assert(starting_index + size_of_view <= vector.size(),
1336 ExcMessage("The starting index and size of the view you want to "
1337 "create would lead to a view that extends beyond the end "
1338 "of the given vector."));
1339 return ArrayView<const ElementType>(&vector[starting_index], size_of_view);
1340}
1341
1342
1343
1358template <typename ElementType, std::size_t N>
1360make_array_view(std::array<ElementType, N> &array)
1361{
1362 return ArrayView<ElementType>(array);
1363}
1364
1365
1366
1381template <typename ElementType, std::size_t N>
1383make_array_view(const std::array<ElementType, N> &array)
1384{
1385 return ArrayView<const ElementType>(array);
1386}
1387
1388
1389
1406template <typename ElementType>
1409 const typename Table<2, ElementType>::size_type row)
1410{
1411 AssertIndexRange(row, table.size()[0]);
1412 return ArrayView<ElementType>(&table[row][0], table.size()[1]);
1413}
1414
1415
1416
1433template <typename ElementType>
1436{
1437 return ArrayView<ElementType>(&table[0][0], table.n_elements());
1438}
1439
1440
1441
1458template <typename ElementType>
1461{
1462 return ArrayView<const ElementType>(&table[0][0], table.n_elements());
1463}
1464
1465
1483template <typename ElementType>
1486{
1487 return ArrayView<ElementType>(&matrix(0, 0), matrix.n_elements());
1488}
1489
1490
1491
1508template <typename ElementType>
1511{
1512 return ArrayView<const ElementType>(&matrix(0, 0), matrix.n_elements());
1513}
1514
1515
1516
1533template <typename ElementType>
1536 const typename Table<2, ElementType>::size_type row)
1537{
1538 AssertIndexRange(row, table.size()[0]);
1539 return ArrayView<const ElementType>(&table[row][0], table.size()[1]);
1540}
1541
1542
1543
1563template <typename ElementType>
1566 const typename Table<2, ElementType>::size_type row,
1567 const typename Table<2, ElementType>::size_type starting_column,
1568 const std::size_t size_of_view)
1569{
1570 AssertIndexRange(row, table.size()[0]);
1571 AssertIndexRange(starting_column, table.size()[1]);
1572 Assert(starting_column + size_of_view <= table.size()[1],
1573 ExcMessage("The starting index and size of the view you want to "
1574 "create would lead to a view that extends beyond the end "
1575 "of a column of the given table."));
1576 return ArrayView<ElementType>(&table[row][starting_column], size_of_view);
1577}
1578
1579
1580
1600template <typename ElementType>
1603 const typename Table<2, ElementType>::size_type row,
1604 const typename Table<2, ElementType>::size_type starting_column,
1605 const std::size_t size_of_view)
1606{
1607 AssertIndexRange(row, table.size()[0]);
1608 AssertIndexRange(starting_column, table.size()[1]);
1609 Assert(starting_column + size_of_view <= table.size()[1],
1610 ExcMessage("The starting index and size of the view you want to "
1611 "create would lead to a view that extends beyond the end "
1612 "of a column of the given table."));
1613 return ArrayView<const ElementType>(&table[row][starting_column],
1614 size_of_view);
1615}
1616
1617
1618
1619/*
1620 * Create a view that doesn't allow the container it points to to be modified.
1621 * This is useful if the object passed in is not `const` already and a function
1622 * requires a view to constant memory in its signature.
1623 *
1624 * This function returns an object of type `ArrayView<const T>` where `T` is the
1625 * element type of the container.
1626 *
1627 * @relatesalso ArrayView
1628 */
1629template <typename Container>
1630inline auto
1631make_const_array_view(const Container &container)
1632 -> decltype(make_array_view(container))
1633{
1634 return make_array_view(container);
1635}
1636
1637
1639
1640#endif
*  iterator end()
*  *  iterator begin()
auto make_const_array_view(const Container &container) -> decltype(make_array_view(container))
ArrayView< std::remove_reference_t< typename std::iterator_traits< Iterator >::reference >, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
pointer data()
size_type size() const
ArrayView(ContiguousContainer &container)
Definition array_view.h:637
ArrayView< const ElementType > make_array_view(const Vector< ElementType > &vector)
ArrayView(value_type &element)
Definition array_view.h:577
ArrayView< ElementType, MemorySpaceType > operator=(const ArrayView< OtherElementType, MemorySpaceType > &view)
Definition array_view.h:668
iterator begin() const
Definition array_view.h:755
ArrayView< Number, MemorySpaceType > make_array_view(ArrayView< Number, MemorySpaceType > &array_view)
value_type * iterator
Definition array_view.h:97
value_type & operator[](const std::size_t i) const
Definition array_view.h:791
ArrayView< const ElementType > make_array_view(const LAPACKFullMatrix< ElementType > &matrix)
ArrayView< ElementType > make_array_view(std::array< ElementType, N > &array)
bool empty() const
Definition array_view.h:746
bool operator!=(const ArrayView< std::remove_const_t< value_type >, MemorySpaceType > &other_view) const
Definition array_view.h:726
ArrayView< ElementType > make_array_view(LAPACKFullMatrix< ElementType > &matrix)
ArrayView< ElementType > make_array_view(ElementType(&array)[N])
ArrayView< ElementType, MemorySpaceType > make_array_view(ElementType *const begin, ElementType *const end)
const_iterator cend() const
Definition array_view.h:782
ArrayView(const ContiguousContainer &container)
Definition array_view.h:627
iterator end() const
Definition array_view.h:764
ArrayView< const ElementType > make_array_view(const std::vector< ElementType > &vector, const std::size_t starting_index, const std::size_t size_of_view)
bool operator==(const ArrayView< std::remove_const_t< value_type >, MemorySpaceType > &other_view) const
Definition array_view.h:691
ArrayView< const ElementType > make_array_view(const Table< 2, ElementType > &table)
ArrayView< const ElementType > make_array_view(const Table< 2, ElementType > &table, const typename Table< 2, ElementType >::size_type row, const typename Table< 2, ElementType >::size_type starting_column, const std::size_t size_of_view)
ArrayView< ElementType > make_array_view(std::vector< ElementType > &vector)
bool operator==(const ArrayView< const value_type, MemorySpaceType > &other_view) const
Definition array_view.h:680
ArrayView< ElementType, MemorySpaceType > & operator=(const ArrayView &view)=default
ArrayView< ElementType > make_array_view(std::vector< ElementType > &vector, const std::size_t starting_index, const std::size_t size_of_view)
bool operator!=(const ArrayView< const value_type, MemorySpaceType > &other_view) const
Definition array_view.h:703
const_iterator cbegin() const
Definition array_view.h:773
ArrayView(value_type(&array)[N])
Definition array_view.h:649
value_type * data() const noexcept
Definition array_view.h:714
ArrayView< ElementType > make_array_view(Table< 2, ElementType > &table, const typename Table< 2, ElementType >::size_type row, const typename Table< 2, ElementType >::size_type starting_column, const std::size_t size_of_view)
void reinit(value_type *starting_element, const std::size_t n_elements)
Definition array_view.h:557
ArrayView< ElementType > make_array_view(Table< 2, ElementType > &table)
value_type * starting_element
Definition array_view.h:515
ArrayView(const std::initializer_list< std::remove_const_t< value_type > > &initializer_list)
Definition array_view.h:656
std::size_t size() const
Definition array_view.h:737
ElementType value_type
Definition array_view.h:92
ArrayView(value_type *starting_element, const std::size_t n_elements)
Definition array_view.h:539
std::size_t n_elements
Definition array_view.h:520
ArrayView< const Number, MemorySpaceType > make_array_view(const ArrayView< Number, MemorySpaceType > &array_view)
ArrayView< const ElementType > make_array_view(const Table< 2, ElementType > &table, const typename Table< 2, ElementType >::size_type row)
ArrayView< const ElementType > make_array_view(const AlignedVector< ElementType > &vector, const std::size_t starting_index, const std::size_t size_of_view)
ArrayView< const ElementType > make_array_view(const AlignedVector< ElementType > &vector)
const ElementType * const_iterator
Definition array_view.h:102
ArrayView< ElementType > make_array_view(Vector< ElementType > &vector)
ArrayView< ElementType > make_array_view(Table< 2, ElementType > &table, const typename Table< 2, ElementType >::size_type row)
ArrayView< const ElementType > make_array_view(const std::vector< ElementType > &vector)
ArrayView< ElementType > make_array_view(AlignedVector< ElementType > &vector, const std::size_t starting_index, const std::size_t size_of_view)
ArrayView< const ElementType > make_array_view(const std::array< ElementType, N > &array)
ArrayView< std::remove_reference_t< typename std::iterator_traits< Iterator >::reference >, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
ArrayView(const ArrayView< OtherElementType, MemorySpaceType > &view)
Definition array_view.h:586
ArrayView< ElementType > make_array_view(AlignedVector< ElementType > &vector)
ArrayView(const ArrayView &view)=default
std::size_t n_elements
Definition array_view.h:881
StridedArrayView(value_type *starting_element, const std::size_t n_elements)
Definition array_view.h:928
ElementType value_type
Definition array_view.h:813
value_type * starting_element
Definition array_view.h:876
value_type * data() const noexcept
Definition array_view.h:899
std::size_t size() const
Definition array_view.h:920
bool empty() const
Definition array_view.h:911
virtual size_type size() const override
iterator begin()
constexpr LibraryBuildMode library_build_mode
Definition config.h:66
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
constexpr bool running_in_debug_mode()
Definition config.h:76
#define DEAL_II_CXX20_REQUIRES(condition)
Definition config.h:249
#define DEAL_II_HOST_DEVICE
Definition config.h:171
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
LibraryBuildMode
Definition config.h:54
Point< 2 > first
Definition grid_out.cc:4639
#define Assert(cond, exc)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcMessage(std::string arg1)
std::vector< index_type > data
Definition mpi.cc:734
std::size_t size
Definition mpi.cc:733
STL namespace.