622 lines
23 KiB
Markdown
622 lines
23 KiB
Markdown
[mdspan.mdspan]
|
||
|
||
# 23 Containers library [[containers]](./#containers)
|
||
|
||
## 23.7 Views [[views]](views#mdspan.mdspan)
|
||
|
||
### 23.7.3 Multidimensional access [[views.multidim]](views.multidim#mdspan.mdspan)
|
||
|
||
#### 23.7.3.6 Class template mdspan [mdspan.mdspan]
|
||
|
||
#### [23.7.3.6.1](#overview) Overview [[mdspan.mdspan.overview]](mdspan.mdspan.overview)
|
||
|
||
[1](#overview-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24629)
|
||
|
||
mdspan is a view of a multidimensional array of elements[.](#overview-1.sentence-1)
|
||
|
||
namespace std {template<class ElementType, class Extents, class LayoutPolicy = layout_right, class AccessorPolicy = default_accessor<ElementType>>class mdspan {public:using extents_type = Extents; using layout_type = LayoutPolicy; using accessor_type = AccessorPolicy; using mapping_type = typename layout_type::template mapping<extents_type>; using element_type = ElementType; using value_type = remove_cv_t<element_type>; 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 data_handle_type = typename accessor_type::data_handle_type; using reference = typename accessor_type::reference; static constexpr rank_type rank() noexcept { return extents_type::rank(); }static constexpr rank_type rank_dynamic() noexcept { return extents_type::rank_dynamic(); }static constexpr size_t static_extent(rank_type r) noexcept{ return extents_type::static_extent(r); }constexpr index_type extent(rank_type r) const noexcept { return extents().extent(r); }// [[mdspan.mdspan.cons]](#cons "23.7.3.6.2 Constructors"), constructorsconstexpr mdspan(); constexpr mdspan(const mdspan& rhs) = default; constexpr mdspan(mdspan&& rhs) = default; template<class... OtherIndexTypes>constexpr explicit mdspan(data_handle_type ptr, OtherIndexTypes... exts); template<class OtherIndexType, size_t N>constexpr explicit(N != rank_dynamic()) mdspan(data_handle_type p, span<OtherIndexType, N> exts); template<class OtherIndexType, size_t N>constexpr explicit(N != rank_dynamic()) mdspan(data_handle_type p, const array<OtherIndexType, N>& exts); constexpr mdspan(data_handle_type p, const extents_type& ext); constexpr mdspan(data_handle_type p, const mapping_type& m); constexpr mdspan(data_handle_type p, const mapping_type& m, const accessor_type& a); template<class OtherElementType, class OtherExtents, class OtherLayoutPolicy, class OtherAccessorPolicy>constexpr explicit(*see below*) mdspan(const mdspan<OtherElementType, OtherExtents,
|
||
OtherLayoutPolicy, OtherAccessorPolicy>& other); constexpr mdspan& operator=(const mdspan& rhs) = default; constexpr mdspan& operator=(mdspan&& rhs) = default; // [[mdspan.mdspan.members]](#members "23.7.3.6.3 Members"), memberstemplate<class... OtherIndexTypes>constexpr reference operator[](OtherIndexTypes... indices) const; template<class OtherIndexType>constexpr reference operator[](span<OtherIndexType, rank()> indices) const; template<class OtherIndexType>constexpr reference operator[](const array<OtherIndexType, rank()>& indices) const; template<class... OtherIndexTypes>constexpr reference
|
||
at(OtherIndexTypes... indices) const; // freestanding-deletedtemplate<class OtherIndexType>constexpr reference
|
||
at(span<OtherIndexType, rank()> indices) const; // freestanding-deletedtemplate<class OtherIndexType>constexpr reference
|
||
at(const array<OtherIndexType, rank()>& indices) const; // freestanding-deletedconstexpr size_type size() const noexcept; constexpr bool empty() const noexcept; friend constexpr void swap(mdspan& x, mdspan& y) noexcept; constexpr const extents_type& extents() const noexcept { return *map_*.extents(); }constexpr const data_handle_type& data_handle() const noexcept { return *ptr_*; }constexpr const mapping_type& mapping() const noexcept { return *map_*; }constexpr const accessor_type& accessor() const noexcept { return *acc_*; }static constexpr bool is_always_unique(){ return mapping_type::is_always_unique(); }static constexpr bool is_always_exhaustive(){ return mapping_type::is_always_exhaustive(); }static constexpr bool is_always_strided(){ return mapping_type::is_always_strided(); }constexpr bool is_unique() const{ return *map_*.is_unique(); }constexpr bool is_exhaustive() const{ return *map_*.is_exhaustive(); }constexpr bool is_strided() const{ return *map_*.is_strided(); }constexpr index_type stride(rank_type r) const{ return *map_*.stride(r); }private: accessor_type *acc_*; // *exposition only* mapping_type *map_*; // *exposition only* data_handle_type *ptr_*; // *exposition only*}; template<class CArray>requires (is_array_v<CArray> && rank_v<CArray> == 1) mdspan(CArray&)-> mdspan<remove_all_extents_t<CArray>, extents<size_t, extent_v<CArray, 0>>>; template<class Pointer>requires (is_pointer_v<remove_reference_t<Pointer>>) mdspan(Pointer&&)-> mdspan<remove_pointer_t<remove_reference_t<Pointer>>, extents<size_t>>; template<class ElementType, class... Integrals>requires ((is_convertible_v<Integrals, size_t> && ...) && sizeof...(Integrals) > 0)explicit mdspan(ElementType*, Integrals...)-> mdspan<ElementType, extents<size_t, [*maybe-static-ext*](span.syn#concept:maybe-static-ext "23.7.2.1 Header <span> synopsis [span.syn]")<Integrals>...>>; template<class ElementType, class OtherIndexType, size_t N> mdspan(ElementType*, span<OtherIndexType, N>)-> mdspan<ElementType, dextents<size_t, N>>; template<class ElementType, class OtherIndexType, size_t N> mdspan(ElementType*, const array<OtherIndexType, N>&)-> mdspan<ElementType, dextents<size_t, N>>; template<class ElementType, class IndexType, size_t... ExtentsPack> mdspan(ElementType*, const extents<IndexType, ExtentsPack...>&)-> mdspan<ElementType, extents<IndexType, ExtentsPack...>>; template<class ElementType, class MappingType> mdspan(ElementType*, const MappingType&)-> mdspan<ElementType, typename MappingType::extents_type, typename MappingType::layout_type>; template<class MappingType, class AccessorType> mdspan(const typename AccessorType::data_handle_type&, const MappingType&, const AccessorType&)-> mdspan<typename AccessorType::element_type, typename MappingType::extents_type, typename MappingType::layout_type, AccessorType>;}
|
||
|
||
[2](#overview-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24772)
|
||
|
||
*Mandates*:
|
||
|
||
- [(2.1)](#overview-2.1)
|
||
|
||
ElementType is a complete object type
|
||
that is neither an abstract class type nor an array type,
|
||
|
||
- [(2.2)](#overview-2.2)
|
||
|
||
Extents is a specialization of extents, and
|
||
|
||
- [(2.3)](#overview-2.3)
|
||
|
||
is_same_v<ElementType, typename AccessorPolicy::element_type> is true[.](#overview-2.sentence-1)
|
||
|
||
[3](#overview-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24785)
|
||
|
||
LayoutPolicy shall meet
|
||
the layout mapping policy requirements ([[mdspan.layout.policy.reqmts]](mdspan.layout.policy.reqmts "23.7.3.4.3 Layout mapping policy requirements")), andAccessorPolicy shall meet
|
||
the accessor policy requirements ([[mdspan.accessor.reqmts]](mdspan.accessor.reqmts "23.7.3.5.2 Requirements"))[.](#overview-3.sentence-1)
|
||
|
||
[4](#overview-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24791)
|
||
|
||
Each specialization MDS of mdspan models [copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]") and
|
||
|
||
- [(4.1)](#overview-4.1)
|
||
|
||
is_nothrow_move_constructible_v<MDS> is true,
|
||
|
||
- [(4.2)](#overview-4.2)
|
||
|
||
is_nothrow_move_assignable_v<MDS> is true, and
|
||
|
||
- [(4.3)](#overview-4.3)
|
||
|
||
is_nothrow_swappable_v<MDS> is true[.](#overview-4.sentence-1)
|
||
|
||
[5](#overview-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24802)
|
||
|
||
A specialization of mdspan is a trivially copyable type if
|
||
its accessor_type, mapping_type, and data_handle_type are trivially copyable types[.](#overview-5.sentence-1)
|
||
|
||
#### [23.7.3.6.2](#cons) Constructors [[mdspan.mdspan.cons]](mdspan.mdspan.cons)
|
||
|
||
[ð](#lib:mdspan,constructor)
|
||
|
||
`constexpr mdspan();
|
||
`
|
||
|
||
[1](#cons-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24815)
|
||
|
||
*Constraints*:
|
||
|
||
- [(1.1)](#cons-1.1)
|
||
|
||
rank_dynamic() > 0 is true[.](#cons-1.1.sentence-1)
|
||
|
||
- [(1.2)](#cons-1.2)
|
||
|
||
is_default_constructible_v<data_handle_type> is true[.](#cons-1.2.sentence-1)
|
||
|
||
- [(1.3)](#cons-1.3)
|
||
|
||
is_default_constructible_v<mapping_type> is true[.](#cons-1.3.sentence-1)
|
||
|
||
- [(1.4)](#cons-1.4)
|
||
|
||
is_default_constructible_v<accessor_type> is true[.](#cons-1.4.sentence-1)
|
||
|
||
[2](#cons-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24828)
|
||
|
||
*Preconditions*: [0, *map_*.required_span_size()) is
|
||
an accessible range of *ptr_* and *acc_* for the values of *map_* and *acc_* after the invocation of this constructor[.](#cons-2.sentence-1)
|
||
|
||
[3](#cons-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24835)
|
||
|
||
*Effects*: Value-initializes *ptr_*, *map_*, and *acc_*[.](#cons-3.sentence-1)
|
||
|
||
[ð](#lib:mdspan,constructor_)
|
||
|
||
`template<class... OtherIndexTypes>
|
||
constexpr explicit mdspan(data_handle_type p, OtherIndexTypes... exts);
|
||
`
|
||
|
||
[4](#cons-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24847)
|
||
|
||
Let N be sizeof...(OtherIndexTypes)[.](#cons-4.sentence-1)
|
||
|
||
[5](#cons-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24850)
|
||
|
||
*Constraints*:
|
||
|
||
- [(5.1)](#cons-5.1)
|
||
|
||
(is_convertible_v<OtherIndexTypes, index_type> && ...) is true,
|
||
|
||
- [(5.2)](#cons-5.2)
|
||
|
||
(is_nothrow_constructible<index_type, OtherIndexTypes> && ...) is true,
|
||
|
||
- [(5.3)](#cons-5.3)
|
||
|
||
N == rank() || N == rank_dynamic() is true,
|
||
|
||
- [(5.4)](#cons-5.4)
|
||
|
||
is_constructible_v<mapping_type, extents_type> is true, and
|
||
|
||
- [(5.5)](#cons-5.5)
|
||
|
||
is_default_constructible_v<accessor_type> is true[.](#cons-5.sentence-1)
|
||
|
||
[6](#cons-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24865)
|
||
|
||
*Preconditions*: [0, *map_*.required_span_size()) is
|
||
an accessible range of p and *acc_* for the values of *map_* and *acc_* after the invocation of this constructor[.](#cons-6.sentence-1)
|
||
|
||
[7](#cons-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24872)
|
||
|
||
*Effects*:
|
||
|
||
- [(7.1)](#cons-7.1)
|
||
|
||
Direct-non-list-initializes *ptr_* with std::move(p),
|
||
|
||
- [(7.2)](#cons-7.2)
|
||
|
||
direct-non-list-initializes *map_* withextents_type(static_cast<index_type>(std::move(exts))...), and
|
||
|
||
- [(7.3)](#cons-7.3)
|
||
|
||
value-initializes *acc_*[.](#cons-7.sentence-1)
|
||
|
||
[ð](#lib:mdspan,constructor__)
|
||
|
||
`template<class OtherIndexType, size_t N>
|
||
constexpr explicit(N != rank_dynamic())
|
||
mdspan(data_handle_type p, span<OtherIndexType, N> exts);
|
||
template<class OtherIndexType, size_t N>
|
||
constexpr explicit(N != rank_dynamic())
|
||
mdspan(data_handle_type p, const array<OtherIndexType, N>& exts);
|
||
`
|
||
|
||
[8](#cons-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24896)
|
||
|
||
*Constraints*:
|
||
|
||
- [(8.1)](#cons-8.1)
|
||
|
||
is_convertible_v<const OtherIndexType&, index_type> is true,
|
||
|
||
- [(8.2)](#cons-8.2)
|
||
|
||
is_nothrow_constructible_v<index_type, const OtherIndexType&> is true,
|
||
|
||
- [(8.3)](#cons-8.3)
|
||
|
||
N == rank() || N == rank_dynamic() is true,
|
||
|
||
- [(8.4)](#cons-8.4)
|
||
|
||
is_constructible_v<mapping_type, extents_type> is true, and
|
||
|
||
- [(8.5)](#cons-8.5)
|
||
|
||
is_default_constructible_v<accessor_type> is true[.](#cons-8.sentence-1)
|
||
|
||
[9](#cons-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24911)
|
||
|
||
*Preconditions*: [0, *map_*.required_span_size()) is
|
||
an accessible range of p and *acc_* for the values of *map_* and *acc_* after the invocation of this constructor[.](#cons-9.sentence-1)
|
||
|
||
[10](#cons-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24918)
|
||
|
||
*Effects*:
|
||
|
||
- [(10.1)](#cons-10.1)
|
||
|
||
Direct-non-list-initializes *ptr_* with std::move(p),
|
||
|
||
- [(10.2)](#cons-10.2)
|
||
|
||
direct-non-list-initializes *map_* with extents_type(exts), and
|
||
|
||
- [(10.3)](#cons-10.3)
|
||
|
||
value-initializes *acc_*[.](#cons-10.sentence-1)
|
||
|
||
[ð](#lib:mdspan,constructor___)
|
||
|
||
`constexpr mdspan(data_handle_type p, const extents_type& ext);
|
||
`
|
||
|
||
[11](#cons-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24936)
|
||
|
||
*Constraints*:
|
||
|
||
- [(11.1)](#cons-11.1)
|
||
|
||
is_constructible_v<mapping_type, const extents_type&> is true, and
|
||
|
||
- [(11.2)](#cons-11.2)
|
||
|
||
is_default_constructible_v<accessor_type> is true[.](#cons-11.sentence-1)
|
||
|
||
[12](#cons-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24945)
|
||
|
||
*Preconditions*: [0, *map_*.required_span_size()) is
|
||
an accessible range of p and *acc_* for the values of *map_* and *acc_* after the invocation of this constructor[.](#cons-12.sentence-1)
|
||
|
||
[13](#cons-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24952)
|
||
|
||
*Effects*:
|
||
|
||
- [(13.1)](#cons-13.1)
|
||
|
||
Direct-non-list-initializes *ptr_* with std::move(p),
|
||
|
||
- [(13.2)](#cons-13.2)
|
||
|
||
direct-non-list-initializes *map_* with ext, and
|
||
|
||
- [(13.3)](#cons-13.3)
|
||
|
||
value-initializes *acc_*[.](#cons-13.sentence-1)
|
||
|
||
[ð](#lib:mdspan,constructor____)
|
||
|
||
`constexpr mdspan(data_handle_type p, const mapping_type& m);
|
||
`
|
||
|
||
[14](#cons-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24970)
|
||
|
||
*Constraints*: is_default_constructible_v<accessor_type> is true[.](#cons-14.sentence-1)
|
||
|
||
[15](#cons-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24974)
|
||
|
||
*Preconditions*: [0, m.required_span_size()) is
|
||
an accessible range of p and *acc_* for the value of *acc_* after the invocation of this constructor[.](#cons-15.sentence-1)
|
||
|
||
[16](#cons-16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24980)
|
||
|
||
*Effects*:
|
||
|
||
- [(16.1)](#cons-16.1)
|
||
|
||
Direct-non-list-initializes *ptr_* with std::move(p),
|
||
|
||
- [(16.2)](#cons-16.2)
|
||
|
||
direct-non-list-initializes *map_* with m, and
|
||
|
||
- [(16.3)](#cons-16.3)
|
||
|
||
value-initializes *acc_*[.](#cons-16.sentence-1)
|
||
|
||
[ð](#lib:mdspan,constructor_____)
|
||
|
||
`constexpr mdspan(data_handle_type p, const mapping_type& m, const accessor_type& a);
|
||
`
|
||
|
||
[17](#cons-17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L24998)
|
||
|
||
*Preconditions*: [0, m.required_span_size()) is
|
||
an accessible range of p and a[.](#cons-17.sentence-1)
|
||
|
||
[18](#cons-18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25003)
|
||
|
||
*Effects*:
|
||
|
||
- [(18.1)](#cons-18.1)
|
||
|
||
Direct-non-list-initializes *ptr_* with std::move(p),
|
||
|
||
- [(18.2)](#cons-18.2)
|
||
|
||
direct-non-list-initializes *map_* with m, and
|
||
|
||
- [(18.3)](#cons-18.3)
|
||
|
||
direct-non-list-initializes *acc_* with a[.](#cons-18.sentence-1)
|
||
|
||
[ð](#lib:mdspan,constructor______)
|
||
|
||
`template<class OtherElementType, class OtherExtents,
|
||
class OtherLayoutPolicy, class OtherAccessor>
|
||
constexpr explicit(see below)
|
||
mdspan(const mdspan<OtherElementType, OtherExtents,
|
||
OtherLayoutPolicy, OtherAccessor>& other);
|
||
`
|
||
|
||
[19](#cons-19)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25025)
|
||
|
||
*Constraints*:
|
||
|
||
- [(19.1)](#cons-19.1)
|
||
|
||
is_constructible_v<mapping_type, const OtherLayoutPolicy::template mapping<Oth-
|
||
erExtents>&> is true, and
|
||
|
||
- [(19.2)](#cons-19.2)
|
||
|
||
is_constructible_v<accessor_type, const OtherAccessor&> is true[.](#cons-19.sentence-1)
|
||
|
||
[20](#cons-20)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25035)
|
||
|
||
*Mandates*:
|
||
|
||
- [(20.1)](#cons-20.1)
|
||
|
||
is_constructible_v<data_handle_type, const OtherAccessor::data_handle_type&> is
|
||
true, and
|
||
|
||
- [(20.2)](#cons-20.2)
|
||
|
||
is_constructible_v<extents_type, OtherExtents> is true[.](#cons-20.sentence-1)
|
||
|
||
[21](#cons-21)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25044)
|
||
|
||
*Preconditions*: [0, *map_*.required_span_size()) is
|
||
an accessible range of *ptr_* and *acc_* for values of *ptr_*, *map_*, and *acc_* after the invocation of this constructor[.](#cons-21.sentence-1)
|
||
|
||
[22](#cons-22)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25051)
|
||
|
||
*Hardened preconditions*: For each rank index r of extents_type,static_extent(r) == dynamic_extent || static_extent(r) == other.extent(r) is true[.](#cons-22.sentence-1)
|
||
|
||
[23](#cons-23)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25057)
|
||
|
||
*Effects*:
|
||
|
||
- [(23.1)](#cons-23.1)
|
||
|
||
Direct-non-list-initializes *ptr_* with other.*ptr_*,
|
||
|
||
- [(23.2)](#cons-23.2)
|
||
|
||
direct-non-list-initializes *map_* with other.*map_*, and
|
||
|
||
- [(23.3)](#cons-23.3)
|
||
|
||
direct-non-list-initializes *acc_* with other.*acc_*[.](#cons-23.sentence-1)
|
||
|
||
[24](#cons-24)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25068)
|
||
|
||
*Remarks*: The expression inside explicit is equivalent to:!is_convertible_v<const OtherLayoutPolicy::template mapping<OtherExtents>&, mapping_type>|| !is_convertible_v<const OtherAccessor&, accessor_type>
|
||
|
||
#### [23.7.3.6.3](#members) Members [[mdspan.mdspan.members]](mdspan.mdspan.members)
|
||
|
||
[ð](#lib:operator%5b%5d,mdspan)
|
||
|
||
`template<class... OtherIndexTypes>
|
||
constexpr reference operator[](OtherIndexTypes... indices) const;
|
||
`
|
||
|
||
[1](#members-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25086)
|
||
|
||
*Constraints*:
|
||
|
||
- [(1.1)](#members-1.1)
|
||
|
||
(is_convertible_v<OtherIndexTypes, index_type> && ...) is true,
|
||
|
||
- [(1.2)](#members-1.2)
|
||
|
||
(is_nothrow_constructible_v<index_type, OtherIndexTypes> && ...) is true, and
|
||
|
||
- [(1.3)](#members-1.3)
|
||
|
||
sizeof...(OtherIndexTypes) == rank() is true[.](#members-1.sentence-1)
|
||
|
||
[2](#members-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25097)
|
||
|
||
Let I be extents_type::*index-cast*(std::move(indices))[.](#members-2.sentence-1)
|
||
|
||
[3](#members-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25100)
|
||
|
||
*Hardened preconditions*: I is a multidimensional index in extents()[.](#members-3.sentence-1)
|
||
|
||
[*Note [1](#members-note-1)*:
|
||
|
||
This implies that*map_*(I) < *map_*.required_span_size() is true[.](#members-3.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
[4](#members-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25109)
|
||
|
||
*Effects*: Equivalent to:return *acc_*.access(*ptr_*, *map_*(static_cast<index_type>(std::move(indices))...));
|
||
|
||
[ð](#lib:operator%5b%5d,mdspan_)
|
||
|
||
`template<class OtherIndexType>
|
||
constexpr reference operator[](span<OtherIndexType, rank()> indices) const;
|
||
template<class OtherIndexType>
|
||
constexpr reference operator[](const array<OtherIndexType, rank()>& indices) const;
|
||
`
|
||
|
||
[5](#members-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25126)
|
||
|
||
*Constraints*:
|
||
|
||
- [(5.1)](#members-5.1)
|
||
|
||
is_convertible_v<const OtherIndexType&, index_type> is true, and
|
||
|
||
- [(5.2)](#members-5.2)
|
||
|
||
is_nothrow_constructible_v<index_type, const OtherIndexType&> is true[.](#members-5.sentence-1)
|
||
|
||
[6](#members-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25135)
|
||
|
||
*Effects*: Let P be a parameter pack such thatis_same_v<make_index_sequence<rank()>, index_sequence<P...>> is true[.](#members-6.sentence-1)
|
||
|
||
Equivalent to:return operator[](extents_type::*index-cast*(as_const(indices[P]))...);
|
||
|
||
[ð](#lib:at,mdspan)
|
||
|
||
`template<class... OtherIndexTypes>
|
||
constexpr reference at(OtherIndexTypes... indices) const;
|
||
`
|
||
|
||
[7](#members-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25155)
|
||
|
||
*Constraints*:
|
||
|
||
- [(7.1)](#members-7.1)
|
||
|
||
(is_convertible_v<OtherIndexTypes, index_type> && ...) is true,
|
||
|
||
- [(7.2)](#members-7.2)
|
||
|
||
(is_nothrow_constructible_v<index_type, OtherIndexTypes> && ...) is true, and
|
||
|
||
- [(7.3)](#members-7.3)
|
||
|
||
sizeof...(OtherIndexTypes) == rank() is true[.](#members-7.sentence-1)
|
||
|
||
[8](#members-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25166)
|
||
|
||
Let I be extents_type::*index-cast*(std::move(indices))[.](#members-8.sentence-1)
|
||
|
||
[9](#members-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25169)
|
||
|
||
*Returns*: (*this)[I...][.](#members-9.sentence-1)
|
||
|
||
[10](#members-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25173)
|
||
|
||
*Throws*: out_of_range if I is not a multidimensional index in extents()[.](#members-10.sentence-1)
|
||
|
||
[ð](#lib:at,mdspan_)
|
||
|
||
`template<class OtherIndexType>
|
||
constexpr reference at(span<OtherIndexType, rank()> indices) const;
|
||
template<class OtherIndexType>
|
||
constexpr reference at(const array<OtherIndexType, rank()>& indices) const;
|
||
`
|
||
|
||
[11](#members-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25187)
|
||
|
||
*Constraints*:
|
||
|
||
- [(11.1)](#members-11.1)
|
||
|
||
is_convertible_v<const OtherIndexType&, index_type> is true, and
|
||
|
||
- [(11.2)](#members-11.2)
|
||
|
||
is_nothrow_constructible_v<index_type, const OtherIndexType&> is true[.](#members-11.sentence-1)
|
||
|
||
[12](#members-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25196)
|
||
|
||
*Effects*: Let P be a parameter pack such thatis_same_v<make_index_sequence<rank()>, index_sequence<P...>> is true[.](#members-12.sentence-1)
|
||
|
||
Equivalent to:return at(extents_type::*index-cast*(as_const(indices[P]))...);
|
||
|
||
[ð](#lib:size,mdspan)
|
||
|
||
`constexpr size_type size() const noexcept;
|
||
`
|
||
|
||
[13](#members-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25215)
|
||
|
||
*Preconditions*: The size of the multidimensional index space extents() is representable as a value of type size_type ([[basic.fundamental]](basic.fundamental "6.9.2 Fundamental types"))[.](#members-13.sentence-1)
|
||
|
||
[14](#members-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25220)
|
||
|
||
*Returns*: extents().*fwd-prod-of-extents*(rank())[.](#members-14.sentence-1)
|
||
|
||
[ð](#lib:empty,mdspan)
|
||
|
||
`constexpr bool empty() const noexcept;
|
||
`
|
||
|
||
[15](#members-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25231)
|
||
|
||
*Returns*: true if the size of the multidimensional index space extents() is 0,
|
||
otherwise false[.](#members-15.sentence-1)
|
||
|
||
[ð](#lib:swap,mdspan)
|
||
|
||
`friend constexpr void swap(mdspan& x, mdspan& y) noexcept;
|
||
`
|
||
|
||
[16](#members-16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L25244)
|
||
|
||
*Effects*: Equivalent to:swap(x.*ptr_*, y.*ptr_*);
|
||
swap(x.*map_*, y.*map_*);
|
||
swap(x.*acc_*, y.*acc_*);
|