5#ifndef DUNE_COMMON_STD_MDARRAY_HH 
    6#define DUNE_COMMON_STD_MDARRAY_HH 
   15#if __has_include(<version>) 
   19#include <dune/common/indices.hh> 
   21#include <dune/common/std/default_accessor.hh> 
   22#include <dune/common/std/mdspan.hh> 
   23#include <dune/common/std/no_unique_address.hh> 
   24#include <dune/common/std/impl/containerconstructiontraits.hh> 
   66template <
class Element, 
class Extents, 
class LayoutPolicy = Std::layout_right,
 
   67          class Container = std::vector<Element>>
 
   70  template <
class,
class,
class,
class> 
friend class mdarray;
 
   72  static_assert(std::is_object_v<Element>);
 
   73  static_assert(!std::is_abstract_v<Element>);
 
   74  static_assert(!std::is_array_v<Element>);
 
   75  static_assert(std::is_same_v<Element, typename Container::value_type>);
 
   78  using element_type = Element;
 
   79  using extents_type = Extents;
 
   80  using layout_type = LayoutPolicy;
 
   81  using container_type = Container;
 
   83  using value_type = element_type;
 
   84  using mapping_type = 
typename layout_type::template mapping<extents_type>;
 
   86  using index_type = 
typename extents_type::index_type;
 
   87  using size_type = 
typename extents_type::size_type;
 
   88  using rank_type = 
typename extents_type::rank_type;
 
   93  using pointer = 
decltype(std::to_address(std::declval<container_type>().begin()));
 
   94  using reference = 
typename container_type::reference;
 
   95  using const_pointer = 
decltype(std::to_address(std::declval<container_type>().cbegin()));
 
   96  using const_reference = 
typename container_type::const_reference;
 
   98  static_assert(std::is_constructible_v<mapping_type, extents_type>);
 
  102  template <
class C, 
class... Args>
 
  103  static constexpr auto construct_container (Args&&... args)
 
  104    -> 
decltype(Impl::ContainerConstructionTraits<C>::construct(std::forward<Args>(args)...))
 
  106    return Impl::ContainerConstructionTraits<C>::construct(std::forward<Args>(args)...);
 
  114  template <
class E = extents_type, 
class C = container_type, 
class M = mapping_type,
 
  115    std::enable_if_t<(E::rank_dynamic() != 0), 
int> = 0,
 
  116    std::enable_if_t<std::is_default_constructible_v<C>, 
int> = 0,
 
  117    std::enable_if_t<std::is_default_constructible_v<M>, 
int> = 0>
 
  129  template <
class... IndexTypes,
 
  130    std::enable_if_t<(... && std::is_convertible_v<IndexTypes,index_type>), 
int> = 0,
 
  131    std::enable_if_t<std::is_constructible_v<extents_type,IndexTypes...>, 
int> = 0,
 
  132    std::enable_if_t<(... && std::is_nothrow_constructible_v<index_type,IndexTypes>), 
int> = 0>
 
  133  explicit constexpr mdarray (IndexTypes... exts)
 
  134    : 
mdarray(extents_type(index_type(
std::move(exts))...))
 
  138  explicit constexpr mdarray (
const extents_type& e)
 
  143  template <
class C = container_type,
 
  144    decltype(construct_container<C>(std::declval<std::size_t>()), 
bool{}) = 
true>
 
  145  explicit constexpr mdarray (
const mapping_type& m)
 
  146    : container_(construct_container<C>(m.required_span_size()))
 
  155  constexpr mdarray (
const extents_type& e, 
const value_type& v)
 
  160  template <
class C = container_type,
 
  161    decltype(construct_container<C>(std::declval<std::size_t>(),std::declval<const value_type&>()), 
bool{}) = 
true>
 
  162  constexpr mdarray (
const mapping_type& m, 
const value_type& v)
 
  163    : container_(construct_container<C>(m.required_span_size(), v))
 
  172  template <
class E = extents_type,
 
  173    std::enable_if_t<std::is_constructible_v<mapping_type,const E&>, 
int> = 0>
 
  174  constexpr mdarray (
const E& e, 
const container_type& c)
 
  180  template <
class E = extents_type,
 
  181    std::enable_if_t<std::is_constructible_v<mapping_type,const E&>, 
int> = 0>
 
  182  constexpr mdarray (
const E& e, container_type&& c)
 
  183    : container_(
std::move(c))
 
  188  constexpr mdarray (
const mapping_type& m, 
const container_type& c)
 
  194  constexpr mdarray (
const mapping_type& m, container_type&& c)
 
  195    : container_(
std::move(c))
 
  204  template <
