Skip to content

[libc++] P2389R2: dextents Index Type Parameter #97393

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions libcxx/docs/FeatureTestMacroTable.rst
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,8 @@ Status
---------------------------------------------------------- -----------------
``__cpp_lib_linalg`` *unimplemented*
---------------------------------------------------------- -----------------
``__cpp_lib_mdspan`` ``202406L``
---------------------------------------------------------- -----------------
``__cpp_lib_optional_range_support`` *unimplemented*
---------------------------------------------------------- -----------------
``__cpp_lib_out_ptr`` *unimplemented*
Expand Down
1 change: 1 addition & 0 deletions libcxx/docs/ReleaseNotes/19.rst
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ Implemented Papers
- P2713R1 - Escaping improvements in ``std::format``
- P2231R1 - Missing ``constexpr`` in ``std::optional`` and ``std::variant``
- P0019R8 - ``std::atomic_ref``
- P2389R2 - Alias template ``dims`` for the ``extents`` of ``mdspan``

Improvements and New Features
-----------------------------
Expand Down
2 changes: 1 addition & 1 deletion libcxx/docs/Status/Cxx2cPapers.csv
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@
"","","","","","",""
"`P2747R2 <https://wg21.link/P2747R2>`__","CWG","``constexpr`` placement new","St. Louis June 2024","","",""
"`P2997R1 <https://wg21.link/P2997R1>`__","LWG","Removing the common reference requirement from the indirectly invocable concepts","St. Louis June 2024","","",""
"`P2389R2 <https://wg21.link/P2389R2>`__","LWG","``dextents`` Index Type Parameter","St. Louis June 2024","","",""
"`P2389R2 <https://wg21.link/P2389R2>`__","LWG","``dextents`` Index Type Parameter","St. Louis June 2024","|Complete|","19.0",""
"`P3168R2 <https://wg21.link/P3168R2>`__","LWG","Give ``std::optional`` Range Support","St. Louis June 2024","","","|ranges|"
"`P3217R0 <https://wg21.link/P3217R0>`__","LWG","Adjoints to 'Enabling list-initialization for algorithms': find_last","St. Louis June 2024","","",""
"`P2985R0 <https://wg21.link/P2985R0>`__","LWG","A type trait for detecting virtual base classes","St. Louis June 2024","","",""
Expand Down
6 changes: 6 additions & 0 deletions libcxx/include/__mdspan/extents.h
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,12 @@ struct __make_dextents< _IndexType, 0, extents<_IndexType, _ExtentsPack...>> {
template <class _IndexType, size_t _Rank>
using dextents = typename __mdspan_detail::__make_dextents<_IndexType, _Rank>::type;

# if _LIBCPP_STD_VER >= 26
// [mdspan.extents.dims], alias template `dims`
template <size_t _Rank, class _IndexType = size_t>
using dims = dextents<_IndexType, _Rank>;
# endif

// Deduction guide for extents
# if _LIBCPP_STD_VER >= 26
template <class... _IndexTypes>
Expand Down
4 changes: 4 additions & 0 deletions libcxx/include/mdspan
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ namespace std {
template<class IndexType, size_t Rank>
using dextents = see below;

// [mdspan.extents.dims], alias template dims
template<size_t Rank, class IndexType = size_t>
using dims = see below; // since C++26

// [mdspan.layout], layout mapping
struct layout_left;
struct layout_right;
Expand Down
5 changes: 4 additions & 1 deletion libcxx/include/version
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,8 @@ __cpp_lib_make_unique 201304L <memory>
__cpp_lib_map_try_emplace 201411L <map>
__cpp_lib_math_constants 201907L <numbers>
__cpp_lib_math_special_functions 201603L <cmath>
__cpp_lib_mdspan 202207L <mdspan>
__cpp_lib_mdspan 202406L <mdspan>
202207L // C++23
__cpp_lib_memory_resource 201603L <memory_resource>
__cpp_lib_move_iterator_concept 202207L <iterator>
__cpp_lib_move_only_function 202110L <functional>
Expand Down Expand Up @@ -530,6 +531,8 @@ __cpp_lib_void_t 201411L <type_traits>
// # define __cpp_lib_is_virtual_base_of 202406L
// # define __cpp_lib_is_within_lifetime 202306L
// # define __cpp_lib_linalg 202311L
# undef __cpp_lib_mdspan
# define __cpp_lib_mdspan 202406L
// # define __cpp_lib_optional_range_support 202406L
# undef __cpp_lib_out_ptr
// # define __cpp_lib_out_ptr 202311L
Expand Down
49 changes: 49 additions & 0 deletions libcxx/test/std/containers/views/mdspan/extents/dims.pass.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23

// <mdspan>

// template<size_t Rank, class IndexType = size_t>
// using dims = see below;
//
// Result: A type E that is a specialization of extents such that
// E::rank() == Rank && E::rank() == E::rank_dynamic() is true,
// and E::index_type denotes IndexType.

#include <mdspan>
#include <cstddef>

#include "test_macros.h"

template <class IndexType>
void test_alias_template_dims() {
constexpr size_t D = std::dynamic_extent;
ASSERT_SAME_TYPE(std::dims<0, IndexType>, std::extents<IndexType>);
ASSERT_SAME_TYPE(std::dims<1, IndexType>, std::extents<IndexType, D>);
ASSERT_SAME_TYPE(std::dims<2, IndexType>, std::extents<IndexType, D, D>);
ASSERT_SAME_TYPE(std::dims<3, IndexType>, std::extents<IndexType, D, D, D>);
ASSERT_SAME_TYPE(std::dims<9, IndexType>, std::extents<IndexType, D, D, D, D, D, D, D, D, D>);
}

template <>
void test_alias_template_dims<size_t>() {
constexpr size_t D = std::dynamic_extent;
ASSERT_SAME_TYPE(std::dims<0>, std::extents<size_t>);
ASSERT_SAME_TYPE(std::dims<1>, std::extents<size_t, D>);
ASSERT_SAME_TYPE(std::dims<2>, std::extents<size_t, D, D>);
ASSERT_SAME_TYPE(std::dims<3>, std::extents<size_t, D, D, D>);
ASSERT_SAME_TYPE(std::dims<9>, std::extents<size_t, D, D, D, D, D, D, D, D, D>);
}

int main(int, char**) {
test_alias_template_dims<int>();
test_alias_template_dims<unsigned int>();
test_alias_template_dims<size_t>();
return 0;
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
/* Constant Value
__cpp_lib_freestanding_mdspan 202311L [C++26]
__cpp_lib_mdspan 202207L [C++23]
202406L [C++26]
__cpp_lib_submdspan 202306L [C++26]
*/

Expand Down Expand Up @@ -115,8 +116,8 @@
# ifndef __cpp_lib_mdspan
# error "__cpp_lib_mdspan should be defined in c++26"
# endif
# if __cpp_lib_mdspan != 202207L
# error "__cpp_lib_mdspan should have the value 202207L in c++26"
# if __cpp_lib_mdspan != 202406L
# error "__cpp_lib_mdspan should have the value 202406L in c++26"
# endif

# if !defined(_LIBCPP_VERSION)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@
__cpp_lib_math_constants 201907L [C++20]
__cpp_lib_math_special_functions 201603L [C++17]
__cpp_lib_mdspan 202207L [C++23]
202406L [C++26]
__cpp_lib_memory_resource 201603L [C++17]
__cpp_lib_modules 202207L [C++23]
__cpp_lib_move_iterator_concept 202207L [C++20]
Expand Down Expand Up @@ -7307,8 +7308,8 @@
# ifndef __cpp_lib_mdspan
# error "__cpp_lib_mdspan should be defined in c++26"
# endif
# if __cpp_lib_mdspan != 202207L
# error "__cpp_lib_mdspan should have the value 202207L in c++26"
# if __cpp_lib_mdspan != 202406L
# error "__cpp_lib_mdspan should have the value 202406L in c++26"
# endif

# if !defined(_LIBCPP_VERSION) || _LIBCPP_AVAILABILITY_HAS_PMR
Expand Down
2 changes: 1 addition & 1 deletion libcxx/utils/generate_feature_test_macro_components.py
Original file line number Diff line number Diff line change
Expand Up @@ -872,7 +872,7 @@ def add_version_header(tc):
"name": "__cpp_lib_mdspan",
"values": {
"c++23": 202207,
# "c++26": 202406, # P2389R2 dextents Index Type Parameter
"c++26": 202406, # P2389R2 dextents Index Type Parameter
},
"headers": ["mdspan"],
},
Expand Down
Loading