Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 10:27:55

0001 /// \file
0002 // Range v3 library
0003 //
0004 //  Copyright Eric Niebler 2013-present
0005 //
0006 //  Use, modification and distribution is subject to the
0007 //  Boost Software License, Version 1.0. (See accompanying
0008 //  file LICENSE_1_0.txt or copy at
0009 //  http://www.boost.org/LICENSE_1_0.txt)
0010 //
0011 // Project home: https://github.com/ericniebler/range-v3
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     /// \addtogroup group-algorithms
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         /// \brief function template \c swap_ranges
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         /// \overload
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     } // namespace cpp20
0090     /// @}
0091 } // namespace ranges
0092 
0093 #include <range/v3/detail/epilogue.hpp>
0094 
0095 #endif