class OtherElementType, 
class OtherExtents, 
class OtherLayoutPolicy, 
class OtherContainer,
 
  205    std::enable_if_t<std::is_constructible_v<Container,const OtherContainer&>, 
int> = 0,
 
  206    std::enable_if_t<std::is_constructible_v<extents_type,OtherExtents>, 
int> = 0,
 
  207    std::enable_if_t<std::is_constructible_v<mapping_type,const typename OtherLayoutPolicy::template mapping<OtherExtents>&>, 
int> = 0>
 
  208  #if __cpp_conditional_explicit >= 201806L 
  210    !std::is_convertible_v<const typename OtherLayoutPolicy::template mapping<OtherExtents>&, mapping_type> ||
 
  211    !std::is_convertible_v<const OtherContainer&, container_type>)
 
  214    : container_(other.container_)
 
  215    , mapping_(other.mapping_)
 
  219  template <
class OtherElementType, 
class OtherExtents, 
class OtherLayoutPolicy, 
class Accessor,
 
  220    std::enable_if_t<std::is_constructible_v<value_type,typename Accessor::reference>, 
int> = 0,
 
  221    std::enable_if_t<std::is_assignable_v<value_type&, typename Accessor::reference>, 
int> = 0,
 
  222    std::enable_if_t<std::is_constructible_v<mapping_type, const typename OtherLayoutPolicy::template mapping<OtherExtents>&>, 
int> = 0,
 
  223    decltype(construct_container<container_type>(std::declval<std::size_t>()), 
bool{}) = 
true>
 
  224  #
if __cpp_conditional_explicit >= 201806L
 
  226    !std::is_convertible_v<
const typename OtherLayoutPolicy::template mapping<OtherExtents>&, mapping_type> ||
 
  227    !std::is_convertible_v<typename Accessor::reference, value_type>)
 
  230    : container_(construct_container<container_type>(other.
size()))
 
  233    init_from_mdspan(other);
 
  241  template <
class Alloc,
 
  242    std::enable_if_t<std::is_constructible_v<container_type, std::size_t, Alloc>, 
int> = 0>
 
  243  constexpr mdarray (
const extents_type& e, 
const Alloc& a)
 
  248  template <
class Alloc,
 
  249    std::enable_if_t<std::is_constructible_v<container_type, std::size_t, Alloc>, 
int> = 0>
 
  250  constexpr mdarray (
const mapping_type& m, 
const Alloc& a)
 
  251    : container_(m.required_span_size(), a)
 
  256  template <
class Alloc>
 
  257  constexpr mdarray (
const extents_type& e, 
const value_type& v, 
const Alloc& a)
 
  258    : 
mdarray(mapping_type(e), v, a)
 
  262  template <
class Alloc,
 
  263    std::enable_if_t<std::is_constructible_v<container_type, std::size_t, value_type, Alloc>, 
int> = 0>
 
  264  constexpr mdarray (
const mapping_type& m, 
const value_type& v, 
const Alloc& a)
 
  265    : container_(m.required_span_size(), v, a)
 
  270  template <
class Alloc,
 
  271    std::enable_if_t<std::is_constructible_v<container_type, container_type, Alloc>, 
int> = 0>
 
  272  constexpr mdarray (
const extents_type& e, 
const container_type& c, 
const Alloc& a)
 
  278  template <
class Alloc,
 
  279    std::enable_if_t<std::is_constructible_v<container_type, container_type, Alloc>, 
int> = 0>
 
  280  constexpr mdarray (
const extents_type& e, container_type&& c, 
const Alloc& a)
 
  281    : container_(
std::move(c), a)
 
  286  template <
class Alloc,
 
  287    std::enable_if_t<std::is_constructible_v<container_type, container_type, Alloc>, 
int> = 0>
 
  288  constexpr mdarray (
const mapping_type& m, 
const container_type& c, 
const Alloc& a)
 
  294  template <
class Alloc,
 
  295    std::enable_if_t<std::is_constructible_v<container_type, container_type, Alloc>, 
int> = 0>
 
  296  constexpr mdarray (
const mapping_type& m, container_type&& c, 
const Alloc& a)
 
  297    : container_(
std::move(c), a)
 
  302  template <
class V, 
class E, 
class L, 
class C, 
class Alloc,
 
  303    std::enable_if_t<std::is_constructible_v<container_type, C, Alloc>, 
