File indexing completed on 2025-12-16 10:27:55
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef RANGES_V3_ALGORITHM_SWAP_RANGES_HPP
0014 #define RANGES_V3_ALGORITHM_SWAP_RANGES_HPP
0015
0016 #include <range/v3/range_fwd.hpp>
0017
0018 #include <range/v3/algorithm/result_types.hpp>
0019 #include <range/v3/iterator/concepts.hpp>
0020 #include <range/v3/iterator/traits.hpp>
0021 #include <range/v3/range/access.hpp>
0022 #include <range/v3/range/concepts.hpp>
0023 #include <range/v3/range/dangling.hpp>
0024 #include <range/v3/range/traits.hpp>
0025 #include <range/v3/utility/static_const.hpp>
0026
0027 #include <range/v3/detail/prologue.hpp>
0028
0029 namespace ranges
0030 {
0031
0032
0033 template<typename I1, typename I2>
0034 using swap_ranges_result = detail::in1_in2_result<I1, I2>;
0035
0036 RANGES_FUNC_BEGIN(swap_ranges)
0037
0038
0039 template(typename I1, typename S1, typename I2)(
0040 requires input_iterator<I1> AND sentinel_for<S1, I1> AND
0041 input_iterator<I2> AND indirectly_swappable<I1, I2>)
0042 constexpr swap_ranges_result<I1, I2>
0043 RANGES_FUNC(swap_ranges)(I1 begin1, S1 end1, I2 begin2)
0044 {
0045 for(; begin1 != end1; ++begin1, ++begin2)
0046 ranges::iter_swap(begin1, begin2);
0047 return {begin1, begin2};
0048 }
0049
0050
0051 template(typename I1, typename S1, typename I2, typename S2)(
0052 requires input_iterator<I1> AND sentinel_for<S1, I1> AND
0053 input_iterator<I2> AND sentinel_for<S2, I2> AND
0054 indirectly_swappable<I1, I2>)
0055 constexpr swap_ranges_result<I1, I2> RANGES_FUNC(swap_ranges)(I1 begin1,
0056 S1 end1,
0057 I2 begin2,
0058 S2 end2)
0059 {
0060 for(; begin1 != end1 && begin2 != end2; ++begin1, ++begin2)
0061 ranges::iter_swap(begin1, begin2);
0062 return {begin1, begin2};
0063 }
0064
0065 template(typename Rng1, typename I2_)(
0066 requires input_range<Rng1> AND input_iterator<uncvref_t<I2_>> AND
0067 indirectly_swappable<iterator_t<Rng1>, uncvref_t<I2_>>)
0068 constexpr swap_ranges_result<iterator_t<Rng1>, uncvref_t<I2_>>
0069 RANGES_FUNC(swap_ranges)(Rng1 && rng1, I2_ && begin2)
0070 {
0071 return (*this)(begin(rng1), end(rng1), (I2_ &&) begin2);
0072 }
0073
0074 template(typename Rng1, typename Rng2)(
0075 requires input_range<Rng1> AND input_range<Rng2> AND
0076 indirectly_swappable<iterator_t<Rng1>, iterator_t<Rng2>>)
0077 constexpr swap_ranges_result<borrowed_iterator_t<Rng1>, borrowed_iterator_t<Rng2>>
0078 RANGES_FUNC(swap_ranges)(Rng1 && rng1, Rng2 && rng2)
0079 {
0080 return (*this)(begin(rng1), end(rng1), begin(rng2), end(rng2));
0081 }
0082
0083 RANGES_FUNC_END(swap_ranges)
0084
0085 namespace cpp20
0086 {
0087 using ranges::swap_ranges;
0088 using ranges::swap_ranges_result;
0089 }
0090
0091 }
0092
0093 #include <range/v3/detail/epilogue.hpp>
0094
0095 #endif