This patch series follows up on:
https://gcc.gnu.org/pipermail/libstdc++/2025-April/061078.html

As agreed, I'm appending commits that add the layouts to this patch
series. Each layout is added in a separate commit and tests are added in
the immediately following commit.

Changes since v4 to std::extents related code:
* Use else-branch with constexpr if.
* Introduce `_S_is_compatible_extents` and use it to improve the quality
  of the generated code for `operator==`.
* Make `_S_is_dynamic` consteval.
* Silence warning in two cases of `(_Counts, 0)...` about unused
  expression (left of the comma operator).
* Use `cmp_equal` to compare values of with different integer types.
* Fix missing include <utility>.
* The following bugs in test code were fixed:
  - assumed that `size_t` was 64 bits wide (arm).
  - assumed that `cstdint` is imported implicitly (aarch64).
  - tested that a function pointer was not null, instead of calling
    the function.
  - used and incorrect integer type.

New since v4:
* `layout_left`, `layout_right` and `layout_stride`.

In the implementation of `layout_stride::is_exhaustive`, I encounter an
issue that the standard requires that there exists a permutation of the
ranks, such that the permutated layout is a `layout_left` [0]. If the size
of the extent is zero, then this condition implies that the method
`is_exhaustive` returns false for some choices of strides, even though
the layout mapping requirements for `is_exhaustive` are always satisfied
trivially, i.e. because for every element in the empty set anything is
true. One example is `extents = {0, 0, 1}` and `strides = {1, 1, 1}`.
Currently, I haven't been able to come up with a way of checking the
condition (other than brute force checking all permutations), which is
why I've implemented a slightly different check, that satisfies the
layout mapping requirements, but also return true for the example
provided above.

[0]: https://eel.is/c++draft/mdspan.layout#stride.obs-5.2

Thank you Tomasz for the excellent review of v4.

Luc Grosheintz (10):
  libstdc++: Setup internal FTM for mdspan.
  libstdc++: Add header mdspan to the build-system.
  libstdc++: Implement std::extents [PR107761].
  libstdc++: Add tests for std::extents.
  libstdc++: Implement layout_left from mdspan.
  libstdc++: Add tests for layout_left.
  libstdc++: Implement layout_right from mdspan.
  libstdc++: Add tests for layout_right.
  libstdc++: Implement layout_stride from mdspan.
  libstdc++: Add tests for layout_stride.

 libstdc++-v3/doc/doxygen/user.cfg.in          |   1 +
 libstdc++-v3/include/Makefile.am              |   1 +
 libstdc++-v3/include/Makefile.in              |   1 +
 libstdc++-v3/include/bits/version.def         |   9 +
 libstdc++-v3/include/bits/version.h           |   9 +
 libstdc++-v3/include/precompiled/stdc++.h     |   1 +
 libstdc++-v3/include/std/mdspan               | 863 ++++++++++++++++++
 libstdc++-v3/src/c++23/std.cc.in              |   6 +-
 .../mdspan/extents/class_mandates_neg.cc      |   8 +
 .../23_containers/mdspan/extents/ctor_copy.cc |  82 ++
 .../23_containers/mdspan/extents/ctor_ints.cc |  62 ++
 .../mdspan/extents/ctor_shape.cc              | 160 ++++
 .../mdspan/extents/custom_integer.cc          |  87 ++
 .../23_containers/mdspan/extents/misc.cc      | 224 +++++
 .../mdspan/layouts/class_mandate_neg.cc       |  23 +
 .../23_containers/mdspan/layouts/ctors.cc     | 301 ++++++
 .../23_containers/mdspan/layouts/mapping.cc   | 431 +++++++++
 .../23_containers/mdspan/layouts/stride.cc    | 359 ++++++++
 18 files changed, 2627 insertions(+), 1 deletion(-)
 create mode 100644 libstdc++-v3/include/std/mdspan
 create mode 100644 
libstdc++-v3/testsuite/23_containers/mdspan/extents/class_mandates_neg.cc
 create mode 100644 
libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_copy.cc
 create mode 100644 
libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_ints.cc
 create mode 100644 
libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_shape.cc
 create mode 100644 
libstdc++-v3/testsuite/23_containers/mdspan/extents/custom_integer.cc
 create mode 100644 libstdc++-v3/testsuite/23_containers/mdspan/extents/misc.cc
 create mode 100644 
libstdc++-v3/testsuite/23_containers/mdspan/layouts/class_mandate_neg.cc
 create mode 100644 libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc
 create mode 100644 
libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc
 create mode 100644 
libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride.cc

-- 
2.49.0

Reply via email to