最終更新日時(UTC):
が更新

履歴 編集

function
<mdspan>

std::layout_left_padded::mapping::コンストラクタ(C++26)

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)

概要

テンプレートパラメータ制約

適格要件

  • (5) : OhterExtents::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), (2), (8) : 投げない

explicitになる条件

#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);
  }
}

出力

バージョン

言語

  • C++26

処理系

関連項目

参照