layout_right_padded provides a layout mapping
that behaves like
layout_right::mapping,
except that the padding stride
stride(extents_type::rank() - 2)
can be greater than or equal to
extents_type::extent(extents_type::rank() - 1). namespace std {
template<size_t PaddingValue>
template<class Extents>
class layout_right_padded<PaddingValue>::mapping {
public:
static constexpr size_t padding_value = PaddingValue;
using extents_type = Extents;
using index_type = typename extents_type::index_type;
using size_type = typename extents_type::size_type;
using rank_type = typename extents_type::rank_type;
using layout_type = layout_right_padded<PaddingValue>;
private:
static constexpr size_t rank_ = extents_type::rank();
static constexpr size_t last-static-extent =
extents_type::static_extent(rank_ - 1);
static constexpr size_t static-padding-stride = see below;
public:
constexpr mapping() noexcept : mapping(extents_type{}) {}
constexpr mapping(const mapping&) noexcept = default;
constexpr mapping(const extents_type&);
template<class OtherIndexType>
constexpr mapping(const extents_type&, OtherIndexType);
template<class OtherExtents>
constexpr explicit(!is_convertible_v<OtherExtents, extents_type>)
mapping(const layout_right::mapping<OtherExtents>&);
template<class OtherExtents>
constexpr explicit(rank_ > 0)
mapping(const layout_stride::mapping<OtherExtents>&);
template<class LayoutRightPaddedMapping>
constexpr explicit(see below)
mapping(const LayoutRightPaddedMapping&);
template<class LayoutLeftPaddedMapping>
constexpr explicit(see below)
mapping(const LayoutLeftPaddedMapping&) noexcept;
constexpr mapping& operator=(const mapping&) noexcept = default;
constexpr const extents_type& extents() const noexcept { return extents_; }
constexpr array<index_type, rank_> strides() const noexcept;
constexpr index_type required_span_size() const noexcept;
template<class... Indices>
constexpr index_type operator()(Indices...) const noexcept;
static constexpr bool is_always_unique() noexcept { return true; }
static constexpr bool is_always_exhaustive() noexcept;
static constexpr bool is_always_strided() noexcept { return true; }
static constexpr bool is_unique() noexcept { return true; }
constexpr bool is_exhaustive() const noexcept;
static constexpr bool is_strided() noexcept { return true; }
constexpr index_type stride(rank_type) const noexcept;
template<class LayoutRightPaddedMapping>
friend constexpr bool operator==(const mapping&, const LayoutRightPaddedMapping&) noexcept;
private:
index_type stride-rm2 = static-padding-stride;
extents_type extents_{};
template<class... SliceSpecifiers>
constexpr auto submdspan-mapping-impl(SliceSpecifiers...) const
-> see below;
template<class... SliceSpecifiers>
friend constexpr auto submdspan_mapping(const mapping& src, SliceSpecifiers... slices) {
return src.submdspan-mapping-impl(slices...);
}
};
}