1// -*- C++ -*-
2//===----------------------------------------------------------------------===//
3//
4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_CONCEPTS
11#define _LIBCPP_CONCEPTS
12
13/*
14 concepts synopsis
15namespace std {
16 // [concepts.lang], language-related concepts
17 // [concept.same], concept same_as
18 template<class T, class U>
19 concept same_as = see below;
20
21 // [concept.derived], concept derived_from
22 template<class Derived, class Base>
23 concept derived_from = see below;
24
25 // [concept.convertible], concept convertible_to
26 template<class From, class To>
27 concept convertible_to = see below;
28
29 // [concept.commonref], concept common_reference_with
30 template<class T, class U>
31 concept common_reference_with = see below;
32
33 // [concept.common], concept common_with
34 template<class T, class U>
35 concept common_with = see below;
36
37 // [concepts.arithmetic], arithmetic concepts
38 template<class T>
39 concept integral = see below;
40 template<class T>
41 concept signed_integral = see below;
42 template<class T>
43 concept unsigned_integral = see below;
44 template<class T>
45 concept floating_point = see below;
46
47 // [concept.assignable], concept assignable_from
48 template<class LHS, class RHS>
49 concept assignable_from = see below;
50
51 // [concept.swappable], concept swappable
52 namespace ranges {
53 inline namespace unspecified {
54 inline constexpr unspecified swap = unspecified;
55 }
56 }
57 template<class T>
58 concept swappable = see below;
59 template<class T, class U>
60 concept swappable_with = see below;
61
62 // [concept.destructible], concept destructible
63 template<class T>
64 concept destructible = see below;
65
66 // [concept.constructible], concept constructible_from
67 template<class T, class... Args>
68 concept constructible_from = see below;
69
70 // [concept.default.init], concept default_initializable
71 template<class T>
72 concept default_initializable = see below;
73
74 // [concept.moveconstructible], concept move_constructible
75 template<class T>
76 concept move_constructible = see below;
77
78 // [concept.copyconstructible], concept copy_constructible
79 template<class T>
80 concept copy_constructible = see below;
81
82 // [concept.equalitycomparable], concept equality_comparable
83 template<class T>
84 concept equality_comparable = see below;
85 template<class T, class U>
86 concept equality_comparable_with = see below;
87
88 // [concept.totallyordered], concept totally_ordered
89 template<class T>
90 concept totally_ordered = see below;
91 template<class T, class U>
92 concept totally_ordered_with = see below;
93
94 // [concepts.object], object concepts
95 template<class T>
96 concept movable = see below;
97 template<class T>
98 concept copyable = see below;
99 template<class T>
100 concept semiregular = see below;
101 template<class T>
102 concept regular = see below;
103
104 // [concepts.callable], callable concepts
105 // [concept.invocable], concept invocable
106 template<class F, class... Args>
107 concept invocable = see below;
108
109 // [concept.regularinvocable], concept regular_invocable
110 template<class F, class... Args>
111 concept regular_invocable = see below;
112
113 // [concept.predicate], concept predicate
114 template<class F, class... Args>
115 concept predicate = see below;
116
117 // [concept.relation], concept relation
118 template<class R, class T, class U>
119 concept relation = see below;
120
121 // [concept.equiv], concept equivalence_relation
122 template<class R, class T, class U>
123 concept equivalence_relation = see below;
124
125 // [concept.strictweakorder], concept strict_weak_order
126 template<class R, class T, class U>
127 concept strict_weak_order = see below;
128}
129
130*/
131
132#include <__config>
133
134#if _LIBCPP_STD_VER >= 20
135# include <__concepts/arithmetic.h>
136# include <__concepts/assignable.h>
137# include <__concepts/boolean_testable.h>
138# include <__concepts/class_or_enum.h>
139# include <__concepts/common_reference_with.h>
140# include <__concepts/common_with.h>
141# include <__concepts/constructible.h>
142# include <__concepts/convertible_to.h>
143# include <__concepts/copyable.h>
144# include <__concepts/derived_from.h>
145# include <__concepts/destructible.h>
146# include <__concepts/different_from.h>
147# include <__concepts/equality_comparable.h>
148# include <__concepts/invocable.h>
149# include <__concepts/movable.h>
150# include <__concepts/predicate.h>
151# include <__concepts/regular.h>
152# include <__concepts/relation.h>
153# include <__concepts/same_as.h>
154# include <__concepts/semiregular.h>
155# include <__concepts/swappable.h>
156# include <__concepts/totally_ordered.h>
157#endif // _LIBCPP_STD_VER >= 20
158
159#include <version>
160
161#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
162# include <cstddef>
163#endif
164
165#if _LIBCPP_STD_VER <= 20 && !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
166# include <type_traits>
167#endif
168
169#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
170# pragma GCC system_header
171#endif
172
173#endif // _LIBCPP_CONCEPTS
174