14#ifndef RANGES_V3_ALGORITHM_EQUAL_RANGE_HPP
15#define RANGES_V3_ALGORITHM_EQUAL_RANGE_HPP
29#include <range/v3/utility/static_const.hpp>
32#include <range/v3/detail/prologue.hpp>
38 RANGES_FUNC_BEGIN(equal_range)
45 typename P = identity)(
46 requires forward_iterator<I> AND sentinel_for<S, I> AND
47 indirect_strict_weak_order<C, V
const *, projected<I, P>>)
48 constexpr subrange<I> RANGES_FUNC(equal_range)(
49 I
first, S last, V
const & val, C pred = C{}, P proj = P{})
51 if(RANGES_CONSTEXPR_IF(sized_sentinel_for<S, I>))
53 auto const len = distance(first, last);
54 return aux::equal_range_n(
55 std::move(first), len, val, std::move(pred), std::move(proj));
62 auto dist = iter_difference_t<I>{1};
66 auto d = advance(mid, dist, last);
71 return aux::equal_range_n(
72 std::move(first), dist, val, ranges::ref(pred), ranges::ref(proj));
76 auto && pv =
invoke(proj, (
decltype(v) &&)v);
79 return aux::equal_range_n(
80 std::move(first), dist, val, ranges::ref(pred), ranges::ref(proj));
82 else if(!
invoke(pred, pv, val))
88 std::move(first), dist, val, ranges::ref(pred), ranges::ref(proj)),
89 upper_bound(std::move(mid),
96 first = std::move(mid);
103 template(
typename Rng,
typename V,
typename C =
less,
typename P = identity)(
104 requires forward_range<Rng> AND
105 indirect_strict_weak_order<C, V
const *, projected<iterator_t<Rng>, P>>)
106 constexpr borrowed_subrange_t<Rng>
107 RANGES_FUNC(equal_range)(Rng && rng, V
const & val, C pred = C{}, P proj = P{})
109 if(RANGES_CONSTEXPR_IF(sized_range<Rng>))
111 auto const len = distance(rng);
112 return aux::equal_range_n(
113 begin(rng), len, val, std::move(pred), std::move(proj));
116 return (*
this)(begin(rng), end(rng), val, std::move(pred), std::move(proj));
119 RANGES_FUNC_END(equal_range)
123 using ranges::equal_range;
128#include <range/v3/detail/epilogue.hpp>
typename Fn::template invoke< Args... > invoke
Evaluate the invocable Fn with the arguments Args.
Definition meta.hpp:541
front< Pair > first
Retrieve the first element of the pair Pair.
Definition meta.hpp:2251
bool_<(T::type::value< U::type::value)> less
A Boolean integral constant wrapper around true if T::type::value is less than U::type::value; false,...
Definition meta.hpp:255