[mdspan.sub.extents] (original) (raw)
23 Containers library [containers]
23.7 Views [views]
23.7.3 Multidimensional access [views.multidim]
23.7.3.7 submdspan [mdspan.sub]
23.7.3.7.5 submdspan_extents function [mdspan.sub.extents]
template<class IndexType, class... Extents, class... SliceSpecifiers> constexpr auto submdspan_extents(const extents<IndexType, Extents...>& src, SliceSpecifiers... slices);
Constraints: sizeof...(slices) equals Extents::rank().
Mandates: For each rank index k of src.extents(), exactly one of the following is true:
- models convertible_to<IndexType>,
- models index-pair-like<IndexType>,
- is_convertible_v<, full_extent_t> is true, or
- is a specialization of strided_slice.
Preconditions: For each rank index k of src.extents(), all of the following are true:
- if is a specialization of strided_slice
- , or
- 0 ≤ first_<IndexType, k>(slices...) ≤ last_<k>(src, slices...) ≤ src.extent(k)
Let SubExtents be a specialization of extents such that:
- SubExtents::rank() equals the number of k such that does not model convertible_to<IndexType>; and
- for each rank index k of Extents such that_map-rank_[k] != dynamic_extent is true,SubExtents::static_extent(_map-rank_[k]) equals:
- Extents::static_extent(k) if is_convertible_v<, full_extent_t> is true; otherwise
- de-ice(tuple_element_t<1, >()) - de-ice(tuple_element_t<0, >()) if models index-pair-like<IndexType>, and both tuple_element_t<0, > andtuple_element_t<1, > model integral-constant-like; otherwise
- 0, if is a specialization of strided_slice, whoseextent_type models integral-constant-like, for which extent_type() equals zero; otherwise
- 1 + (de-ice(::extent_type()) - 1) / de-ice(::stride_type()), if is a specialization of strided_slice whoseextent_type and stride_type model integral-constant-like;
- otherwise,dynamic_extent.
Returns: A value ext of type SubExtents such that for each kfor which _map-rank_[k] != dynamic_extent is true,ext.extent(_map-rank_[k]) equals:
- .extent == 0 ? 0 : 1 + (de-ice(.extent) - 1) / de-ice(.stride)if is a specialization of strided_slice,
- otherwise,last_<k>(src, slices...) - first_<IndexType, k>(slices...).