int> = 0>
 
  304  #if __cpp_conditional_explicit >= 201806L 
  306    !std::is_convertible_v<const typename L::template mapping<E>&, mapping_type> ||
 
  307    !std::is_convertible_v<const C&, container_type>)
 
  310    : container_(other.container_, a)
 
  311    , mapping_(other.mapping_)
 
  315  template <
class V, 
class E, 
class L, 
class A, 
class Alloc,
 
  316    class C = container_type,
 
  317    class Al = 
typename C::allocator_type,
 
  318    std::enable_if_t<std::is_constructible_v<C, std::size_t, Alloc>, 
int> = 0>
 
  319  #if __cpp_conditional_explicit >= 201806L 
  321    !std::is_convertible_v<const typename L::template mapping<E>&, mapping_type> ||
 
  322    !std::is_convertible_v<typename A::reference, value_type> ||
 
  323    !std::is_convertible_v<Alloc, Al>)
 
  326    : container_(other.
size(), a)
 
  327    , mapping_(other.mapping_)
 
  329    init_from_mdspan(other);
 
  336  template <
class V, 
class E, 
class L, 
class A, 
class... 
Indices>
 
  339    constexpr rank_type pos = 
sizeof...(Indices);
 
  340    if constexpr(pos < 
rank()) {
 
  341      for (
typename E::index_type i = 0; i < other.
extent(pos); ++i)
 
  342        init_from_mdspan(other,ii...,i);
 
  344      using I = std::array<
typename E::index_type,E::rank()>;
 
  345      container_[mapping_(index_type(ii)...)] = other[I{ii...}];
 
  361    std::enable_if_t<(
sizeof...(Indices) == extents_type::rank()), 
int> = 0,
 
  362    std::enable_if_t<(... && std::is_convertible_v<Indices,index_type>), 
int> = 0>
 
  365    return container_[mapping_(index_type(std::move(indices))...)];
 
  373    std::enable_if_t<(
sizeof...(Indices) == extents_type::rank()), 
int> = 0,
 
  374    std::enable_if_t<(... && std::is_convertible_v<Indices,index_type>), 
int> = 0>
 
  377    return container_[mapping_(index_type(std::move(indices))...)];
 
  381#if __cpp_multidimensional_subscript >= 202110L 
  385    std::enable_if_t<(
sizeof...(Indices) == extents_type::rank()), 
int> = 0,
 
  386    std::enable_if_t<(... && std::is_convertible_v<Indices,index_type>), 
int> = 0>
 
  389    return container_[mapping_(index_type(std::move(indices))...)];
 
  394    std::enable_if_t<(
sizeof...(Indices) == extents_type::rank()), 
int> = 0,
 
  395    std::enable_if_t<(... && std::is_convertible_v<Indices,index_type>), 
int> = 0>
 
  398    return container_[mapping_(index_type(std::move(indices))...)];
 
  405  template <
class Index, 
class E = extents_type,
 
  406    std::enable_if_t<std::is_convertible_v<Index,index_type>, 
int> = 0,
 
  407    std::enable_if_t<(E::rank() == 1), 
int> = 0>
 
  408  constexpr reference 
operator[] (Index index)
 
  410    return container_[mapping_(index_type(std::move(index)))];
 
  415  template <
class Index, 
class E = extents_type,
 
  416    std::enable_if_t<std::is_convertible_v<Index,index_type>, 
int> = 0,
 
  417    std::enable_if_t<(E::rank() == 1), 
int> = 0>
 
  418  constexpr const_reference 
operator[] (Index index) 
const 
  420    return container_[mapping_(index_type(std::move(index)))];
 
  427  template <
class Index,
 
  428    std::enable_if_t<std::is_convertible_v<const Index&, index_type>, 
int> = 0>
 
  429  constexpr reference 
operator[] (std::span<Index,extents_type::rank()> indices)
 
  432      return container_[mapping_(index_type(indices[ii])...)]; },
 
  433      std::make_index_sequence<extents_type::rank()>{});
 
  437  template <
class Index,
 
  438    std::enable_if_t<std::is_convertible_v<const Index&, index_type>, 
int> = 0>
 
  439  constexpr const_reference 
operator[] (std::span<Index,extents_type::rank()> indices)
 const 
  442      return container_[mapping_(index_type(indices[ii])...)]; },
 
  443      std::make_index_sequence<extents_type::rank()>{});
 
  447  template <
class Index,
 
  448    std::enable_if_t<std::is_convertible_v<const Index&, index_type>, 
