mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 23:26:04 +00:00

This patch implements the forwarding to frozen C++03 headers as discussed in https://discourse.llvm.org/t/rfc-freezing-c-03-headers-in-libc. In the RFC, we initially proposed selecting the right headers from the Clang driver, however consensus seemed to steer towards handling this in the library itself. This patch implements that direction. At a high level, the changes basically amount to making each public header look like this: ``` // inside <vector> #ifdef _LIBCPP_CXX03_LANG # include <__cxx03/vector> #else // normal <vector> content #endif ``` In most cases, public headers are simple umbrella headers so there isn't much code in the #else branch. In other cases, the #else branch contains the actual implementation of the header.
175 lines
5.2 KiB
C++
175 lines
5.2 KiB
C++
// -*- C++ -*-
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _LIBCPP_CONCEPTS
|
|
#define _LIBCPP_CONCEPTS
|
|
|
|
/*
|
|
concepts synopsis
|
|
namespace std {
|
|
// [concepts.lang], language-related concepts
|
|
// [concept.same], concept same_as
|
|
template<class T, class U>
|
|
concept same_as = see below;
|
|
|
|
// [concept.derived], concept derived_from
|
|
template<class Derived, class Base>
|
|
concept derived_from = see below;
|
|
|
|
// [concept.convertible], concept convertible_to
|
|
template<class From, class To>
|
|
concept convertible_to = see below;
|
|
|
|
// [concept.commonref], concept common_reference_with
|
|
template<class T, class U>
|
|
concept common_reference_with = see below;
|
|
|
|
// [concept.common], concept common_with
|
|
template<class T, class U>
|
|
concept common_with = see below;
|
|
|
|
// [concepts.arithmetic], arithmetic concepts
|
|
template<class T>
|
|
concept integral = see below;
|
|
template<class T>
|
|
concept signed_integral = see below;
|
|
template<class T>
|
|
concept unsigned_integral = see below;
|
|
template<class T>
|
|
concept floating_point = see below;
|
|
|
|
// [concept.assignable], concept assignable_from
|
|
template<class LHS, class RHS>
|
|
concept assignable_from = see below;
|
|
|
|
// [concept.swappable], concept swappable
|
|
namespace ranges {
|
|
inline namespace unspecified {
|
|
inline constexpr unspecified swap = unspecified;
|
|
}
|
|
}
|
|
template<class T>
|
|
concept swappable = see below;
|
|
template<class T, class U>
|
|
concept swappable_with = see below;
|
|
|
|
// [concept.destructible], concept destructible
|
|
template<class T>
|
|
concept destructible = see below;
|
|
|
|
// [concept.constructible], concept constructible_from
|
|
template<class T, class... Args>
|
|
concept constructible_from = see below;
|
|
|
|
// [concept.default.init], concept default_initializable
|
|
template<class T>
|
|
concept default_initializable = see below;
|
|
|
|
// [concept.moveconstructible], concept move_constructible
|
|
template<class T>
|
|
concept move_constructible = see below;
|
|
|
|
// [concept.copyconstructible], concept copy_constructible
|
|
template<class T>
|
|
concept copy_constructible = see below;
|
|
|
|
// [concept.equalitycomparable], concept equality_comparable
|
|
template<class T>
|
|
concept equality_comparable = see below;
|
|
template<class T, class U>
|
|
concept equality_comparable_with = see below;
|
|
|
|
// [concept.totallyordered], concept totally_ordered
|
|
template<class T>
|
|
concept totally_ordered = see below;
|
|
template<class T, class U>
|
|
concept totally_ordered_with = see below;
|
|
|
|
// [concepts.object], object concepts
|
|
template<class T>
|
|
concept movable = see below;
|
|
template<class T>
|
|
concept copyable = see below;
|
|
template<class T>
|
|
concept semiregular = see below;
|
|
template<class T>
|
|
concept regular = see below;
|
|
|
|
// [concepts.callable], callable concepts
|
|
// [concept.invocable], concept invocable
|
|
template<class F, class... Args>
|
|
concept invocable = see below;
|
|
|
|
// [concept.regularinvocable], concept regular_invocable
|
|
template<class F, class... Args>
|
|
concept regular_invocable = see below;
|
|
|
|
// [concept.predicate], concept predicate
|
|
template<class F, class... Args>
|
|
concept predicate = see below;
|
|
|
|
// [concept.relation], concept relation
|
|
template<class R, class T, class U>
|
|
concept relation = see below;
|
|
|
|
// [concept.equiv], concept equivalence_relation
|
|
template<class R, class T, class U>
|
|
concept equivalence_relation = see below;
|
|
|
|
// [concept.strictweakorder], concept strict_weak_order
|
|
template<class R, class T, class U>
|
|
concept strict_weak_order = see below;
|
|
}
|
|
|
|
*/
|
|
|
|
#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
|
|
# include <__cxx03/concepts>
|
|
#else
|
|
# include <__config>
|
|
|
|
# if _LIBCPP_STD_VER >= 20
|
|
# include <__concepts/arithmetic.h>
|
|
# include <__concepts/assignable.h>
|
|
# include <__concepts/boolean_testable.h>
|
|
# include <__concepts/class_or_enum.h>
|
|
# include <__concepts/common_reference_with.h>
|
|
# include <__concepts/common_with.h>
|
|
# include <__concepts/constructible.h>
|
|
# include <__concepts/convertible_to.h>
|
|
# include <__concepts/copyable.h>
|
|
# include <__concepts/derived_from.h>
|
|
# include <__concepts/destructible.h>
|
|
# include <__concepts/different_from.h>
|
|
# include <__concepts/equality_comparable.h>
|
|
# include <__concepts/invocable.h>
|
|
# include <__concepts/movable.h>
|
|
# include <__concepts/predicate.h>
|
|
# include <__concepts/regular.h>
|
|
# include <__concepts/relation.h>
|
|
# include <__concepts/same_as.h>
|
|
# include <__concepts/semiregular.h>
|
|
# include <__concepts/swappable.h>
|
|
# include <__concepts/totally_ordered.h>
|
|
# endif // _LIBCPP_STD_VER >= 20
|
|
|
|
# include <version>
|
|
|
|
# if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
|
# include <cstddef>
|
|
# include <type_traits>
|
|
# endif
|
|
|
|
# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
# pragma GCC system_header
|
|
# endif
|
|
#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
|
|
|
|
#endif // _LIBCPP_CONCEPTS
|