1 //===----------------------------------------------------------------------===// 2 // 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 6 // 7 //===----------------------------------------------------------------------===// 8 9 // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 10 11 // <mdspan> 12 13 // constexpr index_type stride(rank_type i) const noexcept; 14 // 15 // Constraints: extents_type::rank() > 0 is true. 16 // 17 // Preconditions: i < extents_type::rank() is true. 18 // 19 // Returns: extents().rev-prod-of-extents(i). 20 21 #include <mdspan> 22 #include <array> 23 #include <cassert> 24 #include <cstdint> 25 #include <cstdio> 26 #include <span> // dynamic_extent 27 28 #include "test_macros.h" 29 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_right::mapping<E>; 33 M m(E(args...)); 34 35 ASSERT_NOEXCEPT(m.stride(0)); 36 for (size_t r = 0; r < E::rank(); r++) 37 assert(strides[r] == m.stride(r)); 38 } 39 40 constexpr bool test() { 41 constexpr size_t D = std::dynamic_extent; 42 test_stride<std::extents<unsigned, D>>(std::array<unsigned, 1>{1}, 7); 43 test_stride<std::extents<unsigned, 7>>(std::array<unsigned, 1>{1}); 44 test_stride<std::extents<unsigned, 7, 8>>(std::array<unsigned, 2>{8, 1}); 45 test_stride<std::extents<int64_t, D, 8, D, D>>(std::array<int64_t, 4>{720, 90, 10, 1}, 7, 9, 10); 46 return true; 47 } 48 49 int main(int, char**) { 50 test(); 51 static_assert(test()); 52 return 0; 53 } 54