//===----------------------------------------------------------------------===// // // 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 // test if zip_view models input_range, forward_range, bidirectional_range, // random_access_range, contiguous_range, common_range // sized_range #include #include #include #include #include #include "types.h" void testConceptPair() { int buffer1[2] = {1, 2}; int buffer2[3] = {1, 2, 3}; { std::ranges::zip_view v{ContiguousCommonView{buffer1}, ContiguousCommonView{buffer2}}; using View = decltype(v); static_assert(std::ranges::random_access_range); static_assert(!std::ranges::contiguous_range); static_assert(std::ranges::common_range); static_assert(std::ranges::sized_range); } { std::ranges::zip_view v{ContiguousNonCommonView{buffer1}, ContiguousNonCommonView{buffer2}}; using View = decltype(v); static_assert(std::ranges::random_access_range); static_assert(!std::ranges::contiguous_range); static_assert(!std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{ContiguousNonCommonSized{buffer1}, ContiguousNonCommonSized{buffer2}}; using View = decltype(v); static_assert(std::ranges::random_access_range); static_assert(!std::ranges::contiguous_range); static_assert(std::ranges::common_range); static_assert(std::ranges::sized_range); } { std::ranges::zip_view v{SizedRandomAccessView{buffer1}, ContiguousCommonView{buffer2}}; using View = decltype(v); static_assert(std::ranges::random_access_range); static_assert(!std::ranges::contiguous_range); static_assert(std::ranges::common_range); static_assert(std::ranges::sized_range); } { std::ranges::zip_view v{SizedRandomAccessView{buffer1}, SizedRandomAccessView{buffer2}}; using View = decltype(v); static_assert(std::ranges::random_access_range); static_assert(!std::ranges::contiguous_range); static_assert(std::ranges::common_range); static_assert(std::ranges::sized_range); } { std::ranges::zip_view v{NonSizedRandomAccessView{buffer1}, NonSizedRandomAccessView{buffer2}}; using View = decltype(v); static_assert(std::ranges::random_access_range); static_assert(!std::ranges::contiguous_range); static_assert(!std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{BidiCommonView{buffer1}, SizedRandomAccessView{buffer2}}; using View = decltype(v); static_assert(std::ranges::bidirectional_range); static_assert(!std::ranges::random_access_range); static_assert(!std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{BidiCommonView{buffer1}, BidiCommonView{buffer2}}; using View = decltype(v); static_assert(std::ranges::bidirectional_range); static_assert(!std::ranges::random_access_range); static_assert(!std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{BidiCommonView{buffer1}, ForwardSizedView{buffer2}}; using View = decltype(v); static_assert(std::ranges::forward_range); static_assert(!std::ranges::bidirectional_range); static_assert(std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{BidiNonCommonView{buffer1}, ForwardSizedView{buffer2}}; using View = decltype(v); static_assert(std::ranges::forward_range); static_assert(!std::ranges::bidirectional_range); static_assert(!std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{ForwardSizedView{buffer1}, ForwardSizedView{buffer2}}; using View = decltype(v); static_assert(std::ranges::forward_range); static_assert(!std::ranges::bidirectional_range); static_assert(std::ranges::common_range); static_assert(std::ranges::sized_range); } { std::ranges::zip_view v{ForwardSizedNonCommon{buffer1}, ForwardSizedView{buffer2}}; using View = decltype(v); static_assert(std::ranges::forward_range); static_assert(!std::ranges::bidirectional_range); static_assert(!std::ranges::common_range); static_assert(std::ranges::sized_range); } { std::ranges::zip_view v{InputCommonView{buffer1}, ForwardSizedView{buffer2}}; using View = decltype(v); static_assert(std::ranges::input_range); static_assert(!std::ranges::forward_range); static_assert(std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{InputCommonView{buffer1}, InputCommonView{buffer2}}; using View = decltype(v); static_assert(std::ranges::input_range); static_assert(!std::ranges::forward_range); static_assert(std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{InputNonCommonView{buffer1}, InputCommonView{buffer2}}; using View = decltype(v); static_assert(std::ranges::input_range); static_assert(!std::ranges::forward_range); static_assert(!std::ranges::common_range); static_assert(!std::ranges::sized_range); } } void testConceptTuple() { int buffer1[2] = {1, 2}; int buffer2[3] = {1, 2, 3}; int buffer3[4] = {1, 2, 3, 4}; { std::ranges::zip_view v{ContiguousCommonView{buffer1}, ContiguousCommonView{buffer2}, ContiguousCommonView{buffer3}}; using View = decltype(v); static_assert(std::ranges::random_access_range); static_assert(!std::ranges::contiguous_range); static_assert(std::ranges::common_range); static_assert(std::ranges::sized_range); } { std::ranges::zip_view v{ContiguousNonCommonView{buffer1}, ContiguousNonCommonView{buffer2}, ContiguousNonCommonView{buffer3}}; using View = decltype(v); static_assert(std::ranges::random_access_range); static_assert(!std::ranges::contiguous_range); static_assert(!std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{ContiguousNonCommonSized{buffer1}, ContiguousNonCommonSized{buffer2}, ContiguousNonCommonSized{buffer3}}; using View = decltype(v); static_assert(std::ranges::random_access_range); static_assert(!std::ranges::contiguous_range); static_assert(std::ranges::common_range); static_assert(std::ranges::sized_range); } { std::ranges::zip_view v{SizedRandomAccessView{buffer1}, ContiguousCommonView{buffer2}, ContiguousCommonView{buffer3}}; using View = decltype(v); static_assert(std::ranges::random_access_range); static_assert(!std::ranges::contiguous_range); static_assert(std::ranges::common_range); static_assert(std::ranges::sized_range); } { std::ranges::zip_view v{SizedRandomAccessView{buffer1}, SizedRandomAccessView{buffer2}, SizedRandomAccessView{buffer3}}; using View = decltype(v); static_assert(std::ranges::random_access_range); static_assert(!std::ranges::contiguous_range); static_assert(std::ranges::common_range); static_assert(std::ranges::sized_range); } { std::ranges::zip_view v{NonSizedRandomAccessView{buffer1}, NonSizedRandomAccessView{buffer2}, NonSizedRandomAccessView{buffer3}}; using View = decltype(v); static_assert(std::ranges::random_access_range); static_assert(!std::ranges::contiguous_range); static_assert(!std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{BidiCommonView{buffer1}, SizedRandomAccessView{buffer2}, SizedRandomAccessView{buffer3}}; using View = decltype(v); static_assert(std::ranges::bidirectional_range); static_assert(!std::ranges::random_access_range); static_assert(!std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{BidiCommonView{buffer1}, BidiCommonView{buffer2}, BidiCommonView{buffer3}}; using View = decltype(v); static_assert(std::ranges::bidirectional_range); static_assert(!std::ranges::random_access_range); static_assert(!std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{BidiCommonView{buffer1}, ForwardSizedView{buffer2}, ForwardSizedView{buffer3}}; using View = decltype(v); static_assert(std::ranges::forward_range); static_assert(!std::ranges::bidirectional_range); static_assert(std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{BidiNonCommonView{buffer1}, ForwardSizedView{buffer2}, ForwardSizedView{buffer3}}; using View = decltype(v); static_assert(std::ranges::forward_range); static_assert(!std::ranges::bidirectional_range); static_assert(!std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{ForwardSizedView{buffer1}, ForwardSizedView{buffer2}, ForwardSizedView{buffer3}}; using View = decltype(v); static_assert(std::ranges::forward_range); static_assert(!std::ranges::bidirectional_range); static_assert(std::ranges::common_range); static_assert(std::ranges::sized_range); } { std::ranges::zip_view v{ForwardSizedNonCommon{buffer1}, ForwardSizedView{buffer2}, ForwardSizedView{buffer3}}; using View = decltype(v); static_assert(std::ranges::forward_range); static_assert(!std::ranges::bidirectional_range); static_assert(!std::ranges::common_range); static_assert(std::ranges::sized_range); } { std::ranges::zip_view v{InputCommonView{buffer1}, ForwardSizedView{buffer2}, ForwardSizedView{buffer3}}; using View = decltype(v); static_assert(std::ranges::input_range); static_assert(!std::ranges::forward_range); static_assert(std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{InputCommonView{buffer1}, InputCommonView{buffer2}, InputCommonView{buffer3}}; using View = decltype(v); static_assert(std::ranges::input_range); static_assert(!std::ranges::forward_range); static_assert(std::ranges::common_range); static_assert(!std::ranges::sized_range); } { std::ranges::zip_view v{InputNonCommonView{buffer1}, InputCommonView{buffer2}, InputCommonView{buffer3}}; using View = decltype(v); static_assert(std::ranges::input_range); static_assert(!std::ranges::forward_range); static_assert(!std::ranges::common_range); static_assert(!std::ranges::sized_range); } } using OutputIter = cpp17_output_iterator; static_assert(std::output_iterator); struct OutputView : std::ranges::view_base { OutputIter begin() const; sentinel_wrapper end() const; }; static_assert(std::ranges::output_range); static_assert(!std::ranges::input_range); template concept zippable = requires { typename std::ranges::zip_view; }; // output_range is not supported static_assert(!zippable); static_assert(!zippable); static_assert(zippable);