1*134723edSLouis Dionne //===----------------------------------------------------------------------===//
2*134723edSLouis Dionne //
3*134723edSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*134723edSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*134723edSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*134723edSLouis Dionne //
7*134723edSLouis Dionne //===----------------------------------------------------------------------===//
8*134723edSLouis Dionne 
9*134723edSLouis Dionne #ifndef _LIBCPP___ALGORITHM_COMP_H
10*134723edSLouis Dionne #define _LIBCPP___ALGORITHM_COMP_H
11*134723edSLouis Dionne 
12*134723edSLouis Dionne #include <__config>
13*134723edSLouis Dionne 
14*134723edSLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
15*134723edSLouis Dionne #  pragma GCC system_header
16*134723edSLouis Dionne #endif
17*134723edSLouis Dionne 
18*134723edSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD
19*134723edSLouis Dionne 
20*134723edSLouis Dionne // I'd like to replace these with _VSTD::equal_to<void>, but can't because:
21*134723edSLouis Dionne //   * That only works with C++14 and later, and
22*134723edSLouis Dionne //   * We haven't included <functional> here.
23*134723edSLouis Dionne template <class _T1, class _T2 = _T1>
24*134723edSLouis Dionne struct __equal_to
25*134723edSLouis Dionne {
operator__equal_to26*134723edSLouis Dionne     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
operator__equal_to27*134723edSLouis Dionne     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;}
operator__equal_to28*134723edSLouis Dionne     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;}
operator__equal_to29*134723edSLouis Dionne     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;}
30*134723edSLouis Dionne };
31*134723edSLouis Dionne 
32*134723edSLouis Dionne template <class _T1>
33*134723edSLouis Dionne struct __equal_to<_T1, _T1>
34*134723edSLouis Dionne {
35*134723edSLouis Dionne     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
36*134723edSLouis Dionne     bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
37*134723edSLouis Dionne };
38*134723edSLouis Dionne 
39*134723edSLouis Dionne template <class _T1>
40*134723edSLouis Dionne struct __equal_to<const _T1, _T1>
41*134723edSLouis Dionne {
42*134723edSLouis Dionne     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
43*134723edSLouis Dionne     bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
44*134723edSLouis Dionne };
45*134723edSLouis Dionne 
46*134723edSLouis Dionne template <class _T1>
47*134723edSLouis Dionne struct __equal_to<_T1, const _T1>
48*134723edSLouis Dionne {
49*134723edSLouis Dionne     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
50*134723edSLouis Dionne     bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
51*134723edSLouis Dionne };
52*134723edSLouis Dionne 
53*134723edSLouis Dionne template <class _T1, class _T2 = _T1>
54*134723edSLouis Dionne struct __less
55*134723edSLouis Dionne {
56*134723edSLouis Dionne     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
57*134723edSLouis Dionne     bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
58*134723edSLouis Dionne 
59*134723edSLouis Dionne     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
60*134723edSLouis Dionne     bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;}
61*134723edSLouis Dionne 
62*134723edSLouis Dionne     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
63*134723edSLouis Dionne     bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;}
64*134723edSLouis Dionne 
65*134723edSLouis Dionne     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
66*134723edSLouis Dionne     bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;}
67*134723edSLouis Dionne };
68*134723edSLouis Dionne 
69*134723edSLouis Dionne template <class _T1>
70*134723edSLouis Dionne struct __less<_T1, _T1>
71*134723edSLouis Dionne {
72*134723edSLouis Dionne     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
73*134723edSLouis Dionne     bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
74*134723edSLouis Dionne };
75*134723edSLouis Dionne 
76*134723edSLouis Dionne template <class _T1>
77*134723edSLouis Dionne struct __less<const _T1, _T1>
78*134723edSLouis Dionne {
79*134723edSLouis Dionne     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
80*134723edSLouis Dionne     bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
81*134723edSLouis Dionne };
82*134723edSLouis Dionne 
83*134723edSLouis Dionne template <class _T1>
84*134723edSLouis Dionne struct __less<_T1, const _T1>
85*134723edSLouis Dionne {
86*134723edSLouis Dionne     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
87*134723edSLouis Dionne     bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
88*134723edSLouis Dionne };
89*134723edSLouis Dionne 
90*134723edSLouis Dionne _LIBCPP_END_NAMESPACE_STD
91*134723edSLouis Dionne 
92*134723edSLouis Dionne #endif // _LIBCPP___ALGORITHM_COMP_H
93