- mdspan[meta header]
- function[meta id-type]
- std[meta namespace]
- layout_left_padded::mapping[meta class]
- cpp26[meta cpp]
constexpr mapping() noexcept; // (1)
constexpr mapping(const mapping&) noexcept = default; // (2)
constexpr mapping(const extents_type& ext); // (3)
template<class OtherIndexType>
constexpr mapping(const extents_type& ext, OtherIndexType pad); // (4)
template<class OtherExtents>
constexpr explicit(!is_convertible_v<OtherExtents, extents_type>)
mapping(const layout_left::mapping<OtherExtents>& other); // (5)
template<class OtherExtents>
constexpr explicit(extents_type::rank() > 0)
mapping(const layout_stride::mapping<OtherExtents>& other); // (6)
template<class LayoutLeftPaddedMapping>
constexpr explicit(see below)
mapping(const LayoutLeftPaddedMapping& other); // (7)
template<class LayoutRightPaddedMapping>
constexpr explicit(see below)
mapping(const LayoutRightPaddedMapping& other) noexcept; // (8)
- is_convertible_v[link /reference/type_traits/is_convertible.md]
- rank()[link ../../extents/rank.md]
- layout_left::mapping[link ../../layout_left/mapping.md]
- layout_stride::mapping[link ../../layout_stride/mapping.md]
- (4) :
- (5), (6) :
- (7) :
- (8) :
- (5) :
OtherExtents::rank() > 1のとき、(static-padding-stride == dynamic_extent) || (OtherExtents::static_extent(0) == dynamic_extent) || (static-padding-stride == OtherExtents::static_extent(0))がtrueであること。
- (7) :
rank_ > 1のとき、(padding_value == dynamic_extent) || (LayoutLeftPaddedMapping::padding_value == dynamic_extent) || (padding_value == LayoutLeftPaddedMapping::padding_value)がtrueであること。
- (3) :
extの多次元インデクス空間のサイズを、index_type型で表現できること。
rank_ > 1かつpadding_value != dynamic_extentのとき、LEAST-MULTIPLE-AT-LEAST(padding_value, ext.extent(0))をindex_type型で表現できること。
rank_ > 1かつpadding_value != dynamic_extentのとき、半開区間[1, rank_)の全ての値kに対してLEAST-MULTIPLE-AT-LEAST(padding_value, ext.extent(0))と全てのext.extent(k)を乗算した値をindex_type型で表現できること。
- (4) :
padの値をindex_type型で表現できること。
extetns_type::index-cast(pad) > 0
rank_ > 1のとき、LEAST-MULTIPLE-AT-LEAST(pad, ext.extent(0))をindex_type型で表現できること。
rank_ > 1のとき、半開区間[1, rank_)の全ての値kに対してLEAST-MULTIPLE-AT-LEAST(pad, ext.extent(0))と全てのext.extent(k)を乗算した値をindex_type型で表現できること。
padding_value != dynamic_extentのとき、padding_value == extetns_type::index-cast(pad)
- (5) :
- (6) :
rank_ > 1かつpadding_value != dynamic_extentのとき、other.stride(1) == LEAST-MULTIPLE-AT-LEAST(padding_value, extents_type::index-cast(other.extents().extent(0)))
rank_ > 0のとき、other.stride(0) == 1
rank_ > 2のとき、半開区間[2, rank_)の全ての値rに対してother.stride(r) == (other.extents().fwd-prod-of-extents(r) / other.extents().extent(0)) * other.stride(1)
other.required_span_size()を、index_type型で表現できること。
- (7) :
rank_ > 1かつpadding_value != dynamic_extentのとき、other.stride(1) == LEAST-MULTIPLE-AT-LEAST(padding_value, extents_type::index-cast(other.extent(0)))
other.required_span_size()を、index_type型で表現できること。
- (8) :
other.required_span_size()を、index_type型で表現できること。
- (1) :
mapping(extents_type{})と等価。
- (3) :
extを用いてextents_を直接非リスト初期化する。
rank_ > 1のとき、次の値を用いてstride-1を直接非リスト初期化する。
- (4) :
extを用いてextents_を直接非リスト初期化する。
rank_ > 1のとき、LEAST-MULTIPLE-AT-LEAST(pad, ext.extent(0))を用いてstride-1を直接非リスト初期化する。
- (5) :
mapping(other.extents())と等価。
- (6), (7) :
other.extents()を用いてextents_を直接非リスト初期化する。
rank_ > 1のとき、other.stride(1)を用いてstride-1を直接非リスト初期化する。
- (8) :
other.extents()を用いてextents_を直接非リスト初期化する。
#include <cassert>
#include <array>
#include <mdspan>
using Ext3x3 = std::extents<size_t, 3, 3>;
using Ext2D = std::dims<2>;
int main()
{
// (1) : デフォルトコンストラクタ
{
std::layout_left_padded<4>::mapping<Ext3x3> map1s;
std::layout_left_padded<>::mapping<Ext3x3> map1d;
assert(map1s.stride(1) == 4);
assert(map1d.stride(1) == 3);
}
// (2) : コピーコンストラクタ
{
std::layout_left_padded<4>::mapping<Ext3x3> map2_a;
std::layout_left_padded<4>::mapping<Ext3x3> map2_b = map2_a;
assert(map2_a == map2_b);
}
// (3) : extentsから構築
{
Ext2D ext{3, 3};
std::layout_left_padded<>::mapping<Ext2D> map3 = ext;
assert(map3.extents() == ext);
}
// (4) : extentsとパディングから構築
{
Ext2D ext{3, 3};
std::layout_left_padded<>::mapping<Ext2D> map4{ext, 4};
assert(map4.extents() == ext && map4.stride(1) == 4);
}
// (5) : layout_left::mappingからの変換コンストラクタ
{
std::layout_left::mapping src5{Ext3x3{}};
std::layout_left_padded<>::mapping<Ext2D> dst5 = src5;
assert(dst5.stride(1) == 3);
}
// (6) : layout_stride::mappingからの変換コンストラクタ
{
std::array<int, 2> strides{1, 4};
std::layout_stride::mapping src6{Ext3x3{}, strides};
std::layout_left_padded<>::mapping<Ext2D> dst6{src6};
assert(dst6.stride(1) == 4);
}
// (7) : 他layout_left_padded::mappingからの変換コンストラクタ
{
std::layout_left_padded<4>::mapping<Ext3x3> src7;
std::layout_left_padded<>::mapping<Ext2D> dst7{src7};
assert(dst7.extents() == Ext3x3{} && dst7.stride(1) == 4);
}
// (8) : layout_right(_padded)::mappingからの変換コンストラクタ
{
using Ext1D = std::dims<1>;
std::layout_right::mapping<Ext1D> src8{Ext1D{5}};
std::layout_left_padded<>::mapping<Ext1D> dst8{src8};
assert(dst8.extent(0) == 5);
}
}
- std::layout_left_padded<4>::mapping[color ff0000]
- std::layout_left_padded<>::mapping[color ff0000]
- std::layout_left::mapping[link ../../layout_left/mapping.md]
- std::layout_right::mapping[link ../../layout_right/mapping.md]
- std::layout_stride::mapping[link ../../layout_stride/mapping.md]
- std::dims[link ../../extents.md]