xref: /freebsd/contrib/llvm-project/libcxx/include/concepts (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15ffd83dbSDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
35ffd83dbSDimitry Andric//
45ffd83dbSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
55ffd83dbSDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
65ffd83dbSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
75ffd83dbSDimitry Andric//
85ffd83dbSDimitry Andric//===----------------------------------------------------------------------===//
95ffd83dbSDimitry Andric
105ffd83dbSDimitry Andric#ifndef _LIBCPP_CONCEPTS
115ffd83dbSDimitry Andric#define _LIBCPP_CONCEPTS
125ffd83dbSDimitry Andric
135ffd83dbSDimitry Andric/*
145ffd83dbSDimitry Andric    concepts synopsis
155ffd83dbSDimitry Andricnamespace std {
165ffd83dbSDimitry Andric  // [concepts.lang], language-related concepts
175ffd83dbSDimitry Andric  // [concept.same], concept same_as
185ffd83dbSDimitry Andric  template<class T, class U>
195ffd83dbSDimitry Andric    concept same_as = see below;
205ffd83dbSDimitry Andric
215ffd83dbSDimitry Andric  // [concept.derived], concept derived_from
225ffd83dbSDimitry Andric  template<class Derived, class Base>
235ffd83dbSDimitry Andric    concept derived_from = see below;
245ffd83dbSDimitry Andric
255ffd83dbSDimitry Andric  // [concept.convertible], concept convertible_to
265ffd83dbSDimitry Andric  template<class From, class To>
275ffd83dbSDimitry Andric    concept convertible_to = see below;
285ffd83dbSDimitry Andric
295ffd83dbSDimitry Andric  // [concept.commonref], concept common_reference_with
305ffd83dbSDimitry Andric  template<class T, class U>
315ffd83dbSDimitry Andric    concept common_reference_with = see below;
325ffd83dbSDimitry Andric
335ffd83dbSDimitry Andric  // [concept.common], concept common_with
345ffd83dbSDimitry Andric  template<class T, class U>
355ffd83dbSDimitry Andric    concept common_with = see below;
365ffd83dbSDimitry Andric
375ffd83dbSDimitry Andric  // [concepts.arithmetic], arithmetic concepts
385ffd83dbSDimitry Andric  template<class T>
395ffd83dbSDimitry Andric    concept integral = see below;
405ffd83dbSDimitry Andric  template<class T>
415ffd83dbSDimitry Andric    concept signed_integral = see below;
425ffd83dbSDimitry Andric  template<class T>
435ffd83dbSDimitry Andric    concept unsigned_integral = see below;
445ffd83dbSDimitry Andric  template<class T>
455ffd83dbSDimitry Andric    concept floating_point = see below;
465ffd83dbSDimitry Andric
475ffd83dbSDimitry Andric  // [concept.assignable], concept assignable_from
485ffd83dbSDimitry Andric  template<class LHS, class RHS>
495ffd83dbSDimitry Andric    concept assignable_from = see below;
505ffd83dbSDimitry Andric
515ffd83dbSDimitry Andric  // [concept.swappable], concept swappable
525ffd83dbSDimitry Andric  namespace ranges {
535ffd83dbSDimitry Andric    inline namespace unspecified {
545ffd83dbSDimitry Andric      inline constexpr unspecified swap = unspecified;
555ffd83dbSDimitry Andric    }
565ffd83dbSDimitry Andric  }
575ffd83dbSDimitry Andric  template<class T>
585ffd83dbSDimitry Andric    concept swappable = see below;
595ffd83dbSDimitry Andric  template<class T, class U>
605ffd83dbSDimitry Andric    concept swappable_with = see below;
615ffd83dbSDimitry Andric
625ffd83dbSDimitry Andric  // [concept.destructible], concept destructible
635ffd83dbSDimitry Andric  template<class T>
645ffd83dbSDimitry Andric    concept destructible = see below;
655ffd83dbSDimitry Andric
665ffd83dbSDimitry Andric  // [concept.constructible], concept constructible_from
675ffd83dbSDimitry Andric  template<class T, class... Args>
685ffd83dbSDimitry Andric    concept constructible_from = see below;
695ffd83dbSDimitry Andric
70fe6060f1SDimitry Andric  // [concept.default.init], concept default_initializable
715ffd83dbSDimitry Andric  template<class T>
72fe6060f1SDimitry Andric    concept default_initializable = see below;
735ffd83dbSDimitry Andric
745ffd83dbSDimitry Andric  // [concept.moveconstructible], concept move_constructible
755ffd83dbSDimitry Andric  template<class T>
765ffd83dbSDimitry Andric    concept move_constructible = see below;
775ffd83dbSDimitry Andric
785ffd83dbSDimitry Andric  // [concept.copyconstructible], concept copy_constructible
795ffd83dbSDimitry Andric  template<class T>
805ffd83dbSDimitry Andric    concept copy_constructible = see below;
815ffd83dbSDimitry Andric
825ffd83dbSDimitry Andric  // [concept.equalitycomparable], concept equality_comparable
835ffd83dbSDimitry Andric  template<class T>
845ffd83dbSDimitry Andric    concept equality_comparable = see below;
855ffd83dbSDimitry Andric  template<class T, class U>
865ffd83dbSDimitry Andric    concept equality_comparable_with = see below;
875ffd83dbSDimitry Andric
885ffd83dbSDimitry Andric  // [concept.totallyordered], concept totally_ordered
895ffd83dbSDimitry Andric  template<class T>
905ffd83dbSDimitry Andric    concept totally_ordered = see below;
915ffd83dbSDimitry Andric  template<class T, class U>
925ffd83dbSDimitry Andric    concept totally_ordered_with = see below;
935ffd83dbSDimitry Andric
945ffd83dbSDimitry Andric  // [concepts.object], object concepts
955ffd83dbSDimitry Andric  template<class T>
965ffd83dbSDimitry Andric    concept movable = see below;
975ffd83dbSDimitry Andric  template<class T>
985ffd83dbSDimitry Andric    concept copyable = see below;
995ffd83dbSDimitry Andric  template<class T>
1005ffd83dbSDimitry Andric    concept semiregular = see below;
1015ffd83dbSDimitry Andric  template<class T>
1025ffd83dbSDimitry Andric    concept regular = see below;
1035ffd83dbSDimitry Andric
1045ffd83dbSDimitry Andric  // [concepts.callable], callable concepts
1055ffd83dbSDimitry Andric  // [concept.invocable], concept invocable
1065ffd83dbSDimitry Andric  template<class F, class... Args>
1075ffd83dbSDimitry Andric    concept invocable = see below;
1085ffd83dbSDimitry Andric
1095ffd83dbSDimitry Andric  // [concept.regularinvocable], concept regular_invocable
1105ffd83dbSDimitry Andric  template<class F, class... Args>
1115ffd83dbSDimitry Andric    concept regular_invocable = see below;
1125ffd83dbSDimitry Andric
1135ffd83dbSDimitry Andric  // [concept.predicate], concept predicate
1145ffd83dbSDimitry Andric  template<class F, class... Args>
1155ffd83dbSDimitry Andric    concept predicate = see below;
1165ffd83dbSDimitry Andric
1175ffd83dbSDimitry Andric  // [concept.relation], concept relation
1185ffd83dbSDimitry Andric  template<class R, class T, class U>
1195ffd83dbSDimitry Andric    concept relation = see below;
1205ffd83dbSDimitry Andric
1215ffd83dbSDimitry Andric  // [concept.equiv], concept equivalence_relation
1225ffd83dbSDimitry Andric  template<class R, class T, class U>
1235ffd83dbSDimitry Andric    concept equivalence_relation = see below;
1245ffd83dbSDimitry Andric
1255ffd83dbSDimitry Andric  // [concept.strictweakorder], concept strict_weak_order
1265ffd83dbSDimitry Andric  template<class R, class T, class U>
1275ffd83dbSDimitry Andric    concept strict_weak_order = see below;
1285ffd83dbSDimitry Andric}
1295ffd83dbSDimitry Andric
1305ffd83dbSDimitry Andric*/
1315ffd83dbSDimitry Andric
132*0fca6ea1SDimitry Andric#include <__config>
133*0fca6ea1SDimitry Andric
134*0fca6ea1SDimitry Andric#if _LIBCPP_STD_VER >= 20
135349cc55cSDimitry Andric#  include <__concepts/arithmetic.h>
136349cc55cSDimitry Andric#  include <__concepts/assignable.h>
137349cc55cSDimitry Andric#  include <__concepts/boolean_testable.h>
138349cc55cSDimitry Andric#  include <__concepts/class_or_enum.h>
139349cc55cSDimitry Andric#  include <__concepts/common_reference_with.h>
140349cc55cSDimitry Andric#  include <__concepts/common_with.h>
141349cc55cSDimitry Andric#  include <__concepts/constructible.h>
142349cc55cSDimitry Andric#  include <__concepts/convertible_to.h>
143349cc55cSDimitry Andric#  include <__concepts/copyable.h>
144349cc55cSDimitry Andric#  include <__concepts/derived_from.h>
145349cc55cSDimitry Andric#  include <__concepts/destructible.h>
146349cc55cSDimitry Andric#  include <__concepts/different_from.h>
147349cc55cSDimitry Andric#  include <__concepts/equality_comparable.h>
148349cc55cSDimitry Andric#  include <__concepts/invocable.h>
149349cc55cSDimitry Andric#  include <__concepts/movable.h>
150349cc55cSDimitry Andric#  include <__concepts/predicate.h>
151349cc55cSDimitry Andric#  include <__concepts/regular.h>
152349cc55cSDimitry Andric#  include <__concepts/relation.h>
153349cc55cSDimitry Andric#  include <__concepts/same_as.h>
154349cc55cSDimitry Andric#  include <__concepts/semiregular.h>
155349cc55cSDimitry Andric#  include <__concepts/swappable.h>
156349cc55cSDimitry Andric#  include <__concepts/totally_ordered.h>
157*0fca6ea1SDimitry Andric#endif // _LIBCPP_STD_VER >= 20
158*0fca6ea1SDimitry Andric
1595ffd83dbSDimitry Andric#include <version>
1605ffd83dbSDimitry Andric
161*0fca6ea1SDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
162*0fca6ea1SDimitry Andric#  include <cstddef>
163*0fca6ea1SDimitry Andric#endif
164*0fca6ea1SDimitry Andric
1657a6dacacSDimitry Andric#if _LIBCPP_STD_VER <= 20 && !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
166bdd1243dSDimitry Andric#  include <type_traits>
167bdd1243dSDimitry Andric#endif
168bdd1243dSDimitry Andric
1695ffd83dbSDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1705ffd83dbSDimitry Andric#  pragma GCC system_header
1715ffd83dbSDimitry Andric#endif
1725ffd83dbSDimitry Andric
1735ffd83dbSDimitry Andric#endif // _LIBCPP_CONCEPTS
174