1134723edSLouis Dionne //===----------------------------------------------------------------------===// 2134723edSLouis Dionne // 3134723edSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4134723edSLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 5134723edSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6134723edSLouis Dionne // 7134723edSLouis Dionne //===----------------------------------------------------------------------===// 8134723edSLouis Dionne 9134723edSLouis Dionne #ifndef _LIBCPP___ALGORITHM_COMP_H 10134723edSLouis Dionne #define _LIBCPP___ALGORITHM_COMP_H 11134723edSLouis Dionne 12134723edSLouis Dionne #include <__config> 13f5960c16SNikolas Klauser #include <__type_traits/desugars_to.h> 14d07fdf97SNikolas Klauser #include <__type_traits/is_integral.h> 15134723edSLouis Dionne 16134723edSLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 17134723edSLouis Dionne # pragma GCC system_header 18134723edSLouis Dionne #endif 19134723edSLouis Dionne 20134723edSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD 21134723edSLouis Dionne 22e07ca2aeSAlvin Wong struct __equal_to { 23e07ca2aeSAlvin Wong template <class _T1, class _T2> 24e07ca2aeSAlvin Wong _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool operator()(const _T1& __x, const _T2& __y) const { 25e07ca2aeSAlvin Wong return __x == __y; 26e07ca2aeSAlvin Wong } 27134723edSLouis Dionne }; 28134723edSLouis Dionne 29aea7929bSAnton Rydahl template <class _Tp, class _Up> 30f5960c16SNikolas Klauser inline const bool __desugars_to_v<__equal_tag, __equal_to, _Tp, _Up> = true; 31b4ecfd3cSNikolas Klauser 3288632e48SNikolas Klauser // The definition is required because __less is part of the ABI, but it's empty 3388632e48SNikolas Klauser // because all comparisons should be transparent. 3488632e48SNikolas Klauser template <class _T1 = void, class _T2 = _T1> 3588632e48SNikolas Klauser struct __less {}; 36134723edSLouis Dionne 3788632e48SNikolas Klauser template <> 3888632e48SNikolas Klauser struct __less<void, void> { 3988632e48SNikolas Klauser template <class _Tp, class _Up> 4088632e48SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool operator()(const _Tp& __lhs, const _Up& __rhs) const { 4188632e48SNikolas Klauser return __lhs < __rhs; 4288632e48SNikolas Klauser } 43134723edSLouis Dionne }; 44134723edSLouis Dionne 45935e6991SNikolas Klauser template <class _Tp> 46*0fb76baeSNikolas Klauser inline const bool __desugars_to_v<__less_tag, __less<>, _Tp, _Tp> = true; 47*0fb76baeSNikolas Klauser 48*0fb76baeSNikolas Klauser template <class _Tp> 49d07fdf97SNikolas Klauser inline const bool __desugars_to_v<__totally_ordered_less_tag, __less<>, _Tp, _Tp> = is_integral<_Tp>::value; 50935e6991SNikolas Klauser 51134723edSLouis Dionne _LIBCPP_END_NAMESPACE_STD 52134723edSLouis Dionne 53134723edSLouis Dionne #endif // _LIBCPP___ALGORITHM_COMP_H 54