//===----------------------------------------------------------------------===// // // 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 // 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); // const view types struct ConstView1 : std::ranges::view_base { ConstView1(const ConstView1&&); const ConstView1& operator=(const ConstView1&&) const; friend void swap(const ConstView1&, const ConstView1&); friend int* begin(const ConstView1&); friend int* end(const ConstView1&); }; 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); struct ConstView2 : std::ranges::view_interface { ConstView2(const ConstView2&&); const ConstView2& operator=(const ConstView2&&) const; friend void swap(const ConstView2&, const ConstView2&); friend int* begin(const ConstView2&); friend int* end(const ConstView2&); }; 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); // volatile view types struct VolatileView1 : std::ranges::view_base { VolatileView1(volatile VolatileView1&&); volatile VolatileView1& operator=(volatile VolatileView1&&) volatile; friend void swap(volatile VolatileView1&, volatile VolatileView1&); friend int* begin(volatile VolatileView1&); friend int* end(volatile VolatileView1&); }; 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); struct VolatileView2 : std::ranges::view_interface { VolatileView2(volatile VolatileView2&&); volatile VolatileView2& operator=(volatile VolatileView2&&) volatile; friend void swap(volatile VolatileView2&, volatile VolatileView2&); friend int* begin(volatile VolatileView2&); friend int* end(volatile VolatileView2&); }; 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); // const-volatile view types struct ConstVolatileView1 : std::ranges::view_base { ConstVolatileView1(const volatile ConstVolatileView1&&); const volatile ConstVolatileView1& operator=(const volatile ConstVolatileView1&&) const volatile; friend void swap(const volatile ConstVolatileView1&, const volatile ConstVolatileView1&); friend int* begin(const volatile ConstVolatileView1&); friend int* end(const volatile ConstVolatileView1&); }; 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); struct ConstVolatileView2 : std::ranges::view_interface { ConstVolatileView2(const volatile ConstVolatileView2&&); const volatile ConstVolatileView2& operator=(const volatile ConstVolatileView2&&) const volatile; friend void swap(const volatile ConstVolatileView2&, const volatile ConstVolatileView2&); friend int* begin(const volatile ConstVolatileView2&); friend int* end(const volatile ConstVolatileView2&); }; 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);