//===----------------------------------------------------------------------===// // // 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 // // template // concept view = ...; #include #include "test_macros.h" // The type would be a view, but it's not moveable. struct NotMoveable : std::ranges::view_base { NotMoveable() = default; NotMoveable(NotMoveable&&) = delete; NotMoveable& operator=(NotMoveable&&) = delete; friend int* begin(NotMoveable&); friend int* begin(NotMoveable const&); friend int* end(NotMoveable&); friend int* end(NotMoveable const&); }; static_assert(std::ranges::range); static_assert(!std::movable); static_assert(std::default_initializable); static_assert(std::ranges::enable_view); static_assert(!std::ranges::view); // The type would be a view, but it's not default initializable struct NotDefaultInit : std::ranges::view_base { NotDefaultInit() = delete; friend int* begin(NotDefaultInit&); friend int* begin(NotDefaultInit const&); friend int* end(NotDefaultInit&); friend int* end(NotDefaultInit const&); }; static_assert(std::ranges::range); static_assert(std::movable); static_assert(!std::default_initializable); static_assert(std::ranges::enable_view); static_assert(std::ranges::view); // The type would be a view, but it doesn't enable it with enable_view struct NotExplicitlyEnabled { NotExplicitlyEnabled() = default; NotExplicitlyEnabled(NotExplicitlyEnabled&&) = default; NotExplicitlyEnabled& operator=(NotExplicitlyEnabled&&) = default; friend int* begin(NotExplicitlyEnabled&); friend int* begin(NotExplicitlyEnabled const&); friend int* end(NotExplicitlyEnabled&); friend int* end(NotExplicitlyEnabled const&); }; static_assert(std::ranges::range); static_assert(std::movable); static_assert(std::default_initializable); static_assert(!std::ranges::enable_view); static_assert(!std::ranges::view); // The type has everything else, but it's not a range struct NotARange : std::ranges::view_base { NotARange() = default; NotARange(NotARange&&) = default; NotARange& operator=(NotARange&&) = default; }; static_assert(!std::ranges::range); static_assert(std::movable); static_assert(std::default_initializable); static_assert(std::ranges::enable_view); static_assert(!std::ranges::view); // The type satisfies all requirements struct View : std::ranges::view_base { View() = default; View(View&&) = default; View& operator=(View&&) = default; friend int* begin(View&); friend int* begin(View const&); friend int* end(View&); friend int* end(View const&); }; static_assert(std::ranges::range); static_assert(std::movable); static_assert(std::default_initializable); static_assert(std::ranges::enable_view); static_assert(std::ranges::view);