constexpr mapping() noexcept = default; // (1)
constexpr mapping(const mapping&) noexcept = default; // (2)
constexpr mapping(const extents_type& e) noexcept; // (3)
template<class OtherExtents>
constexpr explicit(!is_convertible_v<OtherExtents, extents_type>)
mapping(const mapping<OtherExtents>& other) noexcept; // (4)
template<class OtherExtents>
constexpr explicit(!is_convertible_v<OtherExtents, extents_type>)
mapping(const layout_left::mapping<OtherExtents>& other) noexcept; // (5)
template<class LayoutRightPaddedMapping>
constexpr explicit(!is_convertible_v<typename LayoutRightPaddedMapping::extents_type, extents_type>)
mapping(const LayoutRightPaddedMapping& other) noexcept; // (7) C++26
template<class OtherExtents>
constexpr explicit(extents_type::rank() > 0)
mapping(const layout_stride::mapping<OtherExtents>& other) noexcept; // (6)
概要
- (1) : デフォルトコンストラクタ
- (2) : コピーコンストラクタ
- (3) :
extents
から構築 - (4) : 他
layout_right::mapping
からの変換コンストラクタ - (5) :
layout_left::mapping
からの変換コンストラクタ - (6) :
layout_stride::mapping
からの変換コンストラクタ - (7) :
layout_right_padded<S>::mapping
からの変換コンストラクタ
テンプレートパラメータ制約
- (4) :
is_constructible_v<extents_type, OtherExtents>
がtrue
であること。 - (5) :
extents_type::rank() <= 1
、かつis_constructible_v<extents_type, OtherExtents>
がtrue
であること。
- (6) :
is_constructible_v<extents_type, OtherExtents>
がtrue
であること。 - (7) :
is-layout-right-padded-mapping-of<LayoutRightPaddedMapping>
がtrue
、かつis_constructible_v<extents_type, typename LayoutRightPaddedMapping::extents_type>
がtrue
であること。
適格要件
- (7) : 以下を満たすとき、
extents_type::static_extent(Extents::rank() - 1)
がLayoutRightPaddedMapping::static-padding-stride
に等しいこと。extents_type::rank() > 1
、かつextents_type::static_extent(Extents::rank() - 1) != dynamic_extent
、かつLayoutRightPaddedMapping::static-padding-stride
がdynamic_extent
と等しくないとき。
事前条件
- (3) :
e
の多次元インデクス空間のサイズを、index_type
型で表現できること。 - (4) :
other.required_span_size()
を、index_type
型で表現できること。 - (5) :
other.required_span_size()
を、index_type
型で表現できること。 - (6) :
extents_type::rank() > 0
のとき、other
における全次元のストライド幅がlayout_right::mapping
相当の制約をもつこと。other.required_span_size()
を、index_type
型で表現できること。
- (7) :
extents_type::rank() > 1
のとき、other.stride(extents_type::rank() - 2) == other.extents().extent(extents_type::rank() - 1)
other.required_span_size()
を、index_type
型で表現できること。
効果
例外
投げない
explicitになる条件
- (4), (5) :
!is_convertible_v<OtherExtents, extents_type>
- (6) :
extents_type::rank() > 0
- (7) :
!is_convertible_v<typename LayoutRightPaddedMapping::extents_type, extents_type>
例
#include <cassert>
#include <array>
#include <mdspan>
using Ext3x4 = std::extents<size_t, 3, 4>;
using Ext3xN = std::extents<size_t, 3, std::dynamic_extent>;
int main()
{
// (1) : デフォルトコンストラクタ
{
std::layout_right::mapping<Ext3x4> map1_3x4;
std::layout_right::mapping<Ext3xN> map1_3xN;
assert(map1_3x4.required_span_size() == 12);
assert(map1_3xN.required_span_size() == 0);
}
// (2) : コピーコンストラクタ
{
std::layout_right::mapping<Ext3xN> map2_a;
std::layout_right::mapping<Ext3xN> map2_b = map2_a;
assert(map2_a == map2_b);
}
// (3) : extentsから構築
{
Ext3xN ext{4};
std::layout_right::mapping<Ext3xN> map3 = ext;
assert(map3.extents() == ext);
}
// (4) : layout_right::mappingからの変換コンストラクタ
{
std::layout_right::mapping<Ext3x4> map4_3x4;
std::layout_right::mapping<Ext3xN> map4_3xN = map4_3x4;
assert(map4_3x4 == map4_3xN);
}
// (5) : layout_left::mappingからの変換コンストラクタ
{
using Ext1D = std::dextents<size_t, 1>;
std::layout_left::mapping<Ext1D> src5{Ext1D{5}};
std::layout_right::mapping<Ext1D> dst5 = src5;
}
// (6) : layout_stride::mappingからの変換コンストラクタ
{
std::array strides{4, 1};
std::layout_stride::mapping<Ext3x4> src6{{}, strides};
std::layout_right::mapping<Ext3x4> dst6{src6}; // (explicit)
}
}
出力
バージョン
言語
- C++23
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??