123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- // -*- C++ -*-
- //===----------------------------------------------------------------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #ifndef _LIBCPP_EXPERIMENTAL___MEMORY
- #define _LIBCPP_EXPERIMENTAL___MEMORY
- #include <__memory/allocator_arg_t.h>
- #include <__memory/uses_allocator.h>
- #include <experimental/__config>
- #include <experimental/utility> // for erased_type
- #include <type_traits>
- #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
- # pragma GCC system_header
- #endif
- _LIBCPP_BEGIN_NAMESPACE_LFTS
- template <
- class _Tp, class _Alloc
- , bool = uses_allocator<_Tp, _Alloc>::value
- , bool = __has_allocator_type<_Tp>::value
- >
- struct __lfts_uses_allocator : public false_type {};
- template <class _Tp, class _Alloc>
- struct __lfts_uses_allocator<_Tp, _Alloc, false, false> : public false_type {};
- template <class _Tp, class _Alloc, bool HasAlloc>
- struct __lfts_uses_allocator<_Tp, _Alloc, true, HasAlloc> : public true_type {};
- template <class _Tp, class _Alloc>
- struct __lfts_uses_allocator<_Tp, _Alloc, false, true>
- : public integral_constant<bool
- , is_convertible<_Alloc, typename _Tp::allocator_type>::value
- || is_same<erased_type, typename _Tp::allocator_type>::value
- >
- {};
- template <bool _UsesAlloc, class _Tp, class _Alloc, class ..._Args>
- struct __lfts_uses_alloc_ctor_imp
- {
- static const int value = 0;
- };
- template <class _Tp, class _Alloc, class ..._Args>
- struct __lfts_uses_alloc_ctor_imp<true, _Tp, _Alloc, _Args...>
- {
- static const bool __ic_first
- = is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value;
- static const bool __ic_second =
- conditional<
- __ic_first,
- false_type,
- is_constructible<_Tp, _Args..., _Alloc>
- >::type::value;
- static_assert(__ic_first || __ic_second,
- "Request for uses allocator construction is ill-formed");
- static const int value = __ic_first ? 1 : 2;
- };
- template <class _Tp, class _Alloc, class ..._Args>
- struct __lfts_uses_alloc_ctor
- : integral_constant<int,
- __lfts_uses_alloc_ctor_imp<
- __lfts_uses_allocator<_Tp, _Alloc>::value
- , _Tp, _Alloc, _Args...
- >::value
- >
- {};
- template <class _Tp, class _Allocator, class... _Args>
- inline _LIBCPP_INLINE_VISIBILITY
- void __user_alloc_construct_impl (integral_constant<int, 0>, _Tp *__storage, const _Allocator &, _Args &&... __args )
- {
- new (__storage) _Tp (_VSTD::forward<_Args>(__args)...);
- }
- // FIXME: This should have a version which takes a non-const alloc.
- template <class _Tp, class _Allocator, class... _Args>
- inline _LIBCPP_INLINE_VISIBILITY
- void __user_alloc_construct_impl (integral_constant<int, 1>, _Tp *__storage, const _Allocator &__a, _Args &&... __args )
- {
- new (__storage) _Tp (allocator_arg, __a, _VSTD::forward<_Args>(__args)...);
- }
- // FIXME: This should have a version which takes a non-const alloc.
- template <class _Tp, class _Allocator, class... _Args>
- inline _LIBCPP_INLINE_VISIBILITY
- void __user_alloc_construct_impl (integral_constant<int, 2>, _Tp *__storage, const _Allocator &__a, _Args &&... __args )
- {
- new (__storage) _Tp (_VSTD::forward<_Args>(__args)..., __a);
- }
- template <class _Tp, class _Alloc, class ..._Args>
- inline _LIBCPP_INLINE_VISIBILITY
- void __lfts_user_alloc_construct(
- _Tp * __store, const _Alloc & __a, _Args &&... __args)
- {
- ::std::experimental::fundamentals_v1::__user_alloc_construct_impl(
- typename __lfts_uses_alloc_ctor<_Tp, _Alloc, _Args...>::type()
- , __store, __a, _VSTD::forward<_Args>(__args)...
- );
- }
- _LIBCPP_END_NAMESPACE_LFTS
- #endif /* _LIBCPP_EXPERIMENTAL___MEMORY */
|