1f4fb72e6SNikolas Klauser //===----------------------------------------------------------------------===//
2f4fb72e6SNikolas Klauser //
3f4fb72e6SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f4fb72e6SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
5f4fb72e6SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f4fb72e6SNikolas Klauser //
7f4fb72e6SNikolas Klauser //===----------------------------------------------------------------------===//
8f4fb72e6SNikolas Klauser
9f4fb72e6SNikolas Klauser #ifndef _LIBCPP___MEMORY_SWAP_ALLOCATOR_H
10f4fb72e6SNikolas Klauser #define _LIBCPP___MEMORY_SWAP_ALLOCATOR_H
11f4fb72e6SNikolas Klauser
12f4fb72e6SNikolas Klauser #include <__config>
13f4fb72e6SNikolas Klauser #include <__memory/allocator_traits.h>
14f4fb72e6SNikolas Klauser #include <__type_traits/integral_constant.h>
15f51c9153SKonstantin Varlamov #include <__type_traits/is_swappable.h>
16f4fb72e6SNikolas Klauser #include <__utility/swap.h>
17f4fb72e6SNikolas Klauser
18f4fb72e6SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
19f4fb72e6SNikolas Klauser # pragma GCC system_header
20f4fb72e6SNikolas Klauser #endif
21f4fb72e6SNikolas Klauser
22f4fb72e6SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
23f4fb72e6SNikolas Klauser
24f4fb72e6SNikolas Klauser template <typename _Alloc>
__swap_allocator(_Alloc & __a1,_Alloc & __a2,true_type)255146b57bSNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void __swap_allocator(_Alloc& __a1, _Alloc& __a2, true_type)
264f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 14
27f4fb72e6SNikolas Klauser _NOEXCEPT
28f4fb72e6SNikolas Klauser #else
29*cb417401SNikolas Klauser _NOEXCEPT_(__is_nothrow_swappable_v<_Alloc>)
30f4fb72e6SNikolas Klauser #endif
31f4fb72e6SNikolas Klauser {
3277a00c0dSLouis Dionne using std::swap;
33f4fb72e6SNikolas Klauser swap(__a1, __a2);
34f4fb72e6SNikolas Klauser }
35f4fb72e6SNikolas Klauser
36f4fb72e6SNikolas Klauser template <typename _Alloc>
375146b57bSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void
__swap_allocator(_Alloc &,_Alloc &,false_type)38f4fb72e6SNikolas Klauser __swap_allocator(_Alloc&, _Alloc&, false_type) _NOEXCEPT {}
39f4fb72e6SNikolas Klauser
40f4fb72e6SNikolas Klauser template <typename _Alloc>
__swap_allocator(_Alloc & __a1,_Alloc & __a2)415146b57bSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void __swap_allocator(_Alloc& __a1, _Alloc& __a2)
424f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 14
43f4fb72e6SNikolas Klauser _NOEXCEPT
44f4fb72e6SNikolas Klauser #else
45*cb417401SNikolas Klauser _NOEXCEPT_(__is_nothrow_swappable_v<_Alloc>)
46f4fb72e6SNikolas Klauser #endif
47f4fb72e6SNikolas Klauser {
4877a00c0dSLouis Dionne std::__swap_allocator(
49f4fb72e6SNikolas Klauser __a1, __a2, integral_constant<bool, allocator_traits<_Alloc>::propagate_on_container_swap::value>());
50f4fb72e6SNikolas Klauser }
51f4fb72e6SNikolas Klauser
52f4fb72e6SNikolas Klauser _LIBCPP_END_NAMESPACE_STD
53f4fb72e6SNikolas Klauser
54f4fb72e6SNikolas Klauser #endif // _LIBCPP___MEMORY_SWAP_ALLOCATOR_H
55