5#ifndef DUNE_COMMON_STD_LAYOUT_STRIDE_HH 
    6#define DUNE_COMMON_STD_LAYOUT_STRIDE_HH 
   12#include <dune/common/indices.hh> 
   13#include <dune/common/std/no_unique_address.hh> 
   14#include <dune/common/std/impl/fwd_layouts.hh> 
   19template <
class Extents>
 
   22  template <
class> 
friend class mapping;
 
   23  static constexpr typename Extents::rank_type rank_ = Extents::rank();
 
   26  using extents_type = Extents;
 
   27  using index_type = 
typename extents_type::index_type;
 
   28  using size_type = 
typename extents_type::size_type;
 
   29  using rank_type = 
typename extents_type::rank_type;
 
   33  using strides_type = std::array<index_type,rank_>;
 
   46  template <
class OtherIndexType,
 
   47    std::enable_if_t<std::is_convertible_v<const OtherIndexType&, index_type>, 
int> = 0,
 
   48    std::enable_if_t<std::is_nothrow_constructible_v<index_type, const OtherIndexType&>, 
int> = 0>
 
   49  constexpr mapping (
const extents_type& e, 
const std::array<OtherIndexType,rank_>& s) noexcept
 
   53    for (rank_type r = 0; r < rank_; ++r)
 
   58  template <
class OtherIndexType,
 
   59    std::enable_if_t<std::is_convertible_v<const OtherIndexType&, index_type>, 
int> = 0,
 
   60    std::enable_if_t<std::is_nothrow_constructible_v<index_type, const OtherIndexType&>, 
int> = 0>
 
   61  constexpr mapping (
const extents_type& e, 
const std::span<OtherIndexType,rank_>& s) noexcept
 
   65    for (rank_type r = 0; r < rank_; ++r)
 
   71    std::enable_if_t<(M::extents_type::rank() == extents_type::rank()), 
int> = 0,
 
   72    std::enable_if_t<(M::is_always_unique()), 
int> = 0,
 
   73    std::enable_if_t<(M::is_always_strided()), 
int> = 0,
 
   74    decltype(std::declval<M>().extents(), 
bool{}) = 
true,
 
   75    decltype(std::declval<M>().stride(std::declval<rank_type>()), 
bool{}) = 
true>
 
   77    : extents_(m.extents())
 
   80    for (rank_type r = 0; r < rank_; ++r)
 
   87  constexpr const extents_type& 
extents () const noexcept { 
return extents_; }
 
   92    return size(extents_,strides_);
 
   96  template <
class... Indices,
 
   97    std::enable_if_t<(
sizeof...(Indices) == rank_), 
int> = 0,
 
   98    std::enable_if_t<(std::is_convertible_v<Indices, index_type> && ...), 
int> = 0,
 
   99    std::enable_if_t<(std::is_nothrow_constructible_v<index_type, Indices> && ...), 
int> = 0>
 
  100  constexpr index_type 
operator() (Indices... ii) 
const noexcept 
  103      return ((
static_cast<index_type
>(ii)*strides_[r]) + ... + 0); },
 
  104      std::make_index_sequence<rank_>{});
 
  113  static constexpr bool is_always_unique () noexcept { 
return true; }
 
  114  static constexpr bool is_always_exhaustive () noexcept { 
return false; }
 
  115  static constexpr bool is_always_strided () noexcept { 
return true; }
 
  117  static constexpr bool is_unique () noexcept { 
return true; }
 
  118  static constexpr bool is_strided () noexcept { 
return true; }
 
  120  constexpr bool is_exhaustive () const noexcept
 
  129  constexpr const strides_type& 
strides () const noexcept
 
  135  template <
class E = extents_type,
 
  136    std::enable_if_t<(E::rank() > 0), 
int> = 0>
 
  137  constexpr index_type 
stride (rank_type i) 
const noexcept 
  142  template <
class OtherMapping,
 
  143    std::enable_if_t<(OtherMapping::extents_type::rank() == extents_type::rank()), 
int> = 0,
 
  144    std::enable_if_t<(OtherMapping::is_always_strided()), 
int> = 0>
 
  145  friend constexpr bool operator== (
const mapping& a, 
const OtherMapping& b) 
noexcept 
  149    if constexpr(extents_type::rank() == 0)
 
  151    return a.extents_ == b.extents_ && a.strides_ == b.strides_;
 
  155  template <
class E, 
class S>
 
  156  static constexpr index_type size (
const E& 
extents, 
const S& 
strides) 
noexcept 
  158    if constexpr (E::rank() == 0)
 
  164        index_type result = 1;
 
  165        for (rank_type r = 0; r < E::rank(); ++r)
 
  173  static constexpr size_type offset (
const M& m) 
noexcept 
  175    if constexpr (M::extents_type::rank() == 0)
 
  178      if (m.required_span_size() == 0)
 
  182          return m((r,0)...); }, 
 
  183          std::make_index_sequence<M::extents_type::rank()>{});
 
  189  DUNE_NO_UNIQUE_ADDRESS extents_type extents_;
 
  190  strides_type strides_;
 
Multidimensional index space with dynamic and static extents.
Definition: extents.hh:55
 
constexpr index_type extent(rank_type r) const noexcept
Return the extent of dimension i
Definition: extents.hh:101
 
A layout mapping where the strides are user-defined.
Definition: layout_stride.hh:21
 
constexpr mapping & operator=(const mapping &) noexcept=default
Copy-assignment for the mapping.
 
constexpr mapping() noexcept
The default construction initializes the strides from layout_right.
Definition: layout_stride.hh:38
 
constexpr mapping(const extents_type &e, const std::array< OtherIndexType, rank_ > &s) noexcept
Construct the mapping from given extents and strides.
Definition: layout_stride.hh:49
 
constexpr index_type stride(rank_type i) const noexcept
Get the single stride i
Definition: layout_stride.hh:137
 
constexpr index_type required_span_size() const noexcept
Return the sum 1 + (E(0)-1)*S(0) + (E(1)-1)*S(1) + ...
Definition: layout_stride.hh:90
 
constexpr const strides_type & strides() const noexcept
Get the array of all strides.
Definition: layout_stride.hh:129
 
constexpr mapping(const mapping &) noexcept=default
Copy constructor for the mapping.
 
constexpr index_type operator()() const noexcept
The default offset for rank-0 tensors is 0.
Definition: layout_stride.hh:108
 
constexpr mapping(const extents_type &e, const std::span< OtherIndexType, rank_ > &s) noexcept
Construct the mapping from given extents and strides.
Definition: layout_stride.hh:61
 
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
 
Namespace for features backported from new C++ standards.
Definition: algorithm.hh:19
 
A layout where the rightmost extent has stride 1, and strides increase right-to-left as the product o...
Definition: fwd_layouts.hh:30
 
A layout mapping where the strides are user-defined.
Definition: fwd_layouts.hh:40