19d905319SNikolas Klauser //===----------------------------------------------------------------------===// 29d905319SNikolas Klauser // 39d905319SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 49d905319SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 59d905319SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 69d905319SNikolas Klauser // 79d905319SNikolas Klauser //===----------------------------------------------------------------------===// 89d905319SNikolas Klauser 99d905319SNikolas Klauser #ifndef _LIBCPP___ALGORITHM_RANGES_SWAP_RANGES_H 109d905319SNikolas Klauser #define _LIBCPP___ALGORITHM_RANGES_SWAP_RANGES_H 119d905319SNikolas Klauser 129d905319SNikolas Klauser #include <__algorithm/in_in_result.h> 1336c746caSKonstantin Varlamov #include <__algorithm/iterator_operations.h> 1436c746caSKonstantin Varlamov #include <__algorithm/swap_ranges.h> 159d905319SNikolas Klauser #include <__config> 169d905319SNikolas Klauser #include <__iterator/concepts.h> 179d905319SNikolas Klauser #include <__iterator/iter_swap.h> 189d905319SNikolas Klauser #include <__ranges/access.h> 199d905319SNikolas Klauser #include <__ranges/concepts.h> 209d905319SNikolas Klauser #include <__ranges/dangling.h> 219d905319SNikolas Klauser #include <__utility/move.h> 229d905319SNikolas Klauser 239d905319SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 249d905319SNikolas Klauser # pragma GCC system_header 259d905319SNikolas Klauser #endif 269d905319SNikolas Klauser 277b462251SLouis Dionne _LIBCPP_PUSH_MACROS 287b462251SLouis Dionne #include <__undef_macros> 297b462251SLouis Dionne 304f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 319d905319SNikolas Klauser 329d905319SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 339d905319SNikolas Klauser 349d905319SNikolas Klauser namespace ranges { 359d905319SNikolas Klauser 369d905319SNikolas Klauser template <class _I1, class _I2> 379d905319SNikolas Klauser using swap_ranges_result = in_in_result<_I1, _I2>; 389d905319SNikolas Klauser 39*d10dc5a0SChristopher Di Bella struct __swap_ranges { 405aa03b64SLouis Dionne template <input_iterator _I1, sentinel_for<_I1> _S1, input_iterator _I2, sentinel_for<_I2> _S2> 419d905319SNikolas Klauser requires indirectly_swappable<_I1, _I2> 429d905319SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr swap_ranges_result<_I1, _I2> 439d905319SNikolas Klauser operator()(_I1 __first1, _S1 __last1, _I2 __first2, _S2 __last2) const { 4436c746caSKonstantin Varlamov auto __ret = std::__swap_ranges<_RangeAlgPolicy>( 4536c746caSKonstantin Varlamov std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2)); 4636c746caSKonstantin Varlamov return {std::move(__ret.first), std::move(__ret.second)}; 479d905319SNikolas Klauser } 489d905319SNikolas Klauser 499d905319SNikolas Klauser template <input_range _R1, input_range _R2> 509d905319SNikolas Klauser requires indirectly_swappable<iterator_t<_R1>, iterator_t<_R2>> 515aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr swap_ranges_result<borrowed_iterator_t<_R1>, borrowed_iterator_t<_R2>> 529d905319SNikolas Klauser operator()(_R1&& __r1, _R2&& __r2) const { 535aa03b64SLouis Dionne return operator()(ranges::begin(__r1), ranges::end(__r1), ranges::begin(__r2), ranges::end(__r2)); 549d905319SNikolas Klauser } 559d905319SNikolas Klauser }; 569d905319SNikolas Klauser 579d905319SNikolas Klauser inline namespace __cpo { 58*d10dc5a0SChristopher Di Bella inline constexpr auto swap_ranges = __swap_ranges{}; 599d905319SNikolas Klauser } // namespace __cpo 609d905319SNikolas Klauser } // namespace ranges 619d905319SNikolas Klauser 629d905319SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 639d905319SNikolas Klauser 644f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20 659d905319SNikolas Klauser 667b462251SLouis Dionne _LIBCPP_POP_MACROS 677b462251SLouis Dionne 689d905319SNikolas Klauser #endif // _LIBCPP___ALGORITHM_RANGES_SWAP_RANGES_H 69