1 //===----------------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
13 // constexpr index_type stride(rank_type i) const noexcept;
15 // Constraints: extents_type::rank() > 0 is true.
17 // Preconditions: i < extents_type::rank() is true.
19 // Returns: extents().rev-prod-of-extents(i).
26 #include <span> // dynamic_extent
28 #include "test_macros.h"
30 template <class E
, class... Args
>
31 constexpr void test_stride(std::array
<typename
E::index_type
, E::rank()> strides
, Args
... args
) {
32 using M
= std::layout_stride::mapping
<E
>;
33 M
m(E(args
...), strides
);
35 ASSERT_NOEXCEPT(m
.stride(0));
36 for (size_t r
= 0; r
< E::rank(); r
++)
37 assert(strides
[r
] == m
.stride(r
));
39 ASSERT_NOEXCEPT(m
.strides());
40 auto strides_out
= m
.strides();
41 static_assert(std::is_same_v
<decltype(strides_out
), std::array
<typename
E::index_type
, E::rank()>>);
42 for (size_t r
= 0; r
< E::rank(); r
++)
43 assert(strides
[r
] == strides_out
[r
]);
46 constexpr bool test() {
47 constexpr size_t D
= std::dynamic_extent
;
48 test_stride
<std::extents
<unsigned, D
>>(std::array
<unsigned, 1>{1}, 7);
49 test_stride
<std::extents
<unsigned, 7>>(std::array
<unsigned, 1>{1});
50 test_stride
<std::extents
<unsigned, 7, 8>>(std::array
<unsigned, 2>{8, 1});
51 test_stride
<std::extents
<int64_t, D
, 8, D
, D
>>(std::array
<int64_t, 4>{720, 90, 10, 1}, 7, 9, 10);
55 int main(int, char**) {
57 static_assert(test());