12#ifndef RANGES_V3_ALGORITHM_RESULT_TYPES_HPP
13#define RANGES_V3_ALGORITHM_RESULT_TYPES_HPP
19#include <range/v3/detail/prologue.hpp>
28#define RANGES_ALGO_RESULT_AUX_2(C, T1, M1, T2, M2) \
29 template(typename X, typename Y)( \
30 requires convertible_to<T1 const &, X> AND convertible_to<T2 const &, Y>) \
31 operator C<X, Y>() const & \
35 template(typename X, typename Y)( \
36 requires convertible_to<T1, X> AND convertible_to<T2, Y>) \
37 operator C<X, Y>() && \
39 return {static_cast<T1 &&>(M1), static_cast<T2 &&>(M2)}; \
41 CPP_broken_friend_member \
42 friend constexpr auto operator==(C<T1, T2> const & x, C<T1, T2> const & y) \
43 -> CPP_broken_friend_ret(bool)( \
44 requires equality_comparable<T1> && equality_comparable<T2>) \
46 return x.M1 == y.M1 && x.M2 == y.M2; \
48 CPP_broken_friend_member \
49 friend constexpr auto operator!=(C<T1, T2> const & x, C<T1, T2> const & y) \
50 -> CPP_broken_friend_ret(bool)( \
51 requires equality_comparable<T1> && equality_comparable<T2>) \
57#define RANGES_ALGO_RESULT_AUX_3(C, T1, M1, T2, M2, T3, M3) \
58 template(typename X, typename Y, typename Z)( \
59 requires convertible_to<T1 const &, X> AND convertible_to<T2 const &, Y> AND \
60 convertible_to<T3 const &, Z>) \
61 operator C<X, Y, Z>() const & \
63 return {M1, M2, M3}; \
65 template(typename X, typename Y, typename Z)( \
66 requires convertible_to<T1, X> AND convertible_to<T2, Y> AND \
67 convertible_to<T3, Z>) \
68 operator C<X, Y, Z>() && \
70 return {static_cast<T1 &&>(M1), static_cast<T2 &&>(M2), static_cast<T3 &&>(M3)}; \
72 CPP_broken_friend_member \
73 friend constexpr auto operator==(C<T1, T2, T3> const & x, C<T1, T2, T3> const & y) \
74 -> CPP_broken_friend_ret(bool)( \
75 requires equality_comparable<T1> && equality_comparable<T2> && \
76 equality_comparable<T3>) \
78 return x.M1 == y.M1 && x.M2 == y.M2 && x.M3 == y.M3; \
80 CPP_broken_friend_member \
81 friend constexpr auto operator!=(C<T1, T2, T3> const & x, C<T1, T2, T3> const & y) \
82 -> CPP_broken_friend_ret(bool)( \
83 requires equality_comparable<T1> && equality_comparable<T2> && \
84 equality_comparable<T3>) \
90 template<
typename I,
typename O>
96 RANGES_ALGO_RESULT_AUX_2(in_out_result, I, in, O, out)
99 template<
typename I1,
typename O>
100 struct in1_out_result
105 RANGES_ALGO_RESULT_AUX_2(in1_out_result, I1, in1, O, out)
108 template<
typename I1,
typename I2>
109 struct in1_in2_result
114 RANGES_ALGO_RESULT_AUX_2(in1_in2_result, I1, in1, I2, in2)
117 template<
typename I,
typename Fun>
123 RANGES_ALGO_RESULT_AUX_2(in_fun_result, I, in, Fun, fun)
126 template<
typename O,
typename Fun>
127 struct out_fun_result
132 RANGES_ALGO_RESULT_AUX_2(out_fun_result, O, out, Fun, fun)
135 template<
typename T,
typename U>
136 struct min_max_result
141 RANGES_ALGO_RESULT_AUX_2(min_max_result, T, min, U, max)
144 template<
typename I1,
typename I2,
typename O>
145 struct in1_in2_out_result
151 RANGES_ALGO_RESULT_AUX_3(in1_in2_out_result, I1, in1, I2, in2, O, out)
154 template<
typename I,
typename O1,
typename O2>
155 struct in_out1_out2_result
161 RANGES_ALGO_RESULT_AUX_3(in_out1_out2_result, I, in, O1, out1, O2, out2)
167#include <range/v3/detail/epilogue.hpp>
not_< empty< find< L, T > > > in
A Boolean integral constant wrapper around true if there is at least one occurrence of T in L.
Definition meta.hpp:3081