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_EQUAL_RANGE_H 1073ebcabfSKonstantin Varlamov #define _LIBCPP___ALGORITHM_RANGES_EQUAL_RANGE_H 1173ebcabfSKonstantin Varlamov 1273ebcabfSKonstantin Varlamov #include <__algorithm/equal_range.h> 13*0f6364b8SHui Xie #include <__algorithm/iterator_operations.h> 1473ebcabfSKonstantin Varlamov #include <__config> 1573ebcabfSKonstantin Varlamov #include <__functional/identity.h> 1673ebcabfSKonstantin Varlamov #include <__functional/invoke.h> 1773ebcabfSKonstantin Varlamov #include <__functional/ranges_operations.h> 1873ebcabfSKonstantin Varlamov #include <__iterator/concepts.h> 1973ebcabfSKonstantin Varlamov #include <__iterator/iterator_traits.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 <__ranges/subrange.h> 2573ebcabfSKonstantin Varlamov #include <__utility/forward.h> 2673ebcabfSKonstantin Varlamov #include <__utility/move.h> 2773ebcabfSKonstantin Varlamov 2873ebcabfSKonstantin Varlamov #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 2973ebcabfSKonstantin Varlamov # pragma GCC system_header 3073ebcabfSKonstantin Varlamov #endif 3173ebcabfSKonstantin Varlamov 3273ebcabfSKonstantin Varlamov #if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES) 3373ebcabfSKonstantin Varlamov 3473ebcabfSKonstantin Varlamov _LIBCPP_BEGIN_NAMESPACE_STD 3573ebcabfSKonstantin Varlamov 3673ebcabfSKonstantin Varlamov namespace ranges { 3773ebcabfSKonstantin Varlamov namespace __equal_range { 3873ebcabfSKonstantin Varlamov 3973ebcabfSKonstantin Varlamov struct __fn { 40*0f6364b8SHui Xie template < 41*0f6364b8SHui Xie forward_iterator _Iter, 42*0f6364b8SHui Xie sentinel_for<_Iter> _Sent, 43*0f6364b8SHui Xie class _Tp, 44*0f6364b8SHui Xie class _Proj = identity, 4573ebcabfSKonstantin Varlamov indirect_strict_weak_order<const _Tp*, projected<_Iter, _Proj>> _Comp = ranges::less> 46*0f6364b8SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr subrange<_Iter> operator__fn47*0f6364b8SHui Xie operator()(_Iter __first, _Sent __last, const _Tp& __value, _Comp __comp = {}, _Proj __proj = {}) const { 48*0f6364b8SHui Xie auto __ret = std::__equal_range<_RangeAlgPolicy>( 49*0f6364b8SHui Xie std::move(__first), std::move(__last), __value, __comp, __proj); 50*0f6364b8SHui Xie return {std::move(__ret.first), std::move(__ret.second)}; 5173ebcabfSKonstantin Varlamov } 5273ebcabfSKonstantin Varlamov 53*0f6364b8SHui Xie template < 54*0f6364b8SHui Xie forward_range _Range, 55*0f6364b8SHui Xie class _Tp, 56*0f6364b8SHui Xie class _Proj = identity, 5773ebcabfSKonstantin Varlamov indirect_strict_weak_order<const _Tp*, projected<iterator_t<_Range>, _Proj>> _Comp = ranges::less> 58*0f6364b8SHui Xie _LIBCPP_HIDE_FROM_ABI constexpr borrowed_subrange_t<_Range> operator__fn59*0f6364b8SHui Xie operator()(_Range&& __range, const _Tp& __value, _Comp __comp = {}, _Proj __proj = {}) const { 60*0f6364b8SHui Xie auto __ret = std::__equal_range<_RangeAlgPolicy>( 61*0f6364b8SHui Xie ranges::begin(__range), ranges::end(__range), __value, __comp, __proj); 62*0f6364b8SHui Xie return {std::move(__ret.first), std::move(__ret.second)}; 6373ebcabfSKonstantin Varlamov } 6473ebcabfSKonstantin Varlamov }; 6573ebcabfSKonstantin Varlamov 6673ebcabfSKonstantin Varlamov } // namespace __equal_range 6773ebcabfSKonstantin Varlamov 6873ebcabfSKonstantin Varlamov inline namespace __cpo { 6973ebcabfSKonstantin Varlamov inline constexpr auto equal_range = __equal_range::__fn{}; 7073ebcabfSKonstantin Varlamov } // namespace __cpo 7173ebcabfSKonstantin Varlamov } // namespace ranges 7273ebcabfSKonstantin Varlamov 7373ebcabfSKonstantin Varlamov _LIBCPP_END_NAMESPACE_STD 7473ebcabfSKonstantin Varlamov 7573ebcabfSKonstantin Varlamov #endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES) 7673ebcabfSKonstantin Varlamov 7773ebcabfSKonstantin Varlamov #endif // _LIBCPP___ALGORITHM_RANGES_EQUAL_RANGE_H 78