Files
2025-10-25 03:02:53 +03:00

353 lines
9.2 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[mdspan.layout.reqmts]
# 23 Containers library [[containers]](./#containers)
## 23.7 Views [[views]](views#mdspan.layout.reqmts)
### 23.7.3 Multidimensional access [[views.multidim]](views.multidim#mdspan.layout.reqmts)
#### 23.7.3.4 Layout mapping [[mdspan.layout]](mdspan.layout#reqmts)
#### 23.7.3.4.2 Requirements [mdspan.layout.reqmts]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21594)
A type M meets the [*layout mapping*](#def:layout_mapping "23.7.3.4.2Requirements[mdspan.layout.reqmts]") requirements if
- [(1.1)](#1.1)
M models [copyable](concepts.object#concept:copyable "18.6Object concepts[concepts.object]") and [equality_comparable](concept.equalitycomparable#concept:equality_comparable "18.5.4Concept equality_­comparable[concept.equalitycomparable]"),
- [(1.2)](#1.2)
is_nothrow_move_constructible_v<M> is true,
- [(1.3)](#1.3)
is_nothrow_move_assignable_v<M> is true,
- [(1.4)](#1.4)
is_nothrow_swappable_v<M> is true, and
- [(1.5)](#1.5)
the following types and expressions are well-formed and
have the specified semantics.
[🔗](#itemdecl:1)
`typename M::extents_type
`
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21616)
*Result*: A type that is a specialization of extents[.](#2.sentence-1)
[🔗](#itemdecl:2)
`typename M::index_type
`
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21626)
*Result*: typename M::extents_type::index_type[.](#3.sentence-1)
[🔗](#itemdecl:3)
`typename M::rank_type
`
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21636)
*Result*: typename M::extents_type::rank_type[.](#4.sentence-1)
[🔗](#itemdecl:4)
`typename M::layout_type
`
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21646)
*Result*: A type MP that meets
the layout mapping policy requirements ([[mdspan.layout.policy.reqmts]](mdspan.layout.policy.reqmts "23.7.3.4.3Layout mapping policy requirements")) and
for which *is-mapping-of*<MP, M> is true[.](#5.sentence-1)
[🔗](#itemdecl:5)
`m.extents()
`
[6](#6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21658)
*Result*: const typename M::extents_type&
[🔗](#itemdecl:6)
`m(i...)
`
[7](#7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21668)
*Result*: typename M::index_type
[8](#8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21672)
*Returns*: A nonnegative integer
less than numeric_limits<typename M::index_type>::max() and
less than or equal to numeric_limits<size_t>::max()[.](#8.sentence-1)
[🔗](#itemdecl:7)
`m(i...) == m(static_cast<typename M::index_type>(i)...)
`
[9](#9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21684)
*Result*: bool
[10](#10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21688)
*Returns*: true
[🔗](#itemdecl:8)
`m.required_span_size()
`
[11](#11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21698)
*Result*: typename M::index_type
[12](#12)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21702)
*Returns*: If the size of the multidimensional index space m.extents() is 0,
then 0,
else 1 plus the maximum value of m(i...) for all i[.](#12.sentence-1)
[🔗](#itemdecl:9)
`m.is_unique()
`
[13](#13)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21714)
*Result*: bool
[14](#14)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21718)
*Returns*: true only if
for every i and j where (i != j || ...) is true,m(i...) != m(j...) is true[.](#14.sentence-1)
[*Note [1](#note-1)*:
A mapping can return false even if the condition is met[.](#14.sentence-2)
For certain layouts, it is possibly not feasible to determine efficiently
whether the layout is unique[.](#14.sentence-3)
— *end note*]
[🔗](#itemdecl:10)
`m.is_exhaustive()
`
[15](#15)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21735)
*Result*: bool
[16](#16)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21739)
*Returns*: true only if
for all k in the range [0, m.required_span_size()) there exists an i such that m(i...) equals k[.](#16.sentence-1)
[*Note [2](#note-2)*:
A mapping can return false even if the condition is met[.](#16.sentence-2)
For certain layouts, it is possibly not feasible to determine efficiently
whether the layout is exhaustive[.](#16.sentence-3)
— *end note*]
[🔗](#itemdecl:11)
`m.is_strided()
`
[17](#17)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21756)
*Result*: bool
[18](#18)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21760)
*Returns*: true only if
for every rank index r of m.extents() there exists an integer sr such that,
for all i where (i+dr) is
a multidimensional index in m.extents() ([[mdspan.overview]](mdspan.overview "23.7.3.1Overview")),m((i + dr)...) - m(i...) equals sr[.](#18.sentence-1)
[*Note [3](#note-3)*:
This implies that for a strided layoutm(i0,…,ik)=m(0,…,0)+i0×s0+⋯+ik×sk[.](#18.sentence-2)
— *end note*]
[*Note [4](#note-4)*:
A mapping can return false even if the condition is met[.](#18.sentence-3)
For certain layouts, it is possibly not feasible to determine efficiently
whether the layout is strided[.](#18.sentence-4)
— *end note*]
[🔗](#itemdecl:12)
`m.stride(r)
`
[19](#19)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21784)
*Preconditions*: m.is_strided() is true[.](#19.sentence-1)
[20](#20)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21788)
*Result*: typename M::index_type
[21](#21)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21792)
*Returns*: sr as defined in m.is_strided() above[.](#21.sentence-1)
[22](#22)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21796)
[*Note [5](#note-5)*:
It is not required for m.stride(r) to be well-formed
if m.extents().rank() is zero,
even if m.is_always_strided() is true[.](#22.sentence-1)
— *end note*]
[🔗](#itemdecl:13)
`M::is_always_unique()
`
[23](#23)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21809)
*Result*: A constant expression ([[expr.const]](expr.const "7.7Constant expressions")) of type bool[.](#23.sentence-1)
[24](#24)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21813)
*Returns*: true only if m.is_unique() is true for all possible objects m of type M[.](#24.sentence-1)
[*Note [6](#note-6)*:
A mapping can return false even if the above condition is met[.](#24.sentence-2)
For certain layout mappings, it is possibly not feasible to determine
whether every instance is unique[.](#24.sentence-3)
— *end note*]
[🔗](#itemdecl:14)
`M::is_always_exhaustive()
`
[25](#25)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21829)
*Result*: A constant expression ([[expr.const]](expr.const "7.7Constant expressions")) of type bool[.](#25.sentence-1)
[26](#26)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21833)
*Returns*: true only if m.is_exhaustive() is true for all possible objects m of type M[.](#26.sentence-1)
[*Note [7](#note-7)*:
A mapping can return false even if the above condition is met[.](#26.sentence-2)
For certain layout mappings, it is possibly not feasible to determine
whether every instance is exhaustive[.](#26.sentence-3)
— *end note*]
[🔗](#itemdecl:15)
`M::is_always_strided()
`
[27](#27)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21849)
*Result*: A constant expression ([[expr.const]](expr.const "7.7Constant expressions")) of type bool[.](#27.sentence-1)
[28](#28)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21853)
*Returns*: true only if m.is_strided() is true for all possible objects m of type M[.](#28.sentence-1)
[*Note [8](#note-8)*:
A mapping can return false even if the above condition is met[.](#28.sentence-2)
For certain layout mappings, it is possibly not feasible to determine
whether every instance is strided[.](#28.sentence-3)
— *end note*]