#
layout_
left
provides a layout mapping where the leftmost extent has stride 1, and strides increase left-to-right as the product of extents
.
namespace
std
{
template
<
class
Extents
>
class
layout_left
::
mapping
{
public
:
using
extents_type
=
Extents;
using
index_type
=
extents_type
::
index_type;
using
size_type
=
extents_type
::
size_type;
using
rank_type
=
extents_type
::
rank_type;
using
layout_type
=
layout_left;
/
[mdspan.
layout.
left.
cons]
, constructors
constexpr
mapping
(
)
noexcept
=
default
;
constexpr
mapping
(
const
mapping
&
)
noexcept
=
default
;
constexpr
mapping
(
const
extents_type
&
)
noexcept
;
template
<
class
OtherExtents
>
constexpr
explicit
(
!
is_convertible_v
<
OtherExtents, extents_type
>
)
mapping
(
const
mapping
<
OtherExtents
>
&
)
noexcept
;
template
<
class
OtherExtents
>
constexpr
explicit
(
!
is_convertible_v
<
OtherExtents, extents_type
>
)
mapping
(
const
layout_right
::
mapping
<
OtherExtents
>
&
)
noexcept
;
template
<
class
LayoutLeftPaddedMapping
>
constexpr
explicit
(
!
is_convertible_v
<
typename
LayoutLeftPaddedMapping
::
extents_type, extents_type
>
)
mapping
(
const
LayoutLeftPaddedMapping
&
)
noexcept
;
template
<
class
OtherExtents
>
constexpr
explicit
(
see below
)
mapping
(
const
layout_stride
::
mapping
<
OtherExtents
>
&
)
;
constexpr
mapping
&
operator
=
(
const
mapping
&
)
noexcept
=
default
;
/
[mdspan.
layout.
left.
obs]
, observers
constexpr
const
extents_type
&
extents
(
)
const
noexcept
{
return
extents_
;
}
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
{
return
true
;
}
static
constexpr
bool
is_always_strided
(
)
noexcept
{
return
true
;
}
static
constexpr
bool
is_unique
(
)
noexcept
{
return
true
;
}
static
constexpr
bool
is_exhaustive
(
)
noexcept
{
return
true
;
}
static
constexpr
bool
is_strided
(
)
noexcept
{
return
true
;
}
constexpr
index_type stride
(
rank_type
)
const
noexcept
;
template
<
class
OtherExtents
>
friend
constexpr
bool
operator
=
(
const
mapping
&
,
const
mapping
<
OtherExtents
>
&
)
noexcept
;
private
:
extents_type
extents_
{
}
;
/
exposition only
/
[mdspan.
sub.
map]
,
submdspan
mapping specialization
template
<
class
.
SliceSpecifiers
>
constexpr
auto
submdspan-mapping-impl
(
SliceSpecifiers
.
.
)
const
/
exposition only
-
>
see below
;
template
<
class
.
SliceSpecifiers
>
friend
constexpr
auto
submdspan_mapping
(
const
mapping
&
src, SliceSpecifiers
.
.
slices
)
{
return
src
.
submdspan-mapping-impl
(
slices
.
.
)
;
}
}
;
}
2
#
If
Extents
is not a specialization of
extents
, then the program is ill-formed
.
3
#
layout_
left
::
mapping
<
E
>
is a trivially copyable type that models
regular
for each
E
.
4
#
Mandates
: If
Extents
::
rank_
dynamic
(
)
=
=
0
is
true
, then the size of the multidimensional index space
Extents
(
)
is representable as a value of type
typename
Extents
::
index_
type
.