16 #ifndef dealii_array_view_h
17 #define dealii_array_view_h
27 #include <type_traits>
36 template <
int N,
typename T>
39 template <
typename number>
84 template <
typename ElementType,
typename MemorySpaceType = MemorySpace::Host>
140 const ArrayView<std::remove_cv_t<value_type>, MemorySpaceType> &view);
162 ArrayView(
const std::vector<std::remove_cv_t<value_type>> &vector);
178 ArrayView(std::vector<std::remove_cv_t<value_type>> &vector);
194 template <std::
size_t N>
205 template <std::
size_t N>
206 ArrayView(
const std::array<std::remove_cv_t<value_type>,
N> &vector);
216 template <std::
size_t N>
217 ArrayView(std::array<std::remove_cv_t<value_type>,
N> &vector);
369 operator[](const std::
size_t i) const;
391 template <typename
ElementType, typename MemorySpaceType>
399 template <
typename ElementType,
typename MemorySpaceType>
409 template <
typename ElementType,
typename MemorySpaceType>
412 const std::size_t n_elements)
414 this->starting_element = starting_element;
415 this->n_elements = n_elements;
420 template <
typename ElementType,
typename MemorySpaceType>
422 : starting_element(&element)
428 template <
typename ElementType,
typename MemorySpaceType>
430 const ArrayView<std::remove_cv_t<value_type>, MemorySpaceType> &view)
431 : starting_element(view.starting_element)
432 , n_elements(view.n_elements)
437 template <
typename ElementType,
typename MemorySpaceType>
439 const std::vector<std::remove_cv_t<value_type>> &vector)
452 static_assert(std::is_const_v<value_type> ==
true,
453 "This constructor may only be called if the ArrayView "
454 "object has a const value_type. In other words, you can "
455 "only create an ArrayView to const values from a const "
461 template <
typename ElementType,
typename MemorySpaceType>
463 std::vector<std::remove_cv_t<value_type>> &vector)
470 template <
typename ElementType,
typename MemorySpaceType>
471 template <std::
size_t N>
473 const std::array<std::remove_cv_t<value_type>,
N> &vector)
486 static_assert(std::is_const_v<value_type> ==
true,
487 "This constructor may only be called if the ArrayView "
488 "object has a const value_type. In other words, you can "
489 "only create an ArrayView to const values from a const "
495 template <
typename ElementType,
typename MemorySpaceType>
496 template <std::
size_t N>
504 template <
typename ElementType,
typename MemorySpaceType>
505 template <std::
size_t N>
507 std::array<std::remove_cv_t<value_type>,
N> &vector)
514 template <
typename ElementType,
typename MemorySpaceType>
519 return (other_view.
data() == starting_element) &&
520 (other_view.
size() == n_elements);
525 template <
typename ElementType,
typename MemorySpaceType>
528 const ArrayView<std::remove_cv_t<value_type>, MemorySpaceType> &other_view)
531 return (other_view.data() == starting_element) &&
532 (other_view.size() == n_elements);
537 template <
typename ElementType,
typename MemorySpaceType>
542 return !(*
this == other_view);
547 template <
typename ElementType,
typename MemorySpaceType>
555 return starting_element;
560 template <
typename ElementType,
typename MemorySpaceType>
563 const ArrayView<std::remove_cv_t<value_type>, MemorySpaceType> &other_view)
566 return !(*
this == other_view);
571 template <
typename ElementType,
typename MemorySpaceType>
580 template <
typename ElementType,
typename MemorySpaceType>
584 return n_elements == 0;
589 template <
typename ElementType,
typename MemorySpaceType>
593 return starting_element;
598 template <
typename ElementType,
typename MemorySpaceType>
602 return starting_element + n_elements;
607 template <
typename ElementType,
typename MemorySpaceType>
611 return starting_element;
616 template <
typename ElementType,
typename MemorySpaceType>
620 return starting_element + n_elements;
625 template <
typename ElementType,
typename MemorySpaceType>
631 return *(starting_element + i);
641 template <
typename ElementType, std::
size_t str
ide = 1>
690 data() const noexcept;
705 operator[](const std::
size_t i) const;
722 template <typename
ElementType, std::
size_t stride>
728 return *(this->starting_element + stride * i);
733 template <
typename ElementType, std::
size_t str
ide>
745 template <
typename ElementType, std::
size_t str
ide>
754 template <
typename ElementType, std::
size_t str
ide>
763 template <
typename ElementType, std::
size_t str
ide>
776 namespace ArrayViewHelper
783 template <
class Iterator>
785 is_contiguous(
const Iterator &
first,
const Iterator &last)
787 const auto n = std::distance(
first, last);
788 for (std::decay_t<decltype(n)> i = 0; i < n; ++i)
789 if (std::addressof(*(std::next(
first, i))) !=
790 std::next(std::addressof(*
first), i))
808 is_contiguous(
T *,
T *)
834 template <
typename Iterator,
typename MemorySpaceType = MemorySpace::Host>
835 ArrayView<
typename std::remove_reference<
836 typename std::iterator_traits<Iterator>::reference>::type,
841 std::is_same_v<
typename std::iterator_traits<Iterator>::iterator_category,
842 typename std::random_access_iterator_tag>
843 #ifdef DEAL_II_HAVE_CXX20
845 std::is_same_v<
typename std::iterator_traits<Iterator>::iterator_category,
846 typename std::contiguous_iterator_tag>
849 "The provided iterator needs to be a random access iterator.");
852 "The beginning of the array view needs to be before the end."));
854 ExcMessage(
"The provided range isn't contiguous in memory!"));
856 return ArrayView<
typename std::remove_reference<
857 typename std::iterator_traits<Iterator>::reference>::type,
872 template <
typename ElementType,
typename MemorySpaceType = MemorySpace::Host>
878 "The beginning of the array view needs to be before the end."));
894 template <
typename Number,
typename MemorySpaceType>
913 template <
typename Number,
typename MemorySpaceType>
943 template <
int rank,
int dim,
typename Number>
973 template <
int rank,
int dim,
typename Number>
1003 template <
int rank,
int dim,
typename Number>
1034 template <
int rank,
int dim,
typename Number>
1056 template <
typename ElementType,
int N>
1079 template <
typename ElementType>
1102 template <
typename ElementType>
1125 template <
typename ElementType>
1148 template <
typename ElementType>
1176 template <
typename ElementType>
1179 const std::size_t starting_index,
1180 const std::size_t size_of_view)
1182 Assert(starting_index + size_of_view <= vector.size(),
1183 ExcMessage(
"The starting index and size of the view you want to "
1184 "create would lead to a view that extends beyond the end "
1185 "of the given vector."));
1210 template <
typename ElementType>
1213 const std::size_t starting_index,
1214 const std::size_t size_of_view)
1216 Assert(starting_index + size_of_view <= vector.size(),
1217 ExcMessage(
"The starting index and size of the view you want to "
1218 "create would lead to a view that extends beyond the end "
1219 "of the given vector."));
1232 template <
typename ElementType>
1248 template <
typename ElementType>
1264 template <
typename ElementType>
1267 const std::size_t starting_index,
1268 const std::size_t size_of_view)
1270 Assert(starting_index + size_of_view <= vector.
size(),
1271 ExcMessage(
"The starting index and size of the view you want to "
1272 "create would lead to a view that extends beyond the end "
1273 "of the given vector."));
1286 template <
typename ElementType>
1289 const std::size_t starting_index,
1290 const std::size_t size_of_view)
1292 Assert(starting_index + size_of_view <= vector.
size(),
1293 ExcMessage(
"The starting index and size of the view you want to "
1294 "create would lead to a view that extends beyond the end "
1295 "of the given vector."));
1315 template <
typename ElementType, std::
size_t N>
1338 template <
typename ElementType, std::
size_t N>
1363 template <
typename ElementType>
1390 template <
typename ElementType>
1415 template <
typename ElementType>
1440 template <
typename ElementType>
1465 template <
typename ElementType>
1490 template <
typename ElementType>
1520 template <
typename ElementType>
1525 const std::size_t size_of_view)
1529 Assert(starting_column + size_of_view <= table.size()[1],
1530 ExcMessage(
"The starting index and size of the view you want to "
1531 "create would lead to a view that extends beyond the end "
1532 "of a column of the given table."));
1557 template <
typename ElementType>
1562 const std::size_t size_of_view)
1566 Assert(starting_column + size_of_view <= table.size()[1],
1567 ExcMessage(
"The starting index and size of the view you want to "
1568 "create would lead to a view that extends beyond the end "
1569 "of a column of the given table."));
1586 template <
typename Container>
auto make_const_array_view(const Container &container) -> decltype(make_array_view(container))
ArrayView< const ElementType > make_array_view(const Vector< ElementType > &vector)
ArrayView(value_type &element)
bool operator!=(const ArrayView< std::remove_cv_t< value_type >, MemorySpaceType > &other_view) const
ArrayView< Number, MemorySpaceType > make_array_view(ArrayView< Number, MemorySpaceType > &array_view)
ArrayView< typename std::remove_reference< typename std::iterator_traits< Iterator >::reference >::type, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
ArrayView(const ArrayView< std::remove_cv_t< value_type >, MemorySpaceType > &view)
ArrayView< Number > make_array_view(SymmetricTensor< rank, dim, Number > &tensor)
value_type & operator[](const std::size_t i) const
ArrayView(const std::array< std::remove_cv_t< value_type >, N > &vector)
ArrayView< const ElementType > make_array_view(const LAPACKFullMatrix< ElementType > &matrix)
ArrayView< ElementType > make_array_view(std::array< ElementType, N > &array)
ArrayView< const Number > make_array_view(const Tensor< rank, dim, Number > &tensor)
bool operator==(const ArrayView< std::remove_cv_t< value_type >, MemorySpaceType > &other_view) const
ArrayView< const Number > make_array_view(const SymmetricTensor< rank, dim, Number > &tensor)
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
ArrayView< const ElementType > make_array_view(const std::vector< ElementType > &vector, const std::size_t starting_index, const std::size_t size_of_view)
ArrayView(std::array< std::remove_cv_t< value_type >, N > &vector)
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
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
const_iterator cbegin() const
ArrayView(value_type(&array)[N])
ArrayView< Number > make_array_view(Tensor< rank, dim, Number > &tensor)
value_type * data() const noexcept
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)
ArrayView< ElementType > make_array_view(Table< 2, ElementType > &table)
value_type * starting_element
ArrayView(const std::vector< std::remove_cv_t< value_type >> &vector)
ArrayView(value_type *starting_element, const std::size_t n_elements)
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
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(std::vector< std::remove_cv_t< value_type >> &vector)
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< ElementType > make_array_view(AlignedVector< ElementType > &vector)
StridedArrayView(value_type *starting_element, const std::size_t n_elements)
value_type * starting_element
value_type * data() const noexcept
virtual size_type size() const override
#define DEAL_II_DEPRECATED
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcMessage(std::string arg1)
@ matrix
Contents is actually a matrix.
VectorType::value_type * begin(VectorType &V)
VectorType::value_type * end(VectorType &V)
#define DEAL_II_HOST_DEVICE