On Tue, Dec 9, 2025 at 10:59 AM Jonathan Wakely <[email protected]> wrote:

> On Tue, 9 Dec 2025 at 09:37, Tomasz Kamiński <[email protected]> wrote:
> >
> > From: Luc Grosheintz <[email protected]>
> >
> > Implements `submdspan` and `submdspan_mapping` for layout_left as
> > described in P3663 (Future proofing mdspan).
> >
> > When computing the offset of the submdspan, one must check that the
> > lower bound of the slice range isn't out-of-range. There's a few
> > cases when the lower bound is never out-of-range:
> >
> >   - full_extent and exts.extent(k) != 0,
> >   - collapsing slice types.
> >
> > If those conditions are known to hold, no checks are generated.
> >
> > Similarly, if all slices are full_extent, there's no need to call
> > mapping(0,...,0) for standardized mappings.
> >
> > The implementation prepares to use the symmetry between layout_left and
> > layout_right and introduces concepts like a "layout side", i.e. left,
> > right or unknown/strided.
> >
> > The tests use an iterator to replace nested for-loops. Which also makes
> > it easier to write the core test logic in a rank-independent manner.
> >
> >         PR libstdc++/110352
> >
> > libstdc++-v3/ChangeLog:
> >
> >         * include/std/mdspan (__mdspan::__is_submdspan_mapping_result)
> >         (__mdspan::__submdspan_mapping_result, __mdspan::__fwd_prod)
> >         (__mdspan::__acceptable_slice_type, __mdspan::__slice_begin)
> >         (__mdspan::__suboffset, __mdspan::_LayoutSide,
> __mdspan::__mapping_side)
> >         (__mdspan::_StridesTrait, __mdspan::__substrides_generic)
> >         (__mdspan::__substrides_standardized, __mdspan::__substrides)
> >         (__mdspan::__is_unit_stride_slice, __mdspan::_SliceKind)
> >         (__mdspan::__make_slice_kind, __mdspan::__make_slice_kind_array)
> >         (__mdspan::__is_block, __mdspan::__padded_block_begin_generic)
> >         (__mdspan::__padded_block_begin, __mpdspan::_SubMdspanMapping)
> >         (__mdspan::__submdspan_mapping_impl): Define.
> >         (__mdspan::__dynamic_slice_extent,
> __mdspan::__static_slice_extent)
> >         (__mdspan::__subextents): Move eariel in the file.
>
> "earlier"
>
> >         (layout_left::mapping::submdspan_mapping,
> __mdspan::__sliceable_mapping)
> >         (__mdspan::__submapping, submdspan): Define.
> >         * src/c++23/std.cc.in: Add submdspan.
> >         * testsuite/23_containers/mdspan/submdspan/generic.cc: New test.
> >         * testsuite/23_containers/mdspan/submdspan/selections/left.cc:
> >         Instantiate selection tests for layout_left.
> >         *
> testsuite/23_containers/mdspan/submdspan/selections/testcases.h: Generic
> >         tests different selections.
> >         * testsuite/23_containers/mdspan/submdspan/submdspan_mapping.cc:
> New test.
> >         * testsuite/23_containers/mdspan/submdspan/submdspan_neg.cc: New
> test.
> >
> > Reviewed-by: Tomasz Kamiński <[email protected]>
> > Signed-off-by: Luc Grosheintz <[email protected]>
> > ---
> > v7:
> >  - list all new entries in changes.
> >  - move submdspan_mapping poison pill before concept,
> >  - use const mapping as argument to concept
> >  - refactor __submdspan into __submapping funciton.
> >
> > Tested *mdspan* locally.
>
> We've reached the point where I no longer understand the <mdspan>
> code! But this looks OK for trunk, with the typo above fixed.

It's not that hard, especially with consteval functions for determining
what kind of
mapping to produce.

Reply via email to