4.5 KiB
[linalg.transp.layout.transpose]
29 Numerics library [numerics]
29.9 Basic linear algebra algorithms [linalg]
29.9.10 Transpose in-place transformation [linalg.transp]
29.9.10.3 Class template layout_transpose [linalg.transp.layout.transpose]
layout_transpose is an mdspan layout mapping policy that swaps the two indices, extents, and strides of any mdspan layout mapping policy.
namespace std::linalg {templateclass layout_transpose {public:using nested_layout_type = Layout; templatestruct mapping {private:using nested-mapping-type =typename Layout::template mapping<transpose-extents-t>; // exposition onlypublic: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_transpose; constexpr explicit mapping(const nested-mapping-type&); constexpr const extents_type& extents() const noexcept { return extents_; }constexpr index_type required_span_size() const{ return nested-mapping_.required_span_size(); template<class Index0, class Index1>constexpr index_type operator()(Index0 ind0, Index1 ind1) const{ return nested-mapping_(ind1, ind0); }constexpr const nested-mapping-type& nested_mapping() const noexcept{ return nested-mapping_; }static constexpr bool is_always_unique() noexcept{ return nested-mapping-type::is_always_unique(); }static constexpr bool is_always_exhaustive() noexcept{ return nested-mapping-type::is_always_exhaustive(); }static constexpr bool is_always_strided() noexcept{ return nested-mapping-type::is_always_strided(); }constexpr bool is_unique() const { return nested-mapping_.is_unique(); }constexpr bool is_exhaustive() const { return nested-mapping_.is_exhaustive(); }constexpr bool is_strided() const { return nested-mapping_.is_strided(); }constexpr index_type stride(size_t r) const; templatefriend constexpr bool operator==(const mapping& x, const mapping& y); }; private:nested-mapping-type nested-mapping_; // exposition only extents_type extents_; // exposition only};}
Layout shall meet the layout mapping policy requirements ([mdspan.layout.policy.reqmts]).
Mandates:
Extents is a specialization of std::extents, and
Extents::rank() equals 2.
constexpr explicit mapping(const nested-mapping-type& map);
Effects:
Initializes nested-mapping_ with map, and
initializes extents_ with transpose-extents(map.extents()).
constexpr index_type stride(size_t r) const;
Preconditions:
is_strided() is true, and
r < 2 is true.
Returns: nested-mapping_.stride(r == 0 ? 1 : 0)
template<class OtherExtents> friend constexpr bool operator==(const mapping& x, const mapping<OtherExtents>& y);
Constraints: The expressionx.nested-mapping_ == y.nested-mapping_ is well-formed and its result is convertible to bool.
Returns: x.nested-mapping_ == y.nested-mapping_.