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