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)(
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_)(
66 requires input_range<Rng1> AND input_iterator<uncvref_t<I2_>> AND
67 indirectly_swappable<iterator_t<Rng1>, uncvref_t<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
76 indirectly_swappable<iterator_t<Rng1>, iterator_t<Rng2>>)
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>
The indirectly_swappable concept.
The sentinel_for concept.