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

履歴 編集

function template
<mdspan>

std::submdspan_canonicalize_slices(C++26)

namespace std {
  template<class IndexType, size_t... Extents, class... Slices>
  constexpr auto submdspan_canonicalize_slices(
    const extents<IndexType, Extents...>& src, Slices... slices);
}

概要

多次元配列サイズextentsと各次元からの要素取り出し(スライス)情報を正規化する。

各次元からの要素取り出し方式は、submdspanを参照のこと。

submdspanスライス型

符号付きもしくは符号なし整数型IndexTypeに対して、下記のうち少なくとも1つを満たすとき、型SIndexTypesubmdspanスライス型(submdspan slice type)となる。

正則submdspanスライス型

符号付きもしくは符号なし整数型IndexTypeに対して、型SIndexTypeもしくは値0以上の任意の値vを保持するconstant_wrapper<v>であるとき、型SIndexTypeの正則submdspanインデクス型となる。

符号付きもしくは符号なし整数型IndexTypeに対して、下記のうちただ1つだけを満たすとき、型SIndexTypeの正則submdspanスライス型(canonical submdspan slice type)となる。

  • Sfull_extent_t
  • SIndexTypeの正則submdspanインデクス型である
  • Sstrided_sliceの特殊化であり、下記を全て満たす
    • S::offset_type, S::extent_type, S::stride_typeが、全てIndexTypeの正則submdspanインデクス型である
    • S::stride_typeおよびS::extent_typeがいずれもconstant_wrapperの特殊化であり、S::stride_type::value0より大きい

縮約スライス型とMAP_RANK

ある型がfull_extent_tないしstrided_sliceの特殊化いずれでもないとき、縮約スライス型(collapsing slice type)となる。

パックpと整数iに対して、説明用のMAP_RANK(p, i)0 <= j <のうち縮約スライス型ではない要素p...[j]の個数とする。

有効submdspanスライス型

extentsの特殊化である型Eに対して、型SE::index_typeの正則スライス型であり、かつE::static_extent(k)に等しいxに対してxdynamic_extentに等しいか下記を満たすとき、型SEk番目次元の有効submdspanスライス型(valid submdspan slice type)となる。

  • Sstrided_sliceの特殊化であるとき :
    • S::offset_typeconstant_wrapperの特殊化であるとき、S::offset_type::valuex以下
    • S::extent_typeconstant_wrapperの特殊化であるとき、S::extent_type::valuex以下
    • S::offset_typeおよびS::extent_typeconstant_wrapperの特殊化であるとき、S::offset_type::value + S::extent_type::valuex以下
  • Sconstant_wrapperの特殊化であるとき、S::valuexより小さい

有効submdspanスライス

extentsの特殊化である型Eのオブジェクトeと、型Sのオブジェクトsに対して、下記を満たすときsek番目次元の有効submdspanスライス(valid submdspan slice)となる。

  • SEk番目次元の有効submdspanスライス型
  • ek番目区間が、ek番目次元に対してssubmdspanスライス範囲を含む
  • Sstrided_sliceの特殊化であるとき :
    • s.extentが値0以上であり、かつ
    • s.extentsが値0に等しい、もしくはs.strideが値0より大きい

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

sizeof...(SliceSpecifiers)sizeof...(Extents)と等しいこと。

適格要件

srcの各次元インデクスkに対して、

  • SliceSpecifiers...[k]IndexTypesubmdspanスライス型であり、かつ
  • decltype(cannonical-slice<IndexType>(slices...[k]))extents<IndexType, Extents...>のk番目次元の有効submdspanスライス型(valid submdspan slice type)であること。

事前条件

srcの各次元インデクスkに対して、cannonical-slice<IndexType>(slices...[k])srcのk番目次元の有効submdspanスライス(valid submdspan slice)であること。

戻り値

make_tuple(canonical-slice<IndexType>(slices)...)

バージョン

言語

  • C++26

処理系

関連項目

参照