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 MemorySpaceType> &view);
163 const std::vector<
typename std::remove_cv<value_type>::type> &vector);
179 ArrayView(std::vector<
typename std::remove_cv<value_type>::type> &vector);
195 template <std::
size_t N>
206 template <std::
size_t N>
208 const std::array<
typename std::remove_cv<value_type>::type,
N> &vector);
218 template <std::
size_t N>
219 ArrayView(std::array<
typename std::remove_cv<value_type>::type,
N> &vector);
275 MemorySpaceType> &other_view)
const;
312 MemorySpaceType> &other_view)
const;
371 operator[](const std::
size_t i) const;
393 template <typename
ElementType, typename MemorySpaceType>
401 template <
typename ElementType,
typename MemorySpaceType>
411 template <
typename ElementType,
typename MemorySpaceType>
414 const std::size_t n_elements)
416 this->starting_element = starting_element;
417 this->n_elements = n_elements;
422 template <
typename ElementType,
typename MemorySpaceType>
424 : starting_element(&element)
430 template <
typename ElementType,
typename MemorySpaceType>
432 const ArrayView<
typename std::remove_cv<value_type>::type, MemorySpaceType>
434 : starting_element(view.starting_element)
435 , n_elements(view.n_elements)
440 template <
typename ElementType,
typename MemorySpaceType>
442 const std::vector<
typename std::remove_cv<value_type>::type> &vector)
455 static_assert(std::is_const<value_type>::value ==
true,
456 "This constructor may only be called if the ArrayView "
457 "object has a const value_type. In other words, you can "
458 "only create an ArrayView to const values from a const "
464 template <
typename ElementType,
typename MemorySpaceType>
466 std::vector<
typename std::remove_cv<value_type>::type> &vector)
473 template <
typename ElementType,
typename MemorySpaceType>
474 template <std::
size_t N>
476 const std::array<
typename std::remove_cv<value_type>::type,
N> &vector)
489 static_assert(std::is_const<value_type>::value ==
true,
490 "This constructor may only be called if the ArrayView "
491 "object has a const value_type. In other words, you can "
492 "only create an ArrayView to const values from a const "
498 template <
typename ElementType,
typename MemorySpaceType>
499 template <std::
size_t N>
507 template <
typename ElementType,
typename MemorySpaceType>
508 template <std::
size_t N>
510 std::array<
typename std::remove_cv<value_type>::type,
N> &vector)
517 template <
typename ElementType,
typename MemorySpaceType>
522 return (other_view.
data() == starting_element) &&
523 (other_view.
size() == n_elements);
528 template <
typename ElementType,
typename MemorySpaceType>
531 const ArrayView<
typename std::remove_cv<value_type>::type, MemorySpaceType>
534 return (other_view.data() == starting_element) &&
535 (other_view.size() == n_elements);
540 template <
typename ElementType,
typename MemorySpaceType>
545 return !(*
this == other_view);
550 template <
typename ElementType,
typename MemorySpaceType>
558 return starting_element;
563 template <
typename ElementType,
typename MemorySpaceType>
566 const ArrayView<
typename std::remove_cv<value_type>::type, MemorySpaceType>
569 return !(*
this == other_view);
574 template <
typename ElementType,
typename MemorySpaceType>
583 template <
typename ElementType,
typename MemorySpaceType>
587 return n_elements == 0;
592 template <
typename ElementType,
typename MemorySpaceType>
596 return starting_element;
601 template <
typename ElementType,
typename MemorySpaceType>
605 return starting_element + n_elements;
610 template <
typename ElementType,
typename MemorySpaceType>
614 return starting_element;
619 template <
typename ElementType,
typename MemorySpaceType>
623 return starting_element + n_elements;
628 template <
typename ElementType,
typename MemorySpaceType>
634 return *(starting_element + i);
642 namespace ArrayViewHelper
649 template <
class Iterator>
651 is_contiguous(
const Iterator &
first,
const Iterator &last)
653 const auto n = std::distance(
first, last);
654 for (
typename std::decay<decltype(n)>::type i = 0; i < n; ++i)
655 if (std::addressof(*(std::next(
first, i))) !=
656 std::next(std::addressof(*
first), i))
674 is_contiguous(
T *,
T *)
700 template <
typename Iterator,
typename MemorySpaceType = MemorySpace::Host>
701 ArrayView<
typename std::remove_reference<
702 typename std::iterator_traits<Iterator>::reference>::type,
707 std::is_same<
typename std::iterator_traits<Iterator>::iterator_category,
708 typename std::random_access_iterator_tag>::value,
709 "The provided iterator needs to be a random access iterator.");
712 "The beginning of the array view needs to be before the end."));
714 ExcMessage(
"The provided range isn't contiguous in memory!"));
716 return ArrayView<
typename std::remove_reference<
717 typename std::iterator_traits<Iterator>::reference>::type,
732 template <
typename ElementType,
typename MemorySpaceType = MemorySpace::Host>
738 "The beginning of the array view needs to be before the end."));
754 template <
typename Number,
typename MemorySpaceType>
773 template <
typename Number,
typename MemorySpaceType>
803 template <
int rank,
int dim,
typename Number>
833 template <
int rank,
int dim,
typename Number>
863 template <
int rank,
int dim,
typename Number>
894 template <
int rank,
int dim,
typename Number>
916 template <
typename ElementType,
int N>
938 template <
typename ElementType>
961 template <
typename ElementType>
984 template <
typename ElementType>
1007 template <
typename ElementType>
1035 template <
typename ElementType>
1038 const std::size_t starting_index,
1039 const std::size_t size_of_view)
1041 Assert(starting_index + size_of_view <= vector.size(),
1042 ExcMessage(
"The starting index and size of the view you want to "
1043 "create would lead to a view that extends beyond the end "
1044 "of the given vector."));
1069 template <
typename ElementType>
1072 const std::size_t starting_index,
1073 const std::size_t size_of_view)
1075 Assert(starting_index + size_of_view <= vector.size(),
1076 ExcMessage(
"The starting index and size of the view you want to "
1077 "create would lead to a view that extends beyond the end "
1078 "of the given vector."));
1091 template <
typename ElementType>
1107 template <
typename ElementType>
1123 template <
typename ElementType>
1126 const std::size_t starting_index,
1127 const std::size_t size_of_view)
1129 Assert(starting_index + size_of_view <= vector.
size(),
1130 ExcMessage(
"The starting index and size of the view you want to "
1131 "create would lead to a view that extends beyond the end "
1132 "of the given vector."));
1145 template <
typename ElementType>
1148 const std::size_t starting_index,
1149 const std::size_t size_of_view)
1151 Assert(starting_index + size_of_view <= vector.
size(),
1152 ExcMessage(
"The starting index and size of the view you want to "
1153 "create would lead to a view that extends beyond the end "
1154 "of the given vector."));
1174 template <
typename ElementType, std::
size_t N>
1197 template <
typename ElementType, std::
size_t N>
1222 template <
typename ElementType>
1249 template <
typename ElementType>
1274 template <
typename ElementType>
1299 template <
typename ElementType>
1324 template <
typename ElementType>
1349 template <
typename ElementType>
1379 template <
typename ElementType>
1384 const std::size_t size_of_view)
1388 Assert(starting_column + size_of_view <= table.size()[1],
1389 ExcMessage(
"The starting index and size of the view you want to "
1390 "create would lead to a view that extends beyond the end "
1391 "of a column of the given table."));
1416 template <
typename ElementType>
1421 const std::size_t size_of_view)
1425 Assert(starting_column + size_of_view <= table.size()[1],
1426 ExcMessage(
"The starting index and size of the view you want to "
1427 "create would lead to a view that extends beyond the end "
1428 "of a column of the given table."));
1445 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)
ArrayView(const ArrayView< typename std::remove_cv< value_type >::type, MemorySpaceType > &view)
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< Number > make_array_view(SymmetricTensor< rank, dim, Number > &tensor)
value_type & operator[](const std::size_t i) const
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)
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)
bool operator!=(const ArrayView< typename std::remove_cv< value_type >::type, MemorySpaceType > &other_view) const
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< 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(const std::array< typename std::remove_cv< value_type >::type, N > &vector)
ArrayView< ElementType > make_array_view(std::vector< ElementType > &vector)
ArrayView(std::vector< typename std::remove_cv< value_type >::type > &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(const std::vector< typename std::remove_cv< value_type >::type > &vector)
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
bool operator==(const ArrayView< typename std::remove_cv< value_type >::type, MemorySpaceType > &other_view) const
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< 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)
ArrayView(std::array< typename std::remove_cv< value_type >::type, N > &vector)
#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