Files
cppdraft_translate/cppdraft/linalg/transp/layout/transpose.md
2025-10-25 03:02:53 +03:00

4.5 KiB
Raw Blame History

[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]

1

#

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};}

2

#

Layout shall meet the layout mapping policy requirements ([mdspan.layout.policy.reqmts]).

3

#

Mandates:

Extents is a specialization of std::extents, and

Extents::rank() equals 2.

🔗

constexpr explicit mapping(const nested-mapping-type& map);

4

#

Effects:

Initializes nested-mapping_ with map, and

initializes extents_ with transpose-extents(map.extents()).

🔗

constexpr index_type stride(size_t r) const;

5

#

Preconditions:

is_strided() is true, and

r < 2 is true.

6

#

Returns: nested-mapping_.stride(r == 0 ? 1 : 0)

🔗

template<class OtherExtents> friend constexpr bool operator==(const mapping& x, const mapping<OtherExtents>& y);

7

#

Constraints: The expressionx.nested-mapping_ == y.nested-mapping_ is well-formed and its result is convertible to bool.

8

#

Returns: x.nested-mapping_ == y.nested-mapping_.