diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -11,6 +11,9 @@ __hash_table __libcpp_version __locale + __memory/allocator_traits.h + __memory/base.h + __memory/pointer_traits.h __mutex_base __node_handle __nullptr diff --git a/libcxx/include/__memory/allocator_traits.h b/libcxx/include/__memory/allocator_traits.h new file mode 100644 --- /dev/null +++ b/libcxx/include/__memory/allocator_traits.h @@ -0,0 +1,589 @@ +// -*- 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___MEMORY_ALLOCATOR_TRAITS_H +#define _LIBCPP___MEMORY_ALLOCATOR_TRAITS_H + +#include <__config> +#include <__memory/base.h> +#include <__memory/pointer_traits.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct __has_pointer_type : false_type {}; + +template +struct __has_pointer_type<_Tp, + typename __void_t::type> : true_type {}; + +namespace __pointer_type_imp +{ + +template ::value> +struct __pointer_type +{ + typedef _LIBCPP_NODEBUG_TYPE typename _Dp::pointer type; +}; + +template +struct __pointer_type<_Tp, _Dp, false> +{ + typedef _LIBCPP_NODEBUG_TYPE _Tp* type; +}; + +} // __pointer_type_imp + +template +struct __pointer_type +{ + typedef _LIBCPP_NODEBUG_TYPE typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type; +}; + +template +struct __has_const_pointer : false_type {}; + +template +struct __has_const_pointer<_Tp, + typename __void_t::type> : true_type {}; + +template ::value> +struct __const_pointer +{ + typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::const_pointer type; +}; + +template +struct __const_pointer<_Tp, _Ptr, _Alloc, false> +{ +#ifndef _LIBCPP_CXX03_LANG + typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind type; +#else + typedef typename pointer_traits<_Ptr>::template rebind::other type; +#endif +}; + +template +struct __has_void_pointer : false_type {}; + +template +struct __has_void_pointer<_Tp, + typename __void_t::type> : true_type {}; + +template ::value> +struct __void_pointer +{ + typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::void_pointer type; +}; + +template +struct __void_pointer<_Ptr, _Alloc, false> +{ +#ifndef _LIBCPP_CXX03_LANG + typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind type; +#else + typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind::other type; +#endif +}; + +template +struct __has_const_void_pointer : false_type {}; + +template +struct __has_const_void_pointer<_Tp, + typename __void_t::type> : true_type {}; + +template ::value> +struct __const_void_pointer +{ + typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::const_void_pointer type; +}; + +template +struct __const_void_pointer<_Ptr, _Alloc, false> +{ +#ifndef _LIBCPP_CXX03_LANG + typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind type; +#else + typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind::other type; +#endif +}; + +template +struct __has_size_type : false_type {}; + +template +struct __has_size_type<_Tp, + typename __void_t::type> : true_type {}; + +template ::value> +struct __size_type +{ + typedef _LIBCPP_NODEBUG_TYPE typename make_unsigned<_DiffType>::type type; +}; + +template +struct __size_type<_Alloc, _DiffType, true> +{ + typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::size_type type; +}; + +template +struct __has_propagate_on_container_copy_assignment : false_type {}; + +template +struct __has_propagate_on_container_copy_assignment<_Tp, + typename __void_t::type> + : true_type {}; + +template ::value> +struct __propagate_on_container_copy_assignment +{ + typedef _LIBCPP_NODEBUG_TYPE false_type type; +}; + +template +struct __propagate_on_container_copy_assignment<_Alloc, true> +{ + typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::propagate_on_container_copy_assignment type; +}; + +template +struct __has_propagate_on_container_move_assignment : false_type {}; + +template +struct __has_propagate_on_container_move_assignment<_Tp, + typename __void_t::type> + : true_type {}; + +template ::value> +struct __propagate_on_container_move_assignment +{ + typedef false_type type; +}; + +template +struct __propagate_on_container_move_assignment<_Alloc, true> +{ + typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::propagate_on_container_move_assignment type; +}; + +template +struct __has_propagate_on_container_swap : false_type {}; + +template +struct __has_propagate_on_container_swap<_Tp, + typename __void_t::type> + : true_type {}; + +template ::value> +struct __propagate_on_container_swap +{ + typedef false_type type; +}; + +template +struct __propagate_on_container_swap<_Alloc, true> +{ + typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::propagate_on_container_swap type; +}; + +template +struct __has_is_always_equal : false_type {}; + +template +struct __has_is_always_equal<_Tp, + typename __void_t::type> + : true_type {}; + +template ::value> +struct __is_always_equal +{ + typedef _LIBCPP_NODEBUG_TYPE typename _VSTD::is_empty<_Alloc>::type type; +}; + +template +struct __is_always_equal<_Alloc, true> +{ + typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::is_always_equal type; +}; + +template ::value> +struct __has_rebind_other +{ +private: + struct __two {char __lx; char __lxx;}; + template static __two __test(...); + _LIBCPP_SUPPRESS_DEPRECATED_PUSH + template static char __test(typename _Xp::template rebind<_Up>::other* = 0); + _LIBCPP_SUPPRESS_DEPRECATED_POP +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template +struct __has_rebind_other<_Tp, _Up, false> +{ + static const bool value = false; +}; + +template ::value> +struct __allocator_traits_rebind +{ + _LIBCPP_SUPPRESS_DEPRECATED_PUSH + typedef _LIBCPP_NODEBUG_TYPE typename _Tp::template rebind<_Up>::other type; + _LIBCPP_SUPPRESS_DEPRECATED_POP +}; + +template