int> = 0>
 
  449  constexpr reference 
operator[] (
const std::array<Index,extents_type::rank()>& indices)
 
  451    return std::apply([&](
auto... ii) -> reference {
 
  452      return container_[mapping_(index_type(ii)...)]; }, indices);
 
  456  template <
class Index,
 
  457    std::enable_if_t<std::is_convertible_v<const Index&, index_type>, 
int> = 0>
 
  458  constexpr const_reference 
operator[] (
const std::array<Index,extents_type::rank()>& indices)
 const 
  460    return std::apply([&](
auto... ii) -> const_reference {
 
  461      return container_[mapping_(index_type(ii)...)]; }, indices);
 
  468  constexpr const extents_type& 
extents () const noexcept { 
return mapping_.extents(); }
 
  471  constexpr const mapping_type& 
mapping () const noexcept { 
return mapping_; }
 
  474  constexpr const container_type& 
container () const noexcept { 
return container_; }
 
  489  static constexpr rank_type 
rank () noexcept { 
return extents_type::rank(); }
 
  492  static constexpr rank_type 
rank_dynamic () noexcept { 
return extents_type::rank_dynamic(); }
 
  495  static constexpr std::size_t 
static_extent (rank_type r) 
noexcept { 
return extents_type::static_extent(r); }
 
  498  constexpr index_type 
extent (rank_type r) 
const noexcept { 
return extents().extent(r); }
 
  501  constexpr size_type 
size () const noexcept
 
  504    for (rank_type r = 0; r < 
rank(); ++r)
 
  513  [[nodiscard]] 
constexpr bool empty () const noexcept { 
return size() == 0; }
 
  516  constexpr index_type 
stride (rank_type r)
 const { 
return mapping().stride(r); };
 
  521  static constexpr bool is_always_unique () noexcept { 
return mapping_type::is_always_unique(); }
 
  522  static constexpr bool is_always_exhaustive () noexcept { 
return mapping_type::is_always_exhaustive(); }
 
  523  static constexpr bool is_always_strided () noexcept { 
return mapping_type::is_always_strided(); }
 
  525  constexpr bool is_unique () const noexcept { 
return mapping_.is_unique(); }
 
  526  constexpr bool is_exhaustive () const noexcept { 
return mapping_.is_exhaustive(); }
 
  527  constexpr bool is_strided () const noexcept { 
return mapping_.is_strided(); }
 
  534  constexpr pointer 
container_data () noexcept { 
return std::to_address(container_.begin()); }
 
  537  constexpr const_pointer 
container_data () const noexcept { 
return std::to_address(container_.begin()); }
 
  545    swap(x.container_, y.container_);
 
  546    swap(x.mapping_, y.mapping_);
 
  553  friend constexpr bool operator== (
const mdarray& lhs, 
const mdarray& rhs) 
noexcept 
  555    return lhs.mapping() == rhs.mapping() && lhs.container() == rhs.container();
 
  564  template <
class V, 
class E, 
class L, 
class A,
 
  565    std::enable_if_t<std::is_assignable_v<mdspan<V,E,L,A>, mdspan_type>, 
int> = 0>
 
  572  template <
class V, 
class E, 
class L, 
class A,
 
  573    std::enable_if_t<std::is_assignable_v<mdspan<V,E,L,A>, const_mdspan_type>, 
int> = 0>
 
  580  template <
class AccessorPolicy = Std::default_accessor<element_type>,
 
  582      std::is_assignable_v<mdspan_type, mdspan<element_type,extents_type,layout_type,AccessorPolicy>>, 
int> = 0>
 
  590  template <
class AccessorPolicy = Std::default_accessor<const element_type>,
 
  592      std::is_assignable_v<const_mdspan_type, mdspan<const element_type,extents_type,layout_type,AccessorPolicy>>, 
int> = 0>
 
  593  constexpr mdspan<const element_type,extents_type,layout_type,AccessorPolicy>
 
  594  to_mdspan (
const AccessorPolicy& a = AccessorPolicy{}) 
const 
  600  container_type container_;
 
  601  DUNE_NO_UNIQUE_ADDRESS mapping_type mapping_;
 
  608template <
class IndexType, std::size_t... exts, 
class Container>
 
  609mdarray (
const Std::extents<IndexType, exts...>&, 
const Container&)
 
  610  -> mdarray<
typename Container::value_type, Std::extents<IndexType, exts...>, layout_right, Container>;
 
  612template <
