1afd5a4f2SNikolas Klauser //===----------------------------------------------------------------------===// 2afd5a4f2SNikolas Klauser // 3afd5a4f2SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4afd5a4f2SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 5afd5a4f2SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6afd5a4f2SNikolas Klauser // 7afd5a4f2SNikolas Klauser //===----------------------------------------------------------------------===// 8afd5a4f2SNikolas Klauser 9afd5a4f2SNikolas Klauser #ifndef _LIBCPP___ALGORITHM_RANGES_LEXICOGRAPHICAL_COMPARE_H 10afd5a4f2SNikolas Klauser #define _LIBCPP___ALGORITHM_RANGES_LEXICOGRAPHICAL_COMPARE_H 11afd5a4f2SNikolas Klauser 12*d07fdf97SNikolas Klauser #include <__algorithm/lexicographical_compare.h> 13*d07fdf97SNikolas Klauser #include <__algorithm/unwrap_range.h> 14afd5a4f2SNikolas Klauser #include <__config> 15afd5a4f2SNikolas Klauser #include <__functional/identity.h> 16afd5a4f2SNikolas Klauser #include <__functional/invoke.h> 17afd5a4f2SNikolas Klauser #include <__functional/ranges_operations.h> 18afd5a4f2SNikolas Klauser #include <__iterator/concepts.h> 19afd5a4f2SNikolas Klauser #include <__iterator/projected.h> 20afd5a4f2SNikolas Klauser #include <__ranges/access.h> 21afd5a4f2SNikolas Klauser #include <__ranges/concepts.h> 22afd5a4f2SNikolas Klauser #include <__utility/move.h> 23afd5a4f2SNikolas Klauser 24afd5a4f2SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 25afd5a4f2SNikolas Klauser # pragma GCC system_header 26afd5a4f2SNikolas Klauser #endif 27afd5a4f2SNikolas Klauser 287b462251SLouis Dionne _LIBCPP_PUSH_MACROS 297b462251SLouis Dionne #include <__undef_macros> 307b462251SLouis Dionne 314f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 32afd5a4f2SNikolas Klauser 33afd5a4f2SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 34afd5a4f2SNikolas Klauser 35afd5a4f2SNikolas Klauser namespace ranges { 36d10dc5a0SChristopher Di Bella struct __lexicographical_compare { 37afd5a4f2SNikolas Klauser template <class _Iter1, class _Sent1, class _Iter2, class _Sent2, class _Proj1, class _Proj2, class _Comp> 38*d07fdf97SNikolas Klauser static _LIBCPP_HIDE_FROM_ABI constexpr bool __lexicographical_compare_unwrap( 395aa03b64SLouis Dionne _Iter1 __first1, 405aa03b64SLouis Dionne _Sent1 __last1, 415aa03b64SLouis Dionne _Iter2 __first2, 425aa03b64SLouis Dionne _Sent2 __last2, 43afd5a4f2SNikolas Klauser _Comp& __comp, 44afd5a4f2SNikolas Klauser _Proj1& __proj1, 45afd5a4f2SNikolas Klauser _Proj2& __proj2) { 46*d07fdf97SNikolas Klauser auto [__first1_un, __last1_un] = std::__unwrap_range(std::move(__first1), std::move(__last1)); 47*d07fdf97SNikolas Klauser auto [__first2_un, __last2_un] = std::__unwrap_range(std::move(__first2), std::move(__last2)); 48*d07fdf97SNikolas Klauser return std::__lexicographical_compare( 49*d07fdf97SNikolas Klauser std::move(__first1_un), 50*d07fdf97SNikolas Klauser std::move(__last1_un), 51*d07fdf97SNikolas Klauser std::move(__first2_un), 52*d07fdf97SNikolas Klauser std::move(__last2_un), 53*d07fdf97SNikolas Klauser __comp, 54*d07fdf97SNikolas Klauser __proj1, 55*d07fdf97SNikolas Klauser __proj2); 56afd5a4f2SNikolas Klauser } 57afd5a4f2SNikolas Klauser 585aa03b64SLouis Dionne template <input_iterator _Iter1, 595aa03b64SLouis Dionne sentinel_for<_Iter1> _Sent1, 605aa03b64SLouis Dionne input_iterator _Iter2, 615aa03b64SLouis Dionne sentinel_for<_Iter2> _Sent2, 62afd5a4f2SNikolas Klauser class _Proj1 = identity, 63afd5a4f2SNikolas Klauser class _Proj2 = identity, 64afd5a4f2SNikolas Klauser indirect_strict_weak_order<projected<_Iter1, _Proj1>, projected<_Iter2, _Proj2>> _Comp = ranges::less> 6583bc7b57SNikolas Klauser [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool operator()( 665aa03b64SLouis Dionne _Iter1 __first1, 675aa03b64SLouis Dionne _Sent1 __last1, 685aa03b64SLouis Dionne _Iter2 __first2, 695aa03b64SLouis Dionne _Sent2 __last2, 70afd5a4f2SNikolas Klauser _Comp __comp = {}, 71afd5a4f2SNikolas Klauser _Proj1 __proj1 = {}, 72afd5a4f2SNikolas Klauser _Proj2 __proj2 = {}) const { 73*d07fdf97SNikolas Klauser return __lexicographical_compare_unwrap( 745aa03b64SLouis Dionne std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2), __comp, __proj1, __proj2); 75afd5a4f2SNikolas Klauser } 76afd5a4f2SNikolas Klauser 77afd5a4f2SNikolas Klauser template <input_range _Range1, 78afd5a4f2SNikolas Klauser input_range _Range2, 79afd5a4f2SNikolas Klauser class _Proj1 = identity, 80afd5a4f2SNikolas Klauser class _Proj2 = identity, 815aa03b64SLouis Dionne indirect_strict_weak_order<projected<iterator_t<_Range1>, _Proj1>, projected<iterator_t<_Range2>, _Proj2>> 825aa03b64SLouis Dionne _Comp = ranges::less> 8383bc7b57SNikolas Klauser [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool operator()( 845aa03b64SLouis Dionne _Range1&& __range1, _Range2&& __range2, _Comp __comp = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) const { 85*d07fdf97SNikolas Klauser return __lexicographical_compare_unwrap( 865aa03b64SLouis Dionne ranges::begin(__range1), 875aa03b64SLouis Dionne ranges::end(__range1), 885aa03b64SLouis Dionne ranges::begin(__range2), 895aa03b64SLouis Dionne ranges::end(__range2), 90afd5a4f2SNikolas Klauser __comp, 91afd5a4f2SNikolas Klauser __proj1, 92afd5a4f2SNikolas Klauser __proj2); 93afd5a4f2SNikolas Klauser } 94afd5a4f2SNikolas Klauser }; 95afd5a4f2SNikolas Klauser 96afd5a4f2SNikolas Klauser inline namespace __cpo { 97d10dc5a0SChristopher Di Bella inline constexpr auto lexicographical_compare = __lexicographical_compare{}; 98afd5a4f2SNikolas Klauser } // namespace __cpo 99afd5a4f2SNikolas Klauser } // namespace ranges 100afd5a4f2SNikolas Klauser 101afd5a4f2SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 102afd5a4f2SNikolas Klauser 1034f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20 104afd5a4f2SNikolas Klauser 1057b462251SLouis Dionne _LIBCPP_POP_MACROS 1067b462251SLouis Dionne 107afd5a4f2SNikolas Klauser #endif // _LIBCPP___ALGORITHM_RANGES_LEXICOGRAPHICAL_COMPARE_H 108