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-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03, c++11, c++14, c++17
10
11// <ranges>
12
13// template<class T>
14// inline constexpr bool enable_view = ...;
15
16#include <ranges>
17
18#include "test_macros.h"
19
20// Doesn't derive from view_base
21struct Empty { };
22static_assert(!std::ranges::enable_view<Empty>);
23static_assert(!std::ranges::enable_view<Empty&>);
24static_assert(!std::ranges::enable_view<Empty&&>);
25static_assert(!std::ranges::enable_view<const Empty>);
26static_assert(!std::ranges::enable_view<const Empty&>);
27static_assert(!std::ranges::enable_view<const Empty&&>);
28static_assert(!std::ranges::enable_view<volatile Empty>);
29static_assert(!std::ranges::enable_view<volatile Empty&>);
30static_assert(!std::ranges::enable_view<volatile Empty&&>);
31static_assert(!std::ranges::enable_view<const volatile Empty>);
32static_assert(!std::ranges::enable_view<const volatile Empty&>);
33static_assert(!std::ranges::enable_view<const volatile Empty&&>);
34
35// Derives from view_base, but privately
36struct PrivateViewBase : private std::ranges::view_base { };
37static_assert(!std::ranges::enable_view<PrivateViewBase>);
38static_assert(!std::ranges::enable_view<PrivateViewBase&>);
39static_assert(!std::ranges::enable_view<PrivateViewBase&&>);
40static_assert(!std::ranges::enable_view<const PrivateViewBase>);
41static_assert(!std::ranges::enable_view<const PrivateViewBase&>);
42static_assert(!std::ranges::enable_view<const PrivateViewBase&&>);
43static_assert(!std::ranges::enable_view<volatile PrivateViewBase>);
44static_assert(!std::ranges::enable_view<volatile PrivateViewBase&>);
45static_assert(!std::ranges::enable_view<volatile PrivateViewBase&&>);
46static_assert(!std::ranges::enable_view<const volatile PrivateViewBase>);
47static_assert(!std::ranges::enable_view<const volatile PrivateViewBase&>);
48static_assert(!std::ranges::enable_view<const volatile PrivateViewBase&&>);
49
50// Derives from view_base, but specializes enable_view to false
51struct EnableViewFalse : std::ranges::view_base { };
52template <> constexpr bool std::ranges::enable_view<EnableViewFalse> = false;
53static_assert(!std::ranges::enable_view<EnableViewFalse>);
54static_assert(!std::ranges::enable_view<EnableViewFalse&>);
55static_assert(!std::ranges::enable_view<EnableViewFalse&&>);
56static_assert(std::ranges::enable_view<const EnableViewFalse>);
57static_assert(!std::ranges::enable_view<const EnableViewFalse&>);
58static_assert(!std::ranges::enable_view<const EnableViewFalse&&>);
59static_assert(std::ranges::enable_view<volatile EnableViewFalse>);
60static_assert(!std::ranges::enable_view<volatile EnableViewFalse&>);
61static_assert(!std::ranges::enable_view<volatile EnableViewFalse&&>);
62static_assert(std::ranges::enable_view<const volatile EnableViewFalse>);
63static_assert(!std::ranges::enable_view<const volatile EnableViewFalse&>);
64static_assert(!std::ranges::enable_view<const volatile EnableViewFalse&&>);
65
66// Derives from view_base
67struct PublicViewBase : std::ranges::view_base { };
68static_assert(std::ranges::enable_view<PublicViewBase>);
69static_assert(!std::ranges::enable_view<PublicViewBase&>);
70static_assert(!std::ranges::enable_view<PublicViewBase&&>);
71static_assert(std::ranges::enable_view<const PublicViewBase>);
72static_assert(!std::ranges::enable_view<const PublicViewBase&>);
73static_assert(!std::ranges::enable_view<const PublicViewBase&&>);
74static_assert(std::ranges::enable_view<volatile PublicViewBase>);
75static_assert(!std::ranges::enable_view<volatile PublicViewBase&>);
76static_assert(!std::ranges::enable_view<volatile PublicViewBase&&>);
77static_assert(std::ranges::enable_view<const volatile PublicViewBase>);
78static_assert(!std::ranges::enable_view<const volatile PublicViewBase&>);
79static_assert(!std::ranges::enable_view<const volatile PublicViewBase&&>);
80
81// Does not derive from view_base, but specializes enable_view to true
82struct EnableViewTrue { };
83template <> constexpr bool std::ranges::enable_view<EnableViewTrue> = true;
84static_assert(std::ranges::enable_view<EnableViewTrue>);
85static_assert(!std::ranges::enable_view<EnableViewTrue&>);
86static_assert(!std::ranges::enable_view<EnableViewTrue&&>);
87static_assert(!std::ranges::enable_view<const EnableViewTrue>);
88static_assert(!std::ranges::enable_view<const EnableViewTrue&>);
89static_assert(!std::ranges::enable_view<const EnableViewTrue&&>);
90static_assert(!std::ranges::enable_view<volatile EnableViewTrue>);
91static_assert(!std::ranges::enable_view<volatile EnableViewTrue&>);
92static_assert(!std::ranges::enable_view<volatile EnableViewTrue&&>);
93static_assert(!std::ranges::enable_view<const volatile EnableViewTrue>);
94static_assert(!std::ranges::enable_view<const volatile EnableViewTrue&>);
95static_assert(!std::ranges::enable_view<const volatile EnableViewTrue&&>);
96
97// Make sure that enable_view is a bool, not some other contextually-convertible-to-bool type.
98ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<Empty>), const bool);
99ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<PublicViewBase>), const bool);
100
101struct V1 : std::ranges::view_interface<V1> {};
102static_assert(std::ranges::enable_view<V1>);
103static_assert(!std::ranges::enable_view<V1&>);
104static_assert(!std::ranges::enable_view<V1&&>);
105static_assert(std::ranges::enable_view<const V1>);
106static_assert(!std::ranges::enable_view<const V1&>);
107static_assert(!std::ranges::enable_view<const V1&&>);
108static_assert(std::ranges::enable_view<volatile V1>);
109static_assert(!std::ranges::enable_view<volatile V1&>);
110static_assert(!std::ranges::enable_view<volatile V1&&>);
111static_assert(std::ranges::enable_view<const volatile V1>);
112static_assert(!std::ranges::enable_view<const volatile V1&>);
113static_assert(!std::ranges::enable_view<const volatile V1&&>);
114
115struct V2 : std::ranges::view_interface<V1>, std::ranges::view_interface<V2> {};
116static_assert(!std::ranges::enable_view<V2>);
117static_assert(!std::ranges::enable_view<V2&>);
118static_assert(!std::ranges::enable_view<V2&&>);
119static_assert(!std::ranges::enable_view<const V2>);
120static_assert(!std::ranges::enable_view<const V2&>);
121static_assert(!std::ranges::enable_view<const V2&&>);
122static_assert(!std::ranges::enable_view<volatile V2>);
123static_assert(!std::ranges::enable_view<volatile V2&>);
124static_assert(!std::ranges::enable_view<volatile V2&&>);
125static_assert(!std::ranges::enable_view<const volatile V2>);
126static_assert(!std::ranges::enable_view<const volatile V2&>);
127static_assert(!std::ranges::enable_view<const volatile V2&&>);
128
129struct V3 : std::ranges::view_interface<V1> {};
130static_assert(std::ranges::enable_view<V3>);
131static_assert(!std::ranges::enable_view<V3&>);
132static_assert(!std::ranges::enable_view<V3&&>);
133static_assert(std::ranges::enable_view<const V3>);
134static_assert(!std::ranges::enable_view<const V3&>);
135static_assert(!std::ranges::enable_view<const V3&&>);
136static_assert(std::ranges::enable_view<volatile V3>);
137static_assert(!std::ranges::enable_view<volatile V3&>);
138static_assert(!std::ranges::enable_view<volatile V3&&>);
139static_assert(std::ranges::enable_view<const volatile V3>);
140static_assert(!std::ranges::enable_view<const volatile V3&>);
141static_assert(!std::ranges::enable_view<const volatile V3&&>);
142
143struct PrivateInherit : private std::ranges::view_interface<PrivateInherit> {};
144static_assert(!std::ranges::enable_view<PrivateInherit>);
145static_assert(!std::ranges::enable_view<const PrivateInherit>);
146static_assert(!std::ranges::enable_view<volatile PrivateInherit>);
147static_assert(!std::ranges::enable_view<const volatile PrivateInherit>);
148
149// https://github.com/llvm/llvm-project/issues/132577
150// enable_view<view_interface<T>> should be false.
151static_assert(!std::ranges::enable_view<std::ranges::view_interface<V1>>);
152static_assert(!std::ranges::enable_view<const std::ranges::view_interface<V1>>);
153static_assert(!std::ranges::enable_view<volatile std::ranges::view_interface<V1>>);
154static_assert(!std::ranges::enable_view<const volatile std::ranges::view_interface<V1>>);
155
156// ADL-proof
157struct Incomplete;
158template<class T> struct Holder { T t; };
159static_assert(!std::ranges::enable_view<Holder<Incomplete>*>);
160static_assert(!std::ranges::enable_view<const Holder<Incomplete>*>);
161static_assert(!std::ranges::enable_view<volatile Holder<Incomplete>*>);
162static_assert(!std::ranges::enable_view<const volatile Holder<Incomplete>*>);
163
164static_assert(!std::ranges::enable_view<void>);
165static_assert(!std::ranges::enable_view<const void>);
166static_assert(!std::ranges::enable_view<volatile void>);
167static_assert(!std::ranges::enable_view<const volatile void>);
168

source code of libcxx/test/std/ranges/range.req/range.view/enable_view.compile.pass.cpp