Horizon
lower_bound_n.hpp
Go to the documentation of this file.
1 // Range v3 library
3 //
4 // Copyright Eric Niebler 2014-present
5 // Copyright Casey Carter 2016
6 //
7 // Use, modification and distribution is subject to the
8 // Boost Software License, Version 1.0. (See accompanying
9 // file LICENSE_1_0.txt or copy at
10 // http://www.boost.org/LICENSE_1_0.txt)
11 //
12 // Project home: https://github.com/ericniebler/range-v3
13 //
14 #ifndef RANGES_V3_ALGORITHM_AUX_LOWER_BOUND_N_HPP
15 #define RANGES_V3_ALGORITHM_AUX_LOWER_BOUND_N_HPP
16 
17 #include <range/v3/range_fwd.hpp>
18 
24 #include <range/v3/utility/static_const.hpp>
25 
26 #include <range/v3/detail/prologue.hpp>
27 
28 namespace ranges
29 {
31  namespace detail
32  {
33  // [&](auto&& i){ return invoke(pred, i, val); }
34  template<typename Pred, typename Val>
35  struct lower_bound_predicate
36  {
37  Pred & pred_;
38  Val & val_;
39 
40  template<typename T>
41  constexpr bool operator()(T && t) const
42  {
43  return invoke(pred_, static_cast<T &&>(t), val_);
44  }
45  };
46 
47  template<typename Pred, typename Val>
48  constexpr lower_bound_predicate<Pred, Val> make_lower_bound_predicate(Pred & pred,
49  Val & val)
50  {
51  return {pred, val};
52  }
53  } // namespace detail
55 
56  namespace aux
57  {
59  {
60  template(typename I, typename V, typename C = less, typename P = identity)(
61  requires forward_iterator<I> AND
62  indirect_strict_weak_order<C, V const *, projected<I, P>>)
63  constexpr I operator()(I first,
64  iter_difference_t<I> d,
65  V const & val,
66  C pred = C{},
67  P proj = P{}) const
68  {
69  return partition_point_n(std::move(first),
70  d,
71  detail::make_lower_bound_predicate(pred, val),
72  std::move(proj));
73  }
74  };
75 
77  } // namespace aux
78 } // namespace ranges
79 
80 #include <range/v3/detail/epilogue.hpp>
81 
82 #endif
CPP_concept indirect_strict_weak_order
\concept indirect_strict_weak_order
Definition: concepts.hpp:689
RANGES_INLINE_VARIABLE(detail::to_container_fn< detail::from_range< std::vector >>, to_vector) template< template< typename... > class ContT > auto to(RANGES_HIDDEN_DETAIL(detail
For initializing a container of the specified type with the elements of an Range.
Definition: conversion.hpp:399
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
Definition: lower_bound_n.hpp:59
Definition: identity.hpp:25