xref: /freebsd-src/contrib/llvm-project/libcxx/include/__compare/compare_three_way_result.h (revision cb14a3fe5122c879eae1fb480ed7ce82a699ddb6)
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___COMPARE_COMPARE_THREE_WAY_RESULT_H
10349cc55cSDimitry Andric #define _LIBCPP___COMPARE_COMPARE_THREE_WAY_RESULT_H
11349cc55cSDimitry Andric 
12349cc55cSDimitry Andric #include <__config>
13bdd1243dSDimitry Andric #include <__type_traits/make_const_lvalue_ref.h>
14bdd1243dSDimitry Andric #include <__utility/declval.h>
15349cc55cSDimitry Andric 
16349cc55cSDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
17349cc55cSDimitry Andric #  pragma GCC system_header
18349cc55cSDimitry Andric #endif
19349cc55cSDimitry Andric 
20349cc55cSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD
21349cc55cSDimitry Andric 
2206c3fb27SDimitry Andric #if _LIBCPP_STD_VER >= 20
23349cc55cSDimitry Andric 
24349cc55cSDimitry Andric template <class, class, class>
25349cc55cSDimitry Andric struct _LIBCPP_HIDE_FROM_ABI __compare_three_way_result {};
26349cc55cSDimitry Andric 
27349cc55cSDimitry Andric template <class _Tp, class _Up>
28*cb14a3feSDimitry Andric struct _LIBCPP_HIDE_FROM_ABI __compare_three_way_result<
29*cb14a3feSDimitry Andric     _Tp,
30*cb14a3feSDimitry Andric     _Up,
31*cb14a3feSDimitry Andric     decltype(std::declval<__make_const_lvalue_ref<_Tp>>() <=> std::declval<__make_const_lvalue_ref<_Up>>(), void())> {
32bdd1243dSDimitry Andric   using type = decltype(std::declval<__make_const_lvalue_ref<_Tp>>() <=> std::declval<__make_const_lvalue_ref<_Up>>());
33349cc55cSDimitry Andric };
34349cc55cSDimitry Andric 
35349cc55cSDimitry Andric template <class _Tp, class _Up = _Tp>
36349cc55cSDimitry Andric struct _LIBCPP_TEMPLATE_VIS compare_three_way_result : __compare_three_way_result<_Tp, _Up, void> {};
37349cc55cSDimitry Andric 
38349cc55cSDimitry Andric template <class _Tp, class _Up = _Tp>
39349cc55cSDimitry Andric using compare_three_way_result_t = typename compare_three_way_result<_Tp, _Up>::type;
40349cc55cSDimitry Andric 
4106c3fb27SDimitry Andric #endif // _LIBCPP_STD_VER >= 20
42349cc55cSDimitry Andric 
43349cc55cSDimitry Andric _LIBCPP_END_NAMESPACE_STD
44349cc55cSDimitry Andric 
45349cc55cSDimitry Andric #endif // _LIBCPP___COMPARE_COMPARE_THREE_WAY_RESULT_H
46