1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef _LIBCPP___COMPARE_COMPARE_WEAK_ORDER_FALLBACK
10#define _LIBCPP___COMPARE_COMPARE_WEAK_ORDER_FALLBACK
11
12#include <__compare/ordering.h>
13#include <__compare/weak_order.h>
14#include <__config>
15#include <__type_traits/decay.h>
16#include <__type_traits/is_same.h>
17#include <__utility/forward.h>
18#include <__utility/priority_tag.h>
19
20#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
21#  pragma GCC system_header
22#endif
23
24_LIBCPP_BEGIN_NAMESPACE_STD
25
26#if _LIBCPP_STD_VER > 17
27
28// [cmp.alg]
29namespace __compare_weak_order_fallback {
30    struct __fn {
31        template<class _Tp, class _Up>
32            requires is_same_v<decay_t<_Tp>, decay_t<_Up>>
33        _LIBCPP_HIDE_FROM_ABI static constexpr auto
34        __go(_Tp&& __t, _Up&& __u, __priority_tag<1>)
35            noexcept(noexcept(_VSTD::weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))
36            -> decltype(      _VSTD::weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))
37            { return          _VSTD::weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)); }
38
39        template<class _Tp, class _Up>
40            requires is_same_v<decay_t<_Tp>, decay_t<_Up>>
41        _LIBCPP_HIDE_FROM_ABI static constexpr auto
42        __go(_Tp&& __t, _Up&& __u, __priority_tag<0>)
43            noexcept(noexcept(_VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u) ? weak_ordering::equivalent :
44                              _VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u) ? weak_ordering::less :
45                              weak_ordering::greater))
46            -> decltype(      _VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u) ? weak_ordering::equivalent :
47                              _VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u) ? weak_ordering::less :
48                              weak_ordering::greater)
49        {
50            return            _VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u) ? weak_ordering::equivalent :
51                              _VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u) ? weak_ordering::less :
52                              weak_ordering::greater;
53        }
54
55        template<class _Tp, class _Up>
56        _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Tp&& __t, _Up&& __u) const
57            noexcept(noexcept(__go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<1>())))
58            -> decltype(      __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<1>()))
59            { return          __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<1>()); }
60    };
61} // namespace __compare_weak_order_fallback
62
63inline namespace __cpo {
64    inline constexpr auto compare_weak_order_fallback = __compare_weak_order_fallback::__fn{};
65} // namespace __cpo
66
67#endif // _LIBCPP_STD_VER > 17
68
69_LIBCPP_END_NAMESPACE_STD
70
71#endif // _LIBCPP___COMPARE_COMPARE_WEAK_ORDER_FALLBACK
72