最終更新日時: 2024年09月05日 19時41分09秒 (JST)
yoh が更新

履歴 編集

function
<mdspan>

# std::layout_left::mapping::コンストラクタ(C++23)

    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_right::mapping<OtherExtents>& other) noexcept;  // (5)

    template<class LayoutLeftPaddedMapping>
    constexpr explicit(!is_convertible_v<typename LayoutLeftPaddedMapping::extents_type, extents_type>)
      mapping(const LayoutLeftPaddedMapping& 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_left::mapping`からの変換コンストラクタ
- (5) : `layout_right::mapping`からの変換コンストラクタ
- (6) : `layout_stride::mapping`からの変換コンストラクタ
- (7) : `layout_left_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-left-padded-mapping-of<LayoutLeftPaddedMapping>`が`true`、かつ
  - `is_constructible_v<extents_type, typename LayoutLeftPaddedMapping::extents_type>`が`true`であること。

## 適格要件

- (7) : 以下を満たすとき、`extents_type::static_extent(0)`が`LayoutLeftPaddedMapping::static-padding-stride`に等しいこと。
  - `extents_type::rank() > 1`、かつ
  - `extents_type::static_extent(0) != dynamic_extent`、かつ
  - `LayoutLeftPaddedMapping::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_left::mapping`相当の制約をもつこと。
  - `other.required_span_size()`を、`index_type`型で表現できること。
- (7) :
  - `extents_type::rank() > 1`のとき、`other.stride(1) == other.extents(0)`
  - `other.required_span_size()`を、`index_type`型で表現できること。

## 効果

- (3) : `e`を用いて`extents_`を直接非リスト初期化する。
- (4), (5), (6), (7) : `other.extents()`を用いて`extents_`を直接非リスト初期化する。

## 例外

投げない

## explicitになる条件

- (4), (5) : `!is_convertible_v<OtherExtents, extents_type>`
- (6) : `extents_type::rank() > 0`
- (7) : `!is_convertible_v<typename LayoutLeftPaddedMapping::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_left::mapping<Ext3x4> map1_3x4;
        std::layout_left::mapping<Ext3xN> map1_3xN;
        assert(map1_3x4.required_span_size() == 12);
        assert(map1_3xN.required_span_size() == 0);
      }
      // (2) : コピーコンストラクタ
      {
        std::layout_left::mapping<Ext3xN> map2_a;
        std::layout_left::mapping<Ext3xN> map2_b = map2_a;
        assert(map2_a == map2_b);
      }
      // (3) : extentsから構築
      {
        Ext3xN ext{4};
        std::layout_left::mapping<Ext3xN> map3 = ext;
        assert(map3.extents() == ext);
      }
      // (4) : layout_left::mappingからの変換コンストラクタ
      {
        std::layout_left::mapping<Ext3x4> map4_3x4;
        std::layout_left::mapping<Ext3xN> map4_3xN = map4_3x4;
        assert(map4_3x4 == map4_3xN);
      }
      // (5) : layout_right::mappingからの変換コンストラクタ
      {
        using Ext1D = std::dextents<size_t, 1>;
        std::layout_right::mapping<Ext1D> src5{Ext1D{5}};
        std::layout_left::mapping<Ext1D>  dst5 = src5;
      }
      // (6) : layout_stride::mappingからの変換コンストラクタ
      {
        std::array strides{1, 3};
        std::layout_stride::mapping<Ext3x4> src6{{}, strides};
        std::layout_left::mapping<Ext3x4>   dst6{src6};  // (explicit)
      }
    }

### 出力

## バージョン

### 言語

- C++23

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??

## 関連項目

- `layout_right::mapping`
- `layout_stride::mapping`
- `layout_left_padded::mapping`

## 参照

- P0009R18 MDSPAN
- P2642R6 Padded mdspan layouts