173ebcabfSKonstantin Varlamov //===----------------------------------------------------------------------===// 273ebcabfSKonstantin Varlamov // 373ebcabfSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 473ebcabfSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information. 573ebcabfSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 673ebcabfSKonstantin Varlamov // 773ebcabfSKonstantin Varlamov //===----------------------------------------------------------------------===// 873ebcabfSKonstantin Varlamov 973ebcabfSKonstantin Varlamov #ifndef _LIBCPP___ALGORITHM_RANGES_IS_HEAP_UNTIL_H 1073ebcabfSKonstantin Varlamov #define _LIBCPP___ALGORITHM_RANGES_IS_HEAP_UNTIL_H 1173ebcabfSKonstantin Varlamov 1273ebcabfSKonstantin Varlamov #include <__algorithm/is_heap_until.h> 1373ebcabfSKonstantin Varlamov #include <__algorithm/make_projected.h> 1473ebcabfSKonstantin Varlamov #include <__config> 1573ebcabfSKonstantin Varlamov #include <__functional/identity.h> 1673ebcabfSKonstantin Varlamov #include <__functional/ranges_operations.h> 1773ebcabfSKonstantin Varlamov #include <__iterator/concepts.h> 1873ebcabfSKonstantin Varlamov #include <__iterator/iterator_traits.h> 19d406c649SKonstantin Varlamov #include <__iterator/next.h> 2073ebcabfSKonstantin Varlamov #include <__iterator/projected.h> 2173ebcabfSKonstantin Varlamov #include <__ranges/access.h> 2273ebcabfSKonstantin Varlamov #include <__ranges/concepts.h> 2373ebcabfSKonstantin Varlamov #include <__ranges/dangling.h> 2473ebcabfSKonstantin Varlamov #include <__utility/move.h> 2573ebcabfSKonstantin Varlamov 2673ebcabfSKonstantin Varlamov #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 2773ebcabfSKonstantin Varlamov # pragma GCC system_header 2873ebcabfSKonstantin Varlamov #endif 2973ebcabfSKonstantin Varlamov 307b462251SLouis Dionne _LIBCPP_PUSH_MACROS 317b462251SLouis Dionne #include <__undef_macros> 327b462251SLouis Dionne 334f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 3473ebcabfSKonstantin Varlamov 3573ebcabfSKonstantin Varlamov _LIBCPP_BEGIN_NAMESPACE_STD 3673ebcabfSKonstantin Varlamov 3773ebcabfSKonstantin Varlamov namespace ranges { 38*d10dc5a0SChristopher Di Bella struct __is_heap_until { 39d406c649SKonstantin Varlamov template <class _Iter, class _Sent, class _Proj, class _Comp> 405aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr static _Iter 415aa03b64SLouis Dionne __is_heap_until_fn_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { 42d406c649SKonstantin Varlamov auto __last_iter = ranges::next(__first, __last); 43db7d7959SKonstantin Varlamov auto&& __projected_comp = std::__make_projected(__comp, __proj); 44d406c649SKonstantin Varlamov 45d406c649SKonstantin Varlamov return std::__is_heap_until(std::move(__first), std::move(__last_iter), __projected_comp); 46d406c649SKonstantin Varlamov } 47d406c649SKonstantin Varlamov 485aa03b64SLouis Dionne template <random_access_iterator _Iter, 495aa03b64SLouis Dionne sentinel_for<_Iter> _Sent, 505aa03b64SLouis Dionne class _Proj = identity, 5173ebcabfSKonstantin Varlamov indirect_strict_weak_order<projected<_Iter, _Proj>> _Comp = ranges::less> 5283bc7b57SNikolas Klauser [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _Iter 535aa03b64SLouis Dionne operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { 54d406c649SKonstantin Varlamov return __is_heap_until_fn_impl(std::move(__first), std::move(__last), __comp, __proj); 5573ebcabfSKonstantin Varlamov } 5673ebcabfSKonstantin Varlamov 575aa03b64SLouis Dionne template <random_access_range _Range, 585aa03b64SLouis Dionne class _Proj = identity, 5973ebcabfSKonstantin Varlamov indirect_strict_weak_order<projected<iterator_t<_Range>, _Proj>> _Comp = ranges::less> 6083bc7b57SNikolas Klauser [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr borrowed_iterator_t<_Range> 615aa03b64SLouis Dionne operator()(_Range&& __range, _Comp __comp = {}, _Proj __proj = {}) const { 62d406c649SKonstantin Varlamov return __is_heap_until_fn_impl(ranges::begin(__range), ranges::end(__range), __comp, __proj); 6373ebcabfSKonstantin Varlamov } 6473ebcabfSKonstantin Varlamov }; 6573ebcabfSKonstantin Varlamov 6673ebcabfSKonstantin Varlamov inline namespace __cpo { 67*d10dc5a0SChristopher Di Bella inline constexpr auto is_heap_until = __is_heap_until{}; 6873ebcabfSKonstantin Varlamov } // namespace __cpo 6973ebcabfSKonstantin Varlamov } // namespace ranges 7073ebcabfSKonstantin Varlamov 7173ebcabfSKonstantin Varlamov _LIBCPP_END_NAMESPACE_STD 7273ebcabfSKonstantin Varlamov 734f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20 7473ebcabfSKonstantin Varlamov 757b462251SLouis Dionne _LIBCPP_POP_MACROS 767b462251SLouis Dionne 7773ebcabfSKonstantin Varlamov #endif // _LIBCPP___ALGORITHM_RANGES_IS_HEAP_UNTIL_H 78