• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function
    <mdspan>

    std::layout_right_padded::mapping::コンストラクタ

    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_right::mapping<OtherExtents>& other);  // (5)
    
    template<class OtherExtents>
    constexpr explicit(rank_ > 0)
      mapping(const layout_stride::mapping<OtherExtents>& other);  // (6)
    
    template<class LayoutRightPaddedMapping>
    constexpr explicit(see below)
      mapping(const LayoutRightPaddedMapping& other);  // (7)
    
    template<class LayoutLeftPaddedMapping>
    constexpr explicit(see below)
      mapping(const LayoutLeftPaddedMapping& other) noexcept;  // (8)
    

    概要

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

    適格要件

    • (5) : OhterExtents::rank() > 1のとき、(static-padding-stride == dynamic_extent) || (OtherExtents::static_extent(rank_ - 1) == dynamic_extent) || (static-padding-stride == OtherExtents::static_extent(rank_ - 1))trueであること。
    • (7) : rank_ > 1のとき、(padding_value == dynamic_extent) || (LayoutRightPaddedMapping::padding_value == dynamic_extent) || (padding_value == LayoutRightPaddedMapping::padding_value)trueであること。

    事前条件

    • (3) :
      • extの多次元インデクス空間のサイズを、index_type型で表現できること。
      • rank_ > 1かつpadding_value != dynamic_extentのとき、LEAST-MULTIPLE-AT-LEAST(padding_value, ext.extent(rank_ - 1))index_type型で表現できること。
      • rank_ > 1かつpadding_value != dynamic_extentのとき、半開区間[0, rank_ - 1)の全ての値kに対してLEAST-MULTIPLE-AT-LEAST(padding_value, ext.extent(rank_ - 1))と全てのext.extent(k)を乗算した値をindex_type型で表現できること。
    • (4) :
      • padの値をindex_type型で表現できること。
      • extetns_type::index-cast(pad) > 0
      • rank_ > 1のとき、LEAST-MULTIPLE-AT-LEAST(pad, ext.extent(rank_ - 1))index_type型で表現できること。
      • rank_ > 1のとき、半開区間[0, rank_ - 1)の全ての値kに対してLEAST-MULTIPLE-AT-LEAST(pad, ext.extent(rank_ - 1))と全ての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(rank_ - 2) == LEAST-MULTIPLE-AT-LEAST(padding_value, extents_type::index-cast(other.extents().extent(rank_ - 1)))
      • rank_ > 0のとき、other.stride(rank_ - 1) == 1
      • rank_ > 2のとき、半開区間[0, rank_ - 2)の全ての値rに対してother.stride(r) == (other.extents().rev-prod-of-extents(r) / other.extents().extent(rank_ - 1)) * other.stride(rank_ - 2)
      • other.required_span_size()を、index_type型で表現できること。
    • (7) :
      • rank_ > 1かつpadding_value != dynamic_extentのとき、other.stride(rank_ - 2) == LEAST-MULTIPLE-AT-LEAST(padding_value, extents_type::index-cast(other.extent(rank_ - 1)))
      • 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_right_padded<4>::mapping<Ext3x3> map1s;
        std::layout_right_padded<>::mapping<Ext3x3> map1d;
        assert(map1s.stride(0) == 4);
        assert(map1d.stride(0) == 3);
      }
      // (2) : コピーコンストラクタ
      {
        std::layout_right_padded<4>::mapping<Ext3x3> map2_a;
        std::layout_right_padded<4>::mapping<Ext3x3> map2_b = map2_a;
        assert(map2_a == map2_b);
      }
      // (3) : extentsから構築
      {
        Ext2D ext{3, 3};
        std::layout_right_padded<>::mapping<Ext2D> map3 = ext;
        assert(map3.extents() == ext);
      }
      // (4) : extentsとパディングから構築
      {
        Ext2D ext{3, 3};
        std::layout_right_padded<>::mapping<Ext2D> map4{ext, 4};
        assert(map4.extents() == ext && map4.stride(0) == 4);
      }
      // (5) : layout_right::mappingからの変換コンストラクタ
      {
        std::layout_right::mapping src5{Ext3x3{}};
        std::layout_right_padded<>::mapping<Ext2D> dst5 = src5;
        assert(dst5.stride(0) == 3);
      }
      // (6) : layout_stride::mappingからの変換コンストラクタ
      {
        std::array<int, 2> strides{4, 1};
        std::layout_stride::mapping src6{Ext3x3{}, strides};
        std::layout_right_padded<>::mapping<Ext2D> dst6{src6};
        assert(dst6.stride(0) == 4);
      }
      // (7) : 他layout_right_padded::mappingからの変換コンストラクタ
      {
        std::layout_right_padded<4>::mapping<Ext3x3> src7;
        std::layout_right_padded<>::mapping<Ext2D> dst7{src7};
        assert(dst7.extents() == Ext3x3{} && dst7.stride(0) == 4);
      }
      // (8) : layout_left(_padded)::mappingからの変換コンストラクタ
      {
        using Ext1D = std::dims<1>;
        std::layout_left::mapping<Ext1D> src8{Ext1D{5}};
        std::layout_right_padded<>::mapping<Ext1D> dst8{src8};
        assert(dst8.extent(0) == 5);
      }
    }
    

    出力

    バージョン

    言語

    • C++26

    処理系

    関連項目

    参照