13 #ifndef RANGES_V3_ALGORITHM_SWAP_RANGES_HPP
14 #define RANGES_V3_ALGORITHM_SWAP_RANGES_HPP
18 #include <range/v3/algorithm/result_types.hpp>
25 #include <range/v3/utility/static_const.hpp>
27 #include <range/v3/detail/prologue.hpp>
33 template<
typename I1,
typename I2>
34 using swap_ranges_result = detail::in1_in2_result<I1, I2>;
36 RANGES_FUNC_BEGIN(swap_ranges)
39 template(typename I1, typename S1, typename I2)(
42 constexpr swap_ranges_result<I1, I2>
43 RANGES_FUNC(swap_ranges)(I1 begin1, S1 end1, I2 begin2)
45 for(; begin1 != end1; ++begin1, ++begin2)
46 ranges::iter_swap(begin1, begin2);
47 return {begin1, begin2};
51 template(
typename I1,
typename S1,
typename I2,
typename S2)(
52 requires input_iterator<I1> AND sentinel_for<S1, I1> AND
53 input_iterator<I2> AND sentinel_for<S2, I2> AND
54 indirectly_swappable<I1, I2>)
55 constexpr swap_ranges_result<I1, I2> RANGES_FUNC(swap_ranges)(I1 begin1,
60 for(; begin1 != end1 && begin2 != end2; ++begin1, ++begin2)
61 ranges::iter_swap(begin1, begin2);
62 return {begin1, begin2};
65 template(
typename Rng1,
typename I2_)(
68 constexpr swap_ranges_result<iterator_t<Rng1>, uncvref_t<I2_>>
69 RANGES_FUNC(swap_ranges)(Rng1 && rng1, I2_ && begin2)
71 return (*
this)(begin(rng1), end(rng1), (I2_ &&) begin2);
74 template(
typename Rng1,
typename Rng2)(
75 requires input_range<Rng1> AND input_range<Rng2> AND
77 constexpr swap_ranges_result<borrowed_iterator_t<Rng1>, borrowed_iterator_t<Rng2>>
78 RANGES_FUNC(swap_ranges)(Rng1 && rng1, Rng2 && rng2)
80 return (*
this)(begin(rng1), end(rng1), begin(rng2), end(rng2));
83 RANGES_FUNC_END(swap_ranges)
87 using ranges::swap_ranges;
88 using ranges::swap_ranges_result;
93 #include <range/v3/detail/epilogue.hpp>
CPP_concept indirectly_swappable
\concept indirectly_swappable
Definition: concepts.hpp:816
CPP_concept sentinel_for
\concept sentinel_for
Definition: concepts.hpp:306
CPP_concept input_iterator
\concept input_iterator
Definition: concepts.hpp:362