1349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 2349cc55cSDimitry Andric // 3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6349cc55cSDimitry Andric // 7349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 8349cc55cSDimitry Andric 9349cc55cSDimitry Andric #ifndef _LIBCPP___CONCEPTS_COMMON_WITH_H 10349cc55cSDimitry Andric #define _LIBCPP___CONCEPTS_COMMON_WITH_H 11349cc55cSDimitry Andric 12349cc55cSDimitry Andric #include <__concepts/common_reference_with.h> 13349cc55cSDimitry Andric #include <__concepts/same_as.h> 14349cc55cSDimitry Andric #include <__config> 15bdd1243dSDimitry Andric #include <__type_traits/add_lvalue_reference.h> 16bdd1243dSDimitry Andric #include <__type_traits/common_reference.h> 17bdd1243dSDimitry Andric #include <__type_traits/common_type.h> 18bdd1243dSDimitry Andric #include <__utility/declval.h> 19349cc55cSDimitry Andric 20349cc55cSDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 21349cc55cSDimitry Andric # pragma GCC system_header 22349cc55cSDimitry Andric #endif 23349cc55cSDimitry Andric 24349cc55cSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 25349cc55cSDimitry Andric 26*06c3fb27SDimitry Andric #if _LIBCPP_STD_VER >= 20 27349cc55cSDimitry Andric 28349cc55cSDimitry Andric // [concept.common] 29349cc55cSDimitry Andric 30*06c3fb27SDimitry Andric // clang-format off 31349cc55cSDimitry Andric template <class _Tp, class _Up> 32349cc55cSDimitry Andric concept common_with = 33349cc55cSDimitry Andric same_as<common_type_t<_Tp, _Up>, common_type_t<_Up, _Tp>> && 34349cc55cSDimitry Andric requires { 35bdd1243dSDimitry Andric static_cast<common_type_t<_Tp, _Up>>(std::declval<_Tp>()); 36bdd1243dSDimitry Andric static_cast<common_type_t<_Tp, _Up>>(std::declval<_Up>()); 37349cc55cSDimitry Andric } && 38349cc55cSDimitry Andric common_reference_with< 39349cc55cSDimitry Andric add_lvalue_reference_t<const _Tp>, 40349cc55cSDimitry Andric add_lvalue_reference_t<const _Up>> && 41349cc55cSDimitry Andric common_reference_with< 42349cc55cSDimitry Andric add_lvalue_reference_t<common_type_t<_Tp, _Up>>, 43349cc55cSDimitry Andric common_reference_t< 44349cc55cSDimitry Andric add_lvalue_reference_t<const _Tp>, 45349cc55cSDimitry Andric add_lvalue_reference_t<const _Up>>>; 46*06c3fb27SDimitry Andric // clang-format on 47349cc55cSDimitry Andric 48*06c3fb27SDimitry Andric #endif // _LIBCPP_STD_VER >= 20 49349cc55cSDimitry Andric 50349cc55cSDimitry Andric _LIBCPP_END_NAMESPACE_STD 51349cc55cSDimitry Andric 52349cc55cSDimitry Andric #endif // _LIBCPP___CONCEPTS_COMMON_WITH_H 53