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