xref: /llvm-project/libcxx/include/__cxx03/__algorithm/comp.h (revision ce7771902dc50d900de639d499a60486b83f70e0)
1e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===//
2e78f53d1SNikolas Klauser //
3e78f53d1SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e78f53d1SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
5e78f53d1SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e78f53d1SNikolas Klauser //
7e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===//
8e78f53d1SNikolas Klauser 
9*ce777190SNikolas Klauser #ifndef _LIBCPP___CXX03___ALGORITHM_COMP_H
10*ce777190SNikolas Klauser #define _LIBCPP___CXX03___ALGORITHM_COMP_H
11e78f53d1SNikolas Klauser 
1273fbae83SNikolas Klauser #include <__cxx03/__config>
1373fbae83SNikolas Klauser #include <__cxx03/__type_traits/desugars_to.h>
14e78f53d1SNikolas Klauser 
15e78f53d1SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
16e78f53d1SNikolas Klauser #  pragma GCC system_header
17e78f53d1SNikolas Klauser #endif
18e78f53d1SNikolas Klauser 
19e78f53d1SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
20e78f53d1SNikolas Klauser 
21e78f53d1SNikolas Klauser struct __equal_to {
22e78f53d1SNikolas Klauser   template <class _T1, class _T2>
23e78f53d1SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool operator()(const _T1& __x, const _T2& __y) const {
24e78f53d1SNikolas Klauser     return __x == __y;
25e78f53d1SNikolas Klauser   }
26e78f53d1SNikolas Klauser };
27e78f53d1SNikolas Klauser 
28e78f53d1SNikolas Klauser template <class _Tp, class _Up>
29e78f53d1SNikolas Klauser inline const bool __desugars_to_v<__equal_tag, __equal_to, _Tp, _Up> = true;
30e78f53d1SNikolas Klauser 
31e78f53d1SNikolas Klauser // The definition is required because __less is part of the ABI, but it's empty
32e78f53d1SNikolas Klauser // because all comparisons should be transparent.
33e78f53d1SNikolas Klauser template <class _T1 = void, class _T2 = _T1>
34e78f53d1SNikolas Klauser struct __less {};
35e78f53d1SNikolas Klauser 
36e78f53d1SNikolas Klauser template <>
37e78f53d1SNikolas Klauser struct __less<void, void> {
38e78f53d1SNikolas Klauser   template <class _Tp, class _Up>
39e78f53d1SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool operator()(const _Tp& __lhs, const _Up& __rhs) const {
40e78f53d1SNikolas Klauser     return __lhs < __rhs;
41e78f53d1SNikolas Klauser   }
42e78f53d1SNikolas Klauser };
43e78f53d1SNikolas Klauser 
44e78f53d1SNikolas Klauser template <class _Tp>
45e78f53d1SNikolas Klauser inline const bool __desugars_to_v<__less_tag, __less<>, _Tp, _Tp> = true;
46e78f53d1SNikolas Klauser 
47e78f53d1SNikolas Klauser _LIBCPP_END_NAMESPACE_STD
48e78f53d1SNikolas Klauser 
49*ce777190SNikolas Klauser #endif // _LIBCPP___CXX03___ALGORITHM_COMP_H
50