//===----------------------------------------------------------------------===// // // 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 // // template // constexpr explicit(extents_type::rank() > 0) // mapping(const layout_stride::mapping& other); // // Constraints: is_constructible_v is true. // // Preconditions: // - If extents_type::rank() > 0 is true, then for all r in the range [0, extents_type::rank()), // other.stride(r) equals other.extents().fwd-prod-of-extents(r), and // - other.required_span_size() is representable as a value of type index_type ([basic.fundamental]). // // Effects: Direct-non-list-initializes extents_ with other.extents(). #include #include #include #include #include // dynamic_extent #include #include "test_macros.h" template constexpr void test_conversion(FromE src_exts) { using To = std::layout_left::mapping; using From = std::layout_stride::mapping; std::array strides; if constexpr (FromE::rank() > 0) { strides[0] = 1; for (size_t r = 1; r < FromE::rank(); r++) strides[r] = src_exts.extent(r - 1) * strides[r - 1]; } From src(src_exts, strides); ASSERT_NOEXCEPT(To(src)); To dest(src); assert(dest == src); if constexpr (implicit) { To dest_implicit = src; assert(dest_implicit == src); } else { assert((!std::is_convertible_v)); } } template constexpr void test_conversion() { constexpr size_t D = std::dynamic_extent; // clang-format off test_conversion>(std::extents()); test_conversion>(std::extents(5)); test_conversion>(std::extents(5)); test_conversion>(std::extents()); test_conversion>(std::extents(5, 5)); test_conversion>(std::extents(5, 5)); test_conversion>(std::extents(5)); test_conversion>(std::extents()); test_conversion>(std::extents(5, 7)); test_conversion>( std::extents(5, 7, 8, 9, 1)); test_conversion>(std::extents(5)); test_conversion>(std::extents()); // clang-format on } template using ll_mapping_t = std::layout_left::mapping>; template using ls_mapping_t = std::layout_stride::mapping>; constexpr void test_rank_mismatch() { constexpr size_t D = std::dynamic_extent; static_assert(!std::is_constructible_v, ls_mapping_t>); static_assert(!std::is_constructible_v, ls_mapping_t>); static_assert(!std::is_constructible_v, ls_mapping_t>); static_assert(!std::is_constructible_v, ls_mapping_t>); } constexpr void test_static_extent_mismatch() { constexpr size_t D = std::dynamic_extent; static_assert(!std::is_constructible_v, ls_mapping_t>); static_assert(!std::is_constructible_v, ls_mapping_t>); static_assert(!std::is_constructible_v, ls_mapping_t>); } constexpr bool test() { test_conversion(); test_conversion(); test_conversion(); test_conversion(); test_rank_mismatch(); test_static_extent_mismatch(); return true; } int main(int, char**) { test(); static_assert(test()); return 0; }