16 #ifndef dealii_array_view_h 17 #define dealii_array_view_h 19 #include <deal.II/base/config.h> 21 #include <deal.II/base/exceptions.h> 23 #include <deal.II/base/table.h> 24 #include <deal.II/base/tensor.h> 26 #include <deal.II/lac/lapack_full_matrix.h> 28 #include <type_traits> 31 DEAL_II_NAMESPACE_OPEN
75 template <
typename ElementType>
142 const std::vector<
typename std::remove_cv<value_type>::type> &vector);
158 ArrayView(std::vector<
typename std::remove_cv<value_type>::type> &vector);
206 data() const noexcept;
255 friend class
ArrayView<const ElementType>;
264 template <typename ElementType>
266 const
std::
size_t n_elements)
267 : starting_element(starting_element)
268 , n_elements(n_elements)
273 template <
typename ElementType>
275 const ArrayView<
typename std::remove_cv<value_type>::type> &view)
282 template <
typename ElementType>
284 const std::vector<
typename std::remove_cv<value_type>::type> &vector)
297 static_assert(std::is_const<value_type>::value ==
true,
298 "This constructor may only be called if the ArrayView " 299 "object has a const value_type. In other words, you can " 300 "only create an ArrayView to const values from a const " 306 template <
typename ElementType>
308 std::vector<
typename std::remove_cv<value_type>::type> &vector)
315 template <
typename ElementType>
326 template <
typename ElementType>
329 const ArrayView<
typename std::remove_cv<value_type>::type> &other_view)
const 337 template <
typename ElementType>
342 return !(*
this == other_view);
347 template <
typename ElementType>
359 template <
typename ElementType>
362 const ArrayView<
typename std::remove_cv<value_type>::type> &other_view)
const 364 return !(*
this == other_view);
369 template <
typename ElementType>
376 template <
typename ElementType>
385 template <
typename ElementType>
394 template <
typename ElementType>
403 template <
typename ElementType>
412 template <
typename ElementType>
426 namespace ArrayViewHelper
433 template <
class Iterator>
435 is_contiguous(
const Iterator &first,
const Iterator &last)
437 const auto n = std::distance(first, last);
438 for (
typename std::decay<decltype(n)>::type i = 0; i < n; ++i)
439 if (std::addressof(*(std::next(first, i))) !=
440 std::next(std::addressof(*first), i))
458 is_contiguous(T *, T *)
484 template <
typename Iterator>
485 ArrayView<
typename std::remove_reference<
486 typename std::iterator_traits<Iterator>::reference>::type>
490 std::is_same<
typename std::iterator_traits<Iterator>::iterator_category,
491 typename std::random_access_iterator_tag>::value,
492 "The provided iterator should be a random access iterator.");
495 "The beginning of the array view should be before the end."));
496 Assert(internal::ArrayViewHelper::is_contiguous(begin, end),
497 ExcMessage(
"The provided range isn't contiguous in memory!"));
499 return ArrayView<
typename std::remove_reference<
500 typename std::iterator_traits<Iterator>::reference>::type>(
501 std::addressof(*begin), end -
begin);
515 template <
typename ElementType>
521 "The beginning of the array view should be before the end."));
537 template <
typename Number>
556 template <
typename Number>
581 template <
int rank,
int dim,
typename Number>
606 template <
int rank,
int dim,
typename Number>
631 template <
int rank,
int dim,
typename Number>
657 template <
int rank,
int dim,
typename Number>
679 template <
typename ElementType,
int N>
701 template <
typename ElementType>
724 template <
typename ElementType>
747 template <
typename ElementType>
770 template <
typename ElementType>
798 template <
typename ElementType>
801 const std::size_t starting_index,
802 const std::size_t size_of_view)
804 Assert(starting_index + size_of_view <= vector.size(),
805 ExcMessage(
"The starting index and size of the view you want to " 806 "create would lead to a view that extends beyond the end " 807 "of the given vector."));
832 template <
typename ElementType>
835 const std::size_t starting_index,
836 const std::size_t size_of_view)
838 Assert(starting_index + size_of_view <= vector.size(),
839 ExcMessage(
"The starting index and size of the view you want to " 840 "create would lead to a view that extends beyond the end " 841 "of the given vector."));
863 template <
typename ElementType>
890 template <
typename ElementType>
914 template <
typename ElementType>
939 template <
typename ElementType>
964 template <
typename ElementType>
989 template <
typename ElementType>
1019 template <
typename ElementType>
1024 const std::size_t size_of_view)
1028 Assert(starting_column + size_of_view <= table.
size()[1],
1029 ExcMessage(
"The starting index and size of the view you want to " 1030 "create would lead to a view that extends beyond the end " 1031 "of a column of the given table."));
1056 template <
typename ElementType>
1061 const std::size_t size_of_view)
1065 Assert(starting_column + size_of_view <= table.
size()[1],
1066 ExcMessage(
"The starting index and size of the view you want to " 1067 "create would lead to a view that extends beyond the end " 1068 "of a column of the given table."));
1075 DEAL_II_NAMESPACE_CLOSE
ArrayView< ElementType > make_array_view(LAPACKFullMatrix< ElementType > &matrix)
ArrayView< const ElementType > make_array_view(const LAPACKFullMatrix< ElementType > &matrix)
ArrayView< const Number > make_array_view(const ArrayView< Number > &array_view)
const ElementType * const_iterator
const_iterator cend() const
ArrayView< ElementType > make_array_view(ElementType(&array)[N])
ArrayView< const Number > make_array_view(const Tensor< rank, dim, Number > &tensor)
ArrayView< ElementType > make_array_view(std::vector< ElementType > &vector, const std::size_t starting_index, const std::size_t size_of_view)
const std::size_t n_elements
#define AssertIndexRange(index, range)
const_iterator cbegin() const
static::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
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< Number > make_array_view(SymmetricTensor< rank, dim, Number > &tensor)
ArrayView< ElementType > make_array_view(Vector< ElementType > &vector)
ArrayView< typename std::remove_reference< typename std::iterator_traits< Iterator >::reference >::type > make_array_view(const Iterator begin, const Iterator end)
static::ExceptionBase & ExcMessage(std::string arg1)
ArrayView< ElementType > make_array_view(ElementType *const begin, ElementType *const end)
size_type size(const unsigned int i) const
#define Assert(cond, exc)
value_type & operator[](const std::size_t i) const
bool operator==(const ArrayView< const value_type > &other_view) const
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, const std::size_t starting_index, const std::size_t size_of_view)
size_type n_elements() const
ArrayView< const Number > make_array_view(const SymmetricTensor< rank, dim, Number > &tensor)
ArrayView< const ElementType > make_array_view(const Vector< ElementType > &vector)
ArrayView< ElementType > make_array_view(std::vector< ElementType > &vector)
typename AlignedVector< T >::size_type size_type
ArrayView(value_type *starting_element, const std::size_t n_elements)
ArrayView< const ElementType > make_array_view(const Table< 2, ElementType > &table, const typename Table< 2, ElementType >::size_type row)
value_type * data() const noexcept
ArrayView< Number > make_array_view(ArrayView< Number > &array_view)
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)
ArrayView< Number > make_array_view(Tensor< rank, dim, Number > &tensor)
bool operator!=(const ArrayView< const value_type > &other_view) const
ArrayView< const ElementType > make_array_view(const std::vector< ElementType > &vector)
ArrayView< const ElementType > make_array_view(const Table< 2, ElementType > &table)
value_type *const starting_element
ArrayView< ElementType > make_array_view(Table< 2, ElementType > &table)