16 #ifndef dealii_array_view_h
17 #define dealii_array_view_h
27 #include <type_traits>
33 template <
int N,
typename T>
36 template <
typename number>
81 template <
typename ElementType,
typename MemorySpaceType = MemorySpace::Host>
137 MemorySpaceType> &view);
160 const std::vector<
typename std::remove_cv<value_type>::type> &vector);
176 ArrayView(std::vector<
typename std::remove_cv<value_type>::type> &vector);
192 template <std::
size_t N>
203 template <std::
size_t N>
205 const std::array<
typename std::remove_cv<value_type>::type,
N> &vector);
215 template <std::
size_t N>
216 ArrayView(std::array<
typename std::remove_cv<value_type>::type,
N> &vector);
272 MemorySpaceType> &other_view)
const;
309 MemorySpaceType> &other_view)
const;
362 operator[](const std::
size_t i) const;
384 template <typename
ElementType, typename MemorySpaceType>
392 template <
typename ElementType,
typename MemorySpaceType>
402 template <
typename ElementType,
typename MemorySpaceType>
405 const std::size_t n_elements)
407 this->starting_element = starting_element;
408 this->n_elements = n_elements;
413 template <
typename ElementType,
typename MemorySpaceType>
415 : starting_element(&element)
421 template <
typename ElementType,
typename MemorySpaceType>
423 const ArrayView<
typename std::remove_cv<value_type>::type, MemorySpaceType>
425 : starting_element(view.starting_element)
426 , n_elements(view.n_elements)
431 template <
typename ElementType,
typename MemorySpaceType>
433 const std::vector<
typename std::remove_cv<value_type>::type> &vector)
446 static_assert(std::is_const<value_type>::value ==
true,
447 "This constructor may only be called if the ArrayView "
448 "object has a const value_type. In other words, you can "
449 "only create an ArrayView to const values from a const "
455 template <
typename ElementType,
typename MemorySpaceType>
457 std::vector<
typename std::remove_cv<value_type>::type> &vector)
464 template <
typename ElementType,
typename MemorySpaceType>
465 template <std::
size_t N>
467 const std::array<
typename std::remove_cv<value_type>::type,
N> &vector)
480 static_assert(std::is_const<value_type>::value ==
true,
481 "This constructor may only be called if the ArrayView "
482 "object has a const value_type. In other words, you can "
483 "only create an ArrayView to const values from a const "
489 template <
typename ElementType,
typename MemorySpaceType>
490 template <std::
size_t N>
498 template <
typename ElementType,
typename MemorySpaceType>
499 template <std::
size_t N>
501 std::array<
typename std::remove_cv<value_type>::type,
N> &vector)
508 template <
typename ElementType,
typename MemorySpaceType>
513 return (other_view.
data() == starting_element) &&
514 (other_view.
size() == n_elements);
519 template <
typename ElementType,
typename MemorySpaceType>
522 const ArrayView<
typename std::remove_cv<value_type>::type, MemorySpaceType>
525 return (other_view.data() == starting_element) &&
526 (other_view.size() == n_elements);
531 template <
typename ElementType,
typename MemorySpaceType>
536 return !(*
this == other_view);
541 template <
typename ElementType,
typename MemorySpaceType>
548 return starting_element;
553 template <
typename ElementType,
typename MemorySpaceType>
556 const ArrayView<
typename std::remove_cv<value_type>::type, MemorySpaceType>
559 return !(*
this == other_view);
564 template <
typename ElementType,
typename MemorySpaceType>
573 template <
typename ElementType,
typename MemorySpaceType>
577 return starting_element;
582 template <
typename ElementType,
typename MemorySpaceType>
586 return starting_element + n_elements;
591 template <
typename ElementType,
typename MemorySpaceType>
595 return starting_element;
600 template <
typename ElementType,
typename MemorySpaceType>
604 return starting_element + n_elements;
609 template <
typename ElementType,
typename MemorySpaceType>
615 return *(starting_element + i);
623 namespace ArrayViewHelper
630 template <
class Iterator>
632 is_contiguous(
const Iterator &
first,
const Iterator &last)
634 const auto n = std::distance(
first, last);
635 for (
typename std::decay<decltype(n)>::type i = 0; i < n; ++i)
636 if (std::addressof(*(std::next(
first, i))) !=
637 std::next(std::addressof(*
first), i))
655 is_contiguous(
T *,
T *)
681 template <
typename Iterator,
typename MemorySpaceType = MemorySpace::Host>
682 ArrayView<
typename std::remove_reference<
683 typename std::iterator_traits<Iterator>::reference>::type,
688 std::is_same<
typename std::iterator_traits<Iterator>::iterator_category,
689 typename std::random_access_iterator_tag>::value,
690 "The provided iterator needs to be a random access iterator.");
693 "The beginning of the array view needs to be before the end."));
695 ExcMessage(
"The provided range isn't contiguous in memory!"));
697 return ArrayView<
typename std::remove_reference<
698 typename std::iterator_traits<Iterator>::reference>::type,
713 template <
typename ElementType,
typename MemorySpaceType = MemorySpace::Host>
719 "The beginning of the array view needs to be before the end."));
735 template <
typename Number,
typename MemorySpaceType>
754 template <
typename Number,
typename MemorySpaceType>
784 template <
int rank,
int dim,
typename Number>
814 template <
int rank,
int dim,
typename Number>
844 template <
int rank,
int dim,
typename Number>
875 template <
int rank,
int dim,
typename Number>
897 template <
typename ElementType,
int N>
919 template <
typename ElementType>
942 template <
typename ElementType>
965 template <
typename ElementType>
988 template <
typename ElementType>
1016 template <
typename ElementType>
1019 const std::size_t starting_index,
1020 const std::size_t size_of_view)
1022 Assert(starting_index + size_of_view <= vector.size(),
1023 ExcMessage(
"The starting index and size of the view you want to "
1024 "create would lead to a view that extends beyond the end "
1025 "of the given vector."));
1050 template <
typename ElementType>
1053 const std::size_t starting_index,
1054 const std::size_t size_of_view)
1056 Assert(starting_index + size_of_view <= vector.size(),
1057 ExcMessage(
"The starting index and size of the view you want to "
1058 "create would lead to a view that extends beyond the end "
1059 "of the given vector."));
1079 template <
typename ElementType, std::
size_t N>
1102 template <
typename ElementType, std::
size_t N>
1127 template <
typename ElementType>
1154 template <
typename ElementType>
1179 template <
typename ElementType>
1204 template <
typename ElementType>
1229 template <
typename ElementType>
1254 template <
typename ElementType>
1284 template <
typename ElementType>
1289 const std::size_t size_of_view)
1293 Assert(starting_column + size_of_view <= table.size()[1],
1294 ExcMessage(
"The starting index and size of the view you want to "
1295 "create would lead to a view that extends beyond the end "
1296 "of a column of the given table."));
1321 template <
typename ElementType>
1326 const std::size_t size_of_view)
1330 Assert(starting_column + size_of_view <= table.size()[1],
1331 ExcMessage(
"The starting index and size of the view you want to "
1332 "create would lead to a view that extends beyond the end "
1333 "of a column of the given table."));
1350 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)
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< const ElementType > make_array_view(const std::array< ElementType, N > &array)
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)