class Mapping, 
class Container>
 
  613mdarray (
const Mapping&, 
const Container&)
 
  614  -> mdarray<typename Container::value_type, typename Mapping::extents_type, typename Mapping::layout_type, Container>;
 
  616template <
class IndexType, std::size_t... exts, 
class Container>
 
  617mdarray (
const Std::extents<IndexType, exts...>&, Container&&)
 
  618  -> mdarray<
typename Container::value_type, Std::extents<IndexType, exts...>, layout_right, Container>;
 
  620template <
class Mapping, 
class Container>
 
  621mdarray (
const Mapping&, Container&&)
 
  622  -> mdarray<typename Container::value_type, typename Mapping::extents_type, typename Mapping::layout_type, Container>;
 
  624template <
class Element, 
class Extents, 
class Layout, 
class Accessor>
 
  625mdarray (
const mdspan<Element, Extents, Layout, Accessor>&)
 
  626  -> mdarray<std::remove_cv_t<Element>, Extents, Layout>;
 
  628template <
class IndexType, std::size_t... exts, 
class Container, 
class Alloc>
 
  629mdarray (
const Std::extents<IndexType, exts...>&, 
const Container&, 
const Alloc&)
 
  630  -> mdarray<
typename Container::value_type, Std::extents<IndexType, exts...>, layout_right, Container>;
 
  632template <
class Mapping, 
class Container, 
class Alloc>
 
  633mdarray (
const Mapping&, 
const Container&, 
const Alloc&)
 
  634  -> mdarray<typename Container::value_type, typename Mapping::extents_type, typename Mapping::layout_type, Container>;
 
  636template <
class IndexType, std::size_t... exts, 
class Container, 
class Alloc>
 
  637mdarray (
const Std::extents<IndexType, exts...>&, Container&&, 
const Alloc&)
 
  638  -> mdarray<
typename Container::value_type, Std::extents<IndexType, exts...>, layout_right, Container>;
 
  640template <
class Mapping, 
class Container, 
class Alloc>
 
  641mdarray (
const Mapping&, Container&&, 
const Alloc&)
 
  642  -> mdarray<typename Container::value_type, typename Mapping::extents_type, typename Mapping::layout_type, Container>;
 
  644template <
class Element, 
class Extents, 
class Layout, 
class Accessor, 
class Alloc>
 
  645mdarray (
const mdspan<Element, Extents, Layout, Accessor>&, 
const Alloc&)
 
  646  -> mdarray<std::remove_cv_t<Element>, Extents, Layout>;
 
  654template <
class Element, 
class Extents, 
class Layout, 
class Container>
 
  655mdspan (mdarray<Element, Extents, Layout, Container>) -> mdspan<
 
  656  typename decltype(std::declval<mdarray<Element, Extents, Layout, Container>>().to_mdspan())::element_type,
 
  657  typename decltype(std::declval<mdarray<Element, Extents, Layout, Container>>().to_mdspan())::extents_type,
 
  658  typename decltype(std::declval<mdarray<Element, Extents, Layout, Container>>().to_mdspan())::layout_type,
 
  659  typename decltype(std::declval<mdarray<Element, Extents, Layout, Container>>().to_mdspan())::accessor_type>;
 
An owning multi-dimensional array analog of mdspan.
Definition: mdarray.hh:69
 
constexpr mdarray(const mapping_type &m, const container_type &c, const Alloc &a)
Construct from layout mapping, container and allocator.
Definition: mdarray.hh:288
 
constexpr mdarray(const mapping_type &m, container_type &&c)
Construct from layout mapping and the storage container.
Definition: mdarray.hh:194
 
constexpr mdarray(const E &e, const container_type &c)
Construct from extents and the storage container.
Definition: mdarray.hh:174
 
constexpr mdspan< const element_type, extents_type, layout_type, AccessorPolicy > to_mdspan(const AccessorPolicy &a=AccessorPolicy{}) const
Conversion function to mdspan.
Definition: mdarray.hh:594
 
constexpr index_type stride(rank_type r) const
The stride along the specified dimension.
Definition: mdarray.hh:516
 
constexpr index_type extent(rank_type r) const noexcept
Number of elements in the r'th dimension of the tensor.
Definition: mdarray.hh:498
 
constexpr mdarray(const extents_type &e, const Alloc &a)
Construct from the extents of the array and allocator.
Definition: mdarray.hh:243
 
static constexpr std::size_t static_extent(rank_type r) noexcept
Number of elements in the r'th dimension of the tensor.
Definition: mdarray.hh:495
 
