xref: /aosp_15_r20/external/libcxx/include/experimental/__memory (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker// -*- C++ -*-
2*58b9f456SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
3*58b9f456SAndroid Build Coastguard Worker//
4*58b9f456SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
5*58b9f456SAndroid Build Coastguard Worker//
6*58b9f456SAndroid Build Coastguard Worker// This file is dual licensed under the MIT and the University of Illinois Open
7*58b9f456SAndroid Build Coastguard Worker// Source Licenses. See LICENSE.TXT for details.
8*58b9f456SAndroid Build Coastguard Worker//
9*58b9f456SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
10*58b9f456SAndroid Build Coastguard Worker
11*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_EXPERIMENTAL___MEMORY
12*58b9f456SAndroid Build Coastguard Worker#define _LIBCPP_EXPERIMENTAL___MEMORY
13*58b9f456SAndroid Build Coastguard Worker
14*58b9f456SAndroid Build Coastguard Worker#include <experimental/__config>
15*58b9f456SAndroid Build Coastguard Worker#include <experimental/utility> // for erased_type
16*58b9f456SAndroid Build Coastguard Worker#include <__functional_base>
17*58b9f456SAndroid Build Coastguard Worker#include <type_traits>
18*58b9f456SAndroid Build Coastguard Worker
19*58b9f456SAndroid Build Coastguard Worker_LIBCPP_BEGIN_NAMESPACE_LFTS
20*58b9f456SAndroid Build Coastguard Worker
21*58b9f456SAndroid Build Coastguard Workertemplate <
22*58b9f456SAndroid Build Coastguard Worker    class _Tp, class _Alloc
23*58b9f456SAndroid Build Coastguard Worker  , bool = uses_allocator<_Tp, _Alloc>::value
24*58b9f456SAndroid Build Coastguard Worker  , bool = __has_allocator_type<_Tp>::value
25*58b9f456SAndroid Build Coastguard Worker  >
26*58b9f456SAndroid Build Coastguard Workerstruct __lfts_uses_allocator : public false_type {};
27*58b9f456SAndroid Build Coastguard Worker
28*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Alloc>
29*58b9f456SAndroid Build Coastguard Workerstruct __lfts_uses_allocator<_Tp, _Alloc, false, false> : public false_type {};
30*58b9f456SAndroid Build Coastguard Worker
31*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Alloc, bool HasAlloc>
32*58b9f456SAndroid Build Coastguard Workerstruct __lfts_uses_allocator<_Tp, _Alloc, true, HasAlloc> : public true_type {};
33*58b9f456SAndroid Build Coastguard Worker
34*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Alloc>
35*58b9f456SAndroid Build Coastguard Workerstruct __lfts_uses_allocator<_Tp, _Alloc, false, true>
36*58b9f456SAndroid Build Coastguard Worker  : public integral_constant<bool
37*58b9f456SAndroid Build Coastguard Worker    , is_convertible<_Alloc, typename _Tp::allocator_type>::value
38*58b9f456SAndroid Build Coastguard Worker      || is_same<erased_type, typename _Tp::allocator_type>::value
39*58b9f456SAndroid Build Coastguard Worker    >
40*58b9f456SAndroid Build Coastguard Worker{};
41*58b9f456SAndroid Build Coastguard Worker
42*58b9f456SAndroid Build Coastguard Workertemplate <bool _UsesAlloc, class _Tp, class _Alloc, class ..._Args>
43*58b9f456SAndroid Build Coastguard Workerstruct __lfts_uses_alloc_ctor_imp
44*58b9f456SAndroid Build Coastguard Worker{
45*58b9f456SAndroid Build Coastguard Worker    static const int value = 0;
46*58b9f456SAndroid Build Coastguard Worker};
47*58b9f456SAndroid Build Coastguard Worker
48*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Alloc, class ..._Args>
49*58b9f456SAndroid Build Coastguard Workerstruct __lfts_uses_alloc_ctor_imp<true, _Tp, _Alloc, _Args...>
50*58b9f456SAndroid Build Coastguard Worker{
51*58b9f456SAndroid Build Coastguard Worker    static const bool __ic_first
52*58b9f456SAndroid Build Coastguard Worker        = is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value;
53*58b9f456SAndroid Build Coastguard Worker
54*58b9f456SAndroid Build Coastguard Worker    static const bool __ic_second =
55*58b9f456SAndroid Build Coastguard Worker        conditional<
56*58b9f456SAndroid Build Coastguard Worker            __ic_first,
57*58b9f456SAndroid Build Coastguard Worker            false_type,
58*58b9f456SAndroid Build Coastguard Worker            is_constructible<_Tp, _Args..., _Alloc>
59*58b9f456SAndroid Build Coastguard Worker        >::type::value;
60*58b9f456SAndroid Build Coastguard Worker
61*58b9f456SAndroid Build Coastguard Worker    static_assert(__ic_first || __ic_second,
62*58b9f456SAndroid Build Coastguard Worker                  "Request for uses allocator construction is ill-formed");
63*58b9f456SAndroid Build Coastguard Worker
64*58b9f456SAndroid Build Coastguard Worker    static const int value = __ic_first ? 1 : 2;
65*58b9f456SAndroid Build Coastguard Worker};
66*58b9f456SAndroid Build Coastguard Worker
67*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Alloc, class ..._Args>
68*58b9f456SAndroid Build Coastguard Workerstruct __lfts_uses_alloc_ctor
69*58b9f456SAndroid Build Coastguard Worker  : integral_constant<int,
70*58b9f456SAndroid Build Coastguard Worker        __lfts_uses_alloc_ctor_imp<
71*58b9f456SAndroid Build Coastguard Worker            __lfts_uses_allocator<_Tp, _Alloc>::value
72*58b9f456SAndroid Build Coastguard Worker          , _Tp, _Alloc, _Args...
73*58b9f456SAndroid Build Coastguard Worker        >::value
74*58b9f456SAndroid Build Coastguard Worker    >
75*58b9f456SAndroid Build Coastguard Worker{};
76*58b9f456SAndroid Build Coastguard Worker
77*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Alloc, class ..._Args>
78*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
79*58b9f456SAndroid Build Coastguard Workervoid __lfts_user_alloc_construct(
80*58b9f456SAndroid Build Coastguard Worker    _Tp * __store, const _Alloc & __a, _Args &&... __args)
81*58b9f456SAndroid Build Coastguard Worker{
82*58b9f456SAndroid Build Coastguard Worker    _VSTD::__user_alloc_construct_impl(
83*58b9f456SAndroid Build Coastguard Worker        typename __lfts_uses_alloc_ctor<_Tp, _Alloc, _Args...>::type()
84*58b9f456SAndroid Build Coastguard Worker       , __store, __a, _VSTD::forward<_Args>(__args)...
85*58b9f456SAndroid Build Coastguard Worker       );
86*58b9f456SAndroid Build Coastguard Worker}
87*58b9f456SAndroid Build Coastguard Worker
88*58b9f456SAndroid Build Coastguard Worker_LIBCPP_END_NAMESPACE_LFTS
89*58b9f456SAndroid Build Coastguard Worker
90*58b9f456SAndroid Build Coastguard Worker#endif /* _LIBCPP_EXPERIMENTAL___MEMORY */
91