brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.3 KiB · 38828cb Raw
186 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// <ranges>12 13// template<class T>14// concept view = ...;15 16#include <ranges>17 18// The type would be a view, but it's not moveable.19struct NotMoveable : std::ranges::view_base {20  NotMoveable() = default;21  NotMoveable(NotMoveable&&) = delete;22  NotMoveable& operator=(NotMoveable&&) = delete;23  friend int* begin(NotMoveable&);24  friend int* begin(NotMoveable const&);25  friend int* end(NotMoveable&);26  friend int* end(NotMoveable const&);27};28static_assert(std::ranges::range<NotMoveable>);29static_assert(!std::movable<NotMoveable>);30static_assert(std::default_initializable<NotMoveable>);31static_assert(std::ranges::enable_view<NotMoveable>);32static_assert(!std::ranges::view<NotMoveable>);33 34// The type would be a view, but it's not default initializable35struct NotDefaultInit : std::ranges::view_base {36  NotDefaultInit() = delete;37  friend int* begin(NotDefaultInit&);38  friend int* begin(NotDefaultInit const&);39  friend int* end(NotDefaultInit&);40  friend int* end(NotDefaultInit const&);41};42static_assert(std::ranges::range<NotDefaultInit>);43static_assert(std::movable<NotDefaultInit>);44static_assert(!std::default_initializable<NotDefaultInit>);45static_assert(std::ranges::enable_view<NotDefaultInit>);46static_assert(std::ranges::view<NotDefaultInit>);47 48// The type would be a view, but it doesn't enable it with enable_view49struct NotExplicitlyEnabled {50  NotExplicitlyEnabled() = default;51  NotExplicitlyEnabled(NotExplicitlyEnabled&&) = default;52  NotExplicitlyEnabled& operator=(NotExplicitlyEnabled&&) = default;53  friend int* begin(NotExplicitlyEnabled&);54  friend int* begin(NotExplicitlyEnabled const&);55  friend int* end(NotExplicitlyEnabled&);56  friend int* end(NotExplicitlyEnabled const&);57};58static_assert(std::ranges::range<NotExplicitlyEnabled>);59static_assert(std::movable<NotExplicitlyEnabled>);60static_assert(std::default_initializable<NotExplicitlyEnabled>);61static_assert(!std::ranges::enable_view<NotExplicitlyEnabled>);62static_assert(!std::ranges::view<NotExplicitlyEnabled>);63 64// The type has everything else, but it's not a range65struct NotARange : std::ranges::view_base {66  NotARange() = default;67  NotARange(NotARange&&) = default;68  NotARange& operator=(NotARange&&) = default;69};70static_assert(!std::ranges::range<NotARange>);71static_assert(std::movable<NotARange>);72static_assert(std::default_initializable<NotARange>);73static_assert(std::ranges::enable_view<NotARange>);74static_assert(!std::ranges::view<NotARange>);75 76// The type satisfies all requirements77struct View : std::ranges::view_base {78  View() = default;79  View(View&&) = default;80  View& operator=(View&&) = default;81  friend int* begin(View&);82  friend int* begin(View const&);83  friend int* end(View&);84  friend int* end(View const&);85};86static_assert(std::ranges::range<View>);87static_assert(std::movable<View>);88static_assert(std::default_initializable<View>);89static_assert(std::ranges::enable_view<View>);90static_assert(std::ranges::view<View>);91 92// const view types93 94struct ConstView1 : std::ranges::view_base {95  ConstView1(const ConstView1&&);96  const ConstView1& operator=(const ConstView1&&) const;97 98  friend void swap(const ConstView1&, const ConstView1&);99 100  friend int* begin(const ConstView1&);101  friend int* end(const ConstView1&);102};103static_assert(std::ranges::range<const ConstView1>);104static_assert(std::movable<const ConstView1>);105static_assert(!std::default_initializable<const ConstView1>);106static_assert(std::ranges::enable_view<const ConstView1>);107static_assert(std::ranges::view<const ConstView1>);108 109struct ConstView2 : std::ranges::view_interface<ConstView2> {110  ConstView2(const ConstView2&&);111  const ConstView2& operator=(const ConstView2&&) const;112 113  friend void swap(const ConstView2&, const ConstView2&);114 115  friend int* begin(const ConstView2&);116  friend int* end(const ConstView2&);117};118static_assert(std::ranges::range<const ConstView2>);119static_assert(std::movable<const ConstView2>);120static_assert(!std::default_initializable<const ConstView2>);121static_assert(std::ranges::enable_view<const ConstView2>);122static_assert(std::ranges::view<const ConstView2>);123 124// volatile view types125struct VolatileView1 : std::ranges::view_base {126  VolatileView1(volatile VolatileView1&&);127  volatile VolatileView1& operator=(volatile VolatileView1&&) volatile;128 129  friend void swap(volatile VolatileView1&, volatile VolatileView1&);130 131  friend int* begin(volatile VolatileView1&);132  friend int* end(volatile VolatileView1&);133};134static_assert(std::ranges::range<volatile VolatileView1>);135static_assert(std::movable<volatile VolatileView1>);136static_assert(!std::default_initializable<volatile VolatileView1>);137static_assert(std::ranges::enable_view<volatile VolatileView1>);138static_assert(std::ranges::view<volatile VolatileView1>);139 140struct VolatileView2 : std::ranges::view_interface<VolatileView2> {141  VolatileView2(volatile VolatileView2&&);142  volatile VolatileView2& operator=(volatile VolatileView2&&) volatile;143 144  friend void swap(volatile VolatileView2&, volatile VolatileView2&);145 146  friend int* begin(volatile VolatileView2&);147  friend int* end(volatile VolatileView2&);148};149static_assert(std::ranges::range<volatile VolatileView2>);150static_assert(std::movable<volatile VolatileView2>);151static_assert(!std::default_initializable<volatile VolatileView2>);152static_assert(std::ranges::enable_view<volatile VolatileView2>);153static_assert(std::ranges::view<volatile VolatileView2>);154 155// const-volatile view types156 157struct ConstVolatileView1 : std::ranges::view_base {158  ConstVolatileView1(const volatile ConstVolatileView1&&);159  const volatile ConstVolatileView1& operator=(const volatile ConstVolatileView1&&) const volatile;160 161  friend void swap(const volatile ConstVolatileView1&, const volatile ConstVolatileView1&);162 163  friend int* begin(const volatile ConstVolatileView1&);164  friend int* end(const volatile ConstVolatileView1&);165};166static_assert(std::ranges::range<const volatile ConstVolatileView1>);167static_assert(std::movable<const volatile ConstVolatileView1>);168static_assert(!std::default_initializable<const volatile ConstVolatileView1>);169static_assert(std::ranges::enable_view<const volatile ConstVolatileView1>);170static_assert(std::ranges::view<const volatile ConstVolatileView1>);171 172struct ConstVolatileView2 : std::ranges::view_interface<ConstVolatileView2> {173  ConstVolatileView2(const volatile ConstVolatileView2&&);174  const volatile ConstVolatileView2& operator=(const volatile ConstVolatileView2&&) const volatile;175 176  friend void swap(const volatile ConstVolatileView2&, const volatile ConstVolatileView2&);177 178  friend int* begin(const volatile ConstVolatileView2&);179  friend int* end(const volatile ConstVolatileView2&);180};181static_assert(std::ranges::range<const volatile ConstVolatileView2>);182static_assert(std::movable<const volatile ConstVolatileView2>);183static_assert(!std::default_initializable<const volatile ConstVolatileView2>);184static_assert(std::ranges::enable_view<const volatile ConstVolatileView2>);185static_assert(std::ranges::view<const volatile ConstVolatileView2>);186