xref: /llvm-project/libcxx/include/__memory/swap_allocator.h (revision cb417401879ce70b441a999c4a30f7b64b8d426b)
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