| //===----------------------------------------------------------------------===// |
| // |
| // 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 |
| // UNSUPPORTED: libcpp-no-concepts |
| // UNSUPPORTED: libcpp-has-no-incomplete-ranges |
| |
| // constexpr subrange() requires default_initializable<I>; |
| |
| #include <ranges> |
| |
| #include <cassert> |
| #include <cstddef> |
| |
| #include "test_iterators.h" |
| |
| // An input_or_output_iterator that is not default constructible so we can test |
| // the `requires` on subrange's default constructor. |
| struct NoDefaultIterator { |
| using difference_type = std::ptrdiff_t; |
| NoDefaultIterator() = delete; |
| NoDefaultIterator& operator++(); |
| void operator++(int); |
| int& operator*() const; |
| friend bool operator==(NoDefaultIterator const&, NoDefaultIterator const&); |
| }; |
| static_assert(std::input_or_output_iterator<NoDefaultIterator>); |
| |
| // A sentinel type for the above iterator |
| struct Sentinel { |
| friend bool operator==(NoDefaultIterator const&, Sentinel const&); |
| friend bool operator==(Sentinel const&, NoDefaultIterator const&); |
| friend bool operator!=(NoDefaultIterator const&, Sentinel const&); |
| friend bool operator!=(Sentinel const&, NoDefaultIterator const&); |
| }; |
| |
| constexpr bool test() { |
| { |
| static_assert(!std::is_default_constructible_v<std::ranges::subrange<NoDefaultIterator, Sentinel, std::ranges::subrange_kind::sized>>); |
| static_assert(!std::is_default_constructible_v<std::ranges::subrange<NoDefaultIterator, Sentinel, std::ranges::subrange_kind::unsized>>); |
| } |
| |
| { |
| using Iter = forward_iterator<int*>; |
| std::ranges::subrange<Iter, Iter, std::ranges::subrange_kind::sized> subrange; |
| assert(subrange.begin() == Iter()); |
| assert(subrange.end() == Iter()); |
| } |
| { |
| using Iter = forward_iterator<int*>; |
| std::ranges::subrange<Iter, Iter, std::ranges::subrange_kind::unsized> subrange; |
| assert(subrange.begin() == Iter()); |
| assert(subrange.end() == Iter()); |
| } |
| |
| return true; |
| } |
| |
| int main(int, char**) { |
| test(); |
| static_assert(test()); |
| |
| return 0; |
| } |