11// -*- 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+ // ===----------------------------------------------------------------------===//
29#ifndef _EZCXX_CONCEPTS
310#define _EZCXX_CONCEPTS
411
@@ -11,22 +18,38 @@ namespace std {
1118template <class _Tp , class _Up >
1219concept same_as = is_same<_Tp, _Up>::value && is_same<_Up, _Tp>::value;
1320
14- template <class _From , class _To >
15- concept convertible_to =
16- is_convertible_v<_From, _To> &&
17- requires { static_cast <_To>(std::declval<_From>()); };
18-
1921template <class _Dp , class _Bp >
2022concept derived_from =
2123 is_base_of_v<_Bp, _Dp> &&
2224 is_convertible_v<const volatile _Dp*, const volatile _Bp*>;
2325
24- template <class _Tp >
25- concept destructible = is_nothrow_destructible_v<_Tp>;
26+ template <class _From , class _To >
27+ concept convertible_to =
28+ is_convertible_v<_From, _To> &&
29+ requires { static_cast <_To>(std::declval<_From>()); };
2630
27- template <class _Tp , class ... _Args>
28- concept constructible_from =
29- destructible<_Tp> && is_constructible_v<_Tp, _Args...>;
31+ template <class _Tp , class _Up >
32+ concept common_reference_with =
33+ same_as<common_reference_t <_Tp, _Up>, common_reference_t <_Up, _Tp>> &&
34+ convertible_to<_Tp, common_reference_t <_Tp, _Up>> && convertible_to<_Up, common_reference_t <_Tp, _Up>>;
35+
36+ template <class _Tp , class _Up >
37+ concept common_with =
38+ same_as<common_type_t <_Tp, _Up>, common_type_t <_Up, _Tp>> &&
39+ requires {
40+ static_cast <common_type_t <_Tp, _Up>>(std::declval<_Tp>());
41+ static_cast <common_type_t <_Tp, _Up>>(std::declval<_Up>());
42+ } &&
43+ common_reference_with<
44+ add_lvalue_reference_t <const _Tp>,
45+ add_lvalue_reference_t <const _Up>> &&
46+ common_reference_with<
47+ add_lvalue_reference_t <common_type_t <_Tp, _Up>>,
48+ common_reference_t <
49+ add_lvalue_reference_t <const _Tp>,
50+ add_lvalue_reference_t <const _Up>
51+ >
52+ >;
3053
3154template <class _Tp >
3255concept integral = is_integral_v<_Tp>;
@@ -40,9 +63,19 @@ concept unsigned_integral = integral<_Tp> && !signed_integral<_Tp>;
4063template <class _Tp >
4164concept floating_point = is_floating_point_v<_Tp>;
4265
66+ template <class _Tp >
67+ concept destructible = is_nothrow_destructible_v<_Tp>;
68+
69+ template <class _Tp , class ... _Args>
70+ concept constructible_from =
71+ destructible<_Tp> && is_constructible_v<_Tp, _Args...>;
72+
73+ template <class _Tp >
74+ concept default_initializable = constructible_from<_Tp> && requires { _Tp{}; ::new _Tp; };
75+
4376template <class _Tp >
4477concept move_constructible =
45- constructible_from<_Tp, _Tp> && std:: convertible_to<_Tp, _Tp>;
78+ constructible_from<_Tp, _Tp> && convertible_to<_Tp, _Tp>;
4679
4780template <class _Tp >
4881concept copy_constructible =
0 commit comments