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