constexpr mdarray(const mdspan< OtherElementType, OtherExtents, OtherLayoutPolicy, Accessor > &other)
Converting constructor from mdspan.
Definition: mdarray.hh:229
 
constexpr const_pointer container_data() const noexcept
Direct access to the underlying const data in the container.
Definition: mdarray.hh:537
 
constexpr mdarray(const extents_type &e, const value_type &v)
Construct from extents and initial value.
Definition: mdarray.hh:155
 
constexpr mdarray(const mapping_type &m, const Alloc &a)
Construct from the layout mapping of the array and allocator.
Definition: mdarray.hh:250
 
constexpr pointer container_data() noexcept
Direct access to the underlying data in the container.
Definition: mdarray.hh:534
 
constexpr reference operator[](Index index)
Access specified element at position [i0] For a rank one mdarray, the operator[i] is added to support...
Definition: mdarray.hh:408
 
constexpr const extents_type & extents() const noexcept
Number of elements in all dimensions of the array,.
Definition: mdarray.hh:468
 
constexpr mdarray(const mapping_type &m, const container_type &c)
Construct from layout mapping and the storage container.
Definition: mdarray.hh:188
 
constexpr mdarray(const mapping_type &m, container_type &&c, const Alloc &a)
Construct from layout mapping, container and allocator.
Definition: mdarray.hh:296
 
constexpr mdarray(const E &e, container_type &&c)
Construct from extents and the storage container.
Definition: mdarray.hh:182
 
constexpr const container_type & container() const noexcept
The underlying storage container.
Definition: mdarray.hh:474
 
constexpr std::size_t container_size() const
Size of the underlying container.
Definition: mdarray.hh:510
 
static constexpr rank_type rank() noexcept
Number of dimensions of the array.
Definition: mdarray.hh:489
 
constexpr bool empty() const noexcept
Check whether the index space is empty.
Definition: mdarray.hh:513
 
constexpr mdarray(const extents_type &e, container_type &&c, const Alloc &a)
Construct from extents, container and allocator.
Definition: mdarray.hh:280
 
constexpr size_type size() const noexcept
Size of the multi-dimensional index space.
Definition: mdarray.hh:501
 
constexpr const mapping_type & mapping() const noexcept
Index mapping of a layout policy.
Definition: mdarray.hh:471
 
constexpr mdarray(const mapping_type &m, const value_type &v, const Alloc &a)
Construct from layout mapping, initial value and allocator.
Definition: mdarray.hh:264
 
constexpr mdarray(const extents_type &e, const value_type &v, const Alloc &a)
Construct from extents, initial value and allocator.
Definition: mdarray.hh:257
 
constexpr mdspan< element_type, extents_type, layout_type, AccessorPolicy > to_mdspan(const AccessorPolicy &a=AccessorPolicy{})
Conversion function to mdspan.
Definition: mdarray.hh:584
 
constexpr container_type && extract_container() &&noexcept
Move the container out of the mdarray.
Definition: mdarray.hh:482
 
constexpr mdarray(const extents_type &e, const container_type &c, const Alloc &a)
Construct from extents, container and allocator.
Definition: mdarray.hh:272
 
static constexpr rank_type rank_dynamic() noexcept
Number of dimension with dynamic size.
Definition: mdarray.hh:492
 
constexpr reference operator()(Indices... indices)
Access element at position (i0,i1,...)
Definition: mdarray.hh:363
 
constexpr mdarray(const extents_type &e)
Construct from the extents of the array.
Definition: mdarray.hh:138
 
constexpr mdarray(IndexTypes... exts)
Construct from the dynamic extents.
Definition: mdarray.hh:133
 
A multi-dimensional non-owning array view.
Definition: mdspan.hh:65
 
constexpr index_type extent(rank_type r) const noexcept
Number of elements in the r'th dimension of the tensor.
Definition: mdspan.hh:276
 
constexpr size_type size() const noexcept
The number of elements accessible by this multi-dimensional span.
Definition: mdspan.hh:279
 
decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, i... > sequence)
Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>...
Definition: indices.hh:124
 
constexpr EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition: iteratorfacades.hh:238
 
Namespace with predefined compile time indices for the range [0,19].
Definition: indices.hh:50
 
Namespace for features backported from new C++ standards.
Definition: algorithm.hh:19
 
Utilities for reduction like operations on ranges.
 
Get the 'const' version of a reference to a mutable object.
Definition: genericiterator.hh:87