Horizon
upper_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_UPPER_BOUND_N_HPP
15 #define RANGES_V3_ALGORITHM_AUX_UPPER_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, val, i); }
34  template<typename Pred, typename Val>
35  struct upper_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_, val_, static_cast<T &&>(t));
44  }
45  };
46 
47  template<typename Pred, typename Val>
48  constexpr upper_bound_predicate<Pred, Val> make_upper_bound_predicate(Pred & pred,
49  Val & val)
50  {
51  return {pred, val};
52  }
53  } // namespace detail
55 
56  namespace aux
57  {
59  {
65  template(typename I, typename V, typename C = less, typename P = identity)(
66  requires forward_iterator<I> AND
67  indirect_strict_weak_order<C, V const *, projected<I, P>>)
68  constexpr I operator()(I first,
69  iter_difference_t<I> d,
70  V const & val,
71  C pred = C{},
72  P proj = P{}) const
73  {
74  return partition_point_n(std::move(first),
75  d,
76  detail::make_upper_bound_predicate(pred, val),
77  std::move(proj));
78  }
79  };
80 
81  RANGES_INLINE_VARIABLE(upper_bound_n_fn, upper_bound_n)
82  } // namespace aux
83 } // namespace ranges
84 
85 #include <range/v3/detail/epilogue.hpp>
86 
87 #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: upper_bound_n.hpp:59
Definition: identity.hpp:25