mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-28 00:02:28 +00:00
Upgrade to 2022-era LLVM LIBCXX
This commit is contained in:
parent
2f4ca71f26
commit
8e68384e15
2078 changed files with 165657 additions and 65010 deletions
76
third_party/libcxx/__memory/addressof.h
vendored
Normal file
76
third_party/libcxx/__memory/addressof.h
vendored
Normal file
|
@ -0,0 +1,76 @@
|
|||
// -*- 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_ADDRESSOF_H
|
||||
#define _LIBCPP___MEMORY_ADDRESSOF_H
|
||||
|
||||
#include <__config>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_CONSTEXPR_SINCE_CXX17
|
||||
_LIBCPP_NO_CFI _LIBCPP_INLINE_VISIBILITY
|
||||
_Tp*
|
||||
addressof(_Tp& __x) _NOEXCEPT
|
||||
{
|
||||
return __builtin_addressof(__x);
|
||||
}
|
||||
|
||||
#if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF)
|
||||
// Objective-C++ Automatic Reference Counting uses qualified pointers
|
||||
// that require special addressof() signatures. When
|
||||
// _LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF is defined, the compiler
|
||||
// itself is providing these definitions. Otherwise, we provide them.
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__strong _Tp*
|
||||
addressof(__strong _Tp& __x) _NOEXCEPT
|
||||
{
|
||||
return &__x;
|
||||
}
|
||||
|
||||
#ifdef _LIBCPP_HAS_OBJC_ARC_WEAK
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__weak _Tp*
|
||||
addressof(__weak _Tp& __x) _NOEXCEPT
|
||||
{
|
||||
return &__x;
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__autoreleasing _Tp*
|
||||
addressof(__autoreleasing _Tp& __x) _NOEXCEPT
|
||||
{
|
||||
return &__x;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__unsafe_unretained _Tp*
|
||||
addressof(__unsafe_unretained _Tp& __x) _NOEXCEPT
|
||||
{
|
||||
return &__x;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_CXX03_LANG)
|
||||
template <class _Tp> _Tp* addressof(const _Tp&&) noexcept = delete;
|
||||
#endif
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_ADDRESSOF_H
|
25
third_party/libcxx/__memory/align.h
vendored
Normal file
25
third_party/libcxx/__memory/align.h
vendored
Normal file
|
@ -0,0 +1,25 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// 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_ALIGN_H
|
||||
#define _LIBCPP___MEMORY_ALIGN_H
|
||||
|
||||
#include <__config>
|
||||
#include <cstddef>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space);
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_ALIGN_H
|
66
third_party/libcxx/__memory/aligned_alloc.h
vendored
Normal file
66
third_party/libcxx/__memory/aligned_alloc.h
vendored
Normal file
|
@ -0,0 +1,66 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// 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_ALIGNED_ALLOC_H
|
||||
#define _LIBCPP___MEMORY_ALIGNED_ALLOC_H
|
||||
|
||||
#include <__config>
|
||||
#include <cstddef>
|
||||
#include <cstdlib>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
|
||||
|
||||
// Low-level helpers to call the aligned allocation and deallocation functions
|
||||
// on the target platform. This is used to implement libc++'s own memory
|
||||
// allocation routines -- if you need to allocate memory inside the library,
|
||||
// chances are that you want to use `__libcpp_allocate` instead.
|
||||
//
|
||||
// Returns the allocated memory, or `nullptr` on failure.
|
||||
inline _LIBCPP_HIDE_FROM_ABI
|
||||
void* __libcpp_aligned_alloc(std::size_t __alignment, std::size_t __size) {
|
||||
# if defined(_LIBCPP_MSVCRT_LIKE)
|
||||
return ::_aligned_malloc(__size, __alignment);
|
||||
# elif _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_C11_ALIGNED_ALLOC)
|
||||
// aligned_alloc() requires that __size is a multiple of __alignment,
|
||||
// but for C++ [new.delete.general], only states "if the value of an
|
||||
// alignment argument passed to any of these functions is not a valid
|
||||
// alignment value, the behavior is undefined".
|
||||
// To handle calls such as ::operator new(1, std::align_val_t(128)), we
|
||||
// round __size up to the next multiple of __alignment.
|
||||
size_t __rounded_size = (__size + __alignment - 1) & ~(__alignment - 1);
|
||||
// Rounding up could have wrapped around to zero, so we have to add another
|
||||
// max() ternary to the actual call site to avoid succeeded in that case.
|
||||
return ::aligned_alloc(__alignment, __size > __rounded_size ? __size : __rounded_size);
|
||||
# else
|
||||
void* __result = nullptr;
|
||||
(void)::posix_memalign(&__result, __alignment, __size);
|
||||
// If posix_memalign fails, __result is unmodified so we still return `nullptr`.
|
||||
return __result;
|
||||
# endif
|
||||
}
|
||||
|
||||
inline _LIBCPP_HIDE_FROM_ABI
|
||||
void __libcpp_aligned_free(void* __ptr) {
|
||||
#if defined(_LIBCPP_MSVCRT_LIKE)
|
||||
::_aligned_free(__ptr);
|
||||
#else
|
||||
::free(__ptr);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // !_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_ALIGNED_ALLOC_H
|
62
third_party/libcxx/__memory/allocate_at_least.h
vendored
Normal file
62
third_party/libcxx/__memory/allocate_at_least.h
vendored
Normal file
|
@ -0,0 +1,62 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// 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_ALLOCATE_AT_LEAST_H
|
||||
#define _LIBCPP___MEMORY_ALLOCATE_AT_LEAST_H
|
||||
|
||||
#include <__config>
|
||||
#include <__memory/allocator_traits.h>
|
||||
#include <cstddef>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER >= 23
|
||||
template <class _Pointer>
|
||||
struct allocation_result {
|
||||
_Pointer ptr;
|
||||
size_t count;
|
||||
};
|
||||
_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(allocation_result);
|
||||
|
||||
template <class _Alloc>
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr
|
||||
allocation_result<typename allocator_traits<_Alloc>::pointer> allocate_at_least(_Alloc& __alloc, size_t __n) {
|
||||
if constexpr (requires { __alloc.allocate_at_least(__n); }) {
|
||||
return __alloc.allocate_at_least(__n);
|
||||
} else {
|
||||
return {__alloc.allocate(__n), __n};
|
||||
}
|
||||
}
|
||||
|
||||
template <class _Alloc>
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr
|
||||
auto __allocate_at_least(_Alloc& __alloc, size_t __n) {
|
||||
return std::allocate_at_least(__alloc, __n);
|
||||
}
|
||||
#else
|
||||
template <class _Pointer>
|
||||
struct __allocation_result {
|
||||
_Pointer ptr;
|
||||
size_t count;
|
||||
};
|
||||
|
||||
template <class _Alloc>
|
||||
_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR
|
||||
__allocation_result<typename allocator_traits<_Alloc>::pointer> __allocate_at_least(_Alloc& __alloc, size_t __n) {
|
||||
return {__alloc.allocate(__n), __n};
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_STD_VER >= 23
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_ALLOCATE_AT_LEAST_H
|
83
third_party/libcxx/__memory/allocation_guard.h
vendored
Normal file
83
third_party/libcxx/__memory/allocation_guard.h
vendored
Normal file
|
@ -0,0 +1,83 @@
|
|||
// -*- 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_ALLOCATION_GUARD_H
|
||||
#define _LIBCPP___MEMORY_ALLOCATION_GUARD_H
|
||||
|
||||
#include <__config>
|
||||
#include <__memory/allocator_traits.h>
|
||||
#include <__utility/move.h>
|
||||
#include <cstddef>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
// Helper class to allocate memory using an Allocator in an exception safe
|
||||
// manner.
|
||||
//
|
||||
// The intended usage of this class is as follows:
|
||||
//
|
||||
// 0
|
||||
// 1 __allocation_guard<SomeAllocator> guard(alloc, 10);
|
||||
// 2 do_some_initialization_that_may_throw(guard.__get());
|
||||
// 3 save_allocated_pointer_in_a_noexcept_operation(guard.__release_ptr());
|
||||
// 4
|
||||
//
|
||||
// If line (2) throws an exception during initialization of the memory, the
|
||||
// guard's destructor will be called, and the memory will be released using
|
||||
// Allocator deallocation. Otherwise, we release the memory from the guard on
|
||||
// line (3) in an operation that can't throw -- after that, the guard is not
|
||||
// responsible for the memory anymore.
|
||||
//
|
||||
// This is similar to a unique_ptr, except it's easier to use with a
|
||||
// custom allocator.
|
||||
template<class _Alloc>
|
||||
struct __allocation_guard {
|
||||
using _Pointer = typename allocator_traits<_Alloc>::pointer;
|
||||
using _Size = typename allocator_traits<_Alloc>::size_type;
|
||||
|
||||
template<class _AllocT> // we perform the allocator conversion inside the constructor
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
explicit __allocation_guard(_AllocT __alloc, _Size __n)
|
||||
: __alloc_(_VSTD::move(__alloc))
|
||||
, __n_(__n)
|
||||
, __ptr_(allocator_traits<_Alloc>::allocate(__alloc_, __n_)) // initialization order is important
|
||||
{ }
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
~__allocation_guard() _NOEXCEPT {
|
||||
if (__ptr_ != nullptr) {
|
||||
allocator_traits<_Alloc>::deallocate(__alloc_, __ptr_, __n_);
|
||||
}
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
_Pointer __release_ptr() _NOEXCEPT { // not called __release() because it's a keyword in objective-c++
|
||||
_Pointer __tmp = __ptr_;
|
||||
__ptr_ = nullptr;
|
||||
return __tmp;
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
_Pointer __get() const _NOEXCEPT {
|
||||
return __ptr_;
|
||||
}
|
||||
|
||||
private:
|
||||
_Alloc __alloc_;
|
||||
_Size __n_;
|
||||
_Pointer __ptr_;
|
||||
};
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_ALLOCATION_GUARD_H
|
271
third_party/libcxx/__memory/allocator.h
vendored
Normal file
271
third_party/libcxx/__memory/allocator.h
vendored
Normal file
|
@ -0,0 +1,271 @@
|
|||
// -*- 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_H
|
||||
#define _LIBCPP___MEMORY_ALLOCATOR_H
|
||||
|
||||
#include <__config>
|
||||
#include <__memory/addressof.h>
|
||||
#include <__memory/allocate_at_least.h>
|
||||
#include <__memory/allocator_traits.h>
|
||||
#include <__type_traits/is_constant_evaluated.h>
|
||||
#include <__type_traits/is_same.h>
|
||||
#include <__type_traits/is_void.h>
|
||||
#include <__type_traits/is_volatile.h>
|
||||
#include <__utility/forward.h>
|
||||
#include <cstddef>
|
||||
#include <new>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp> class allocator;
|
||||
|
||||
#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_VOID_SPECIALIZATION)
|
||||
// These specializations shouldn't be marked _LIBCPP_DEPRECATED_IN_CXX17.
|
||||
// Specializing allocator<void> is deprecated, but not using it.
|
||||
template <>
|
||||
class _LIBCPP_TEMPLATE_VIS allocator<void>
|
||||
{
|
||||
#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS)
|
||||
public:
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef void* pointer;
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef const void* const_pointer;
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef void value_type;
|
||||
|
||||
template <class _Up> struct _LIBCPP_DEPRECATED_IN_CXX17 rebind {typedef allocator<_Up> other;};
|
||||
#endif
|
||||
};
|
||||
|
||||
template <>
|
||||
class _LIBCPP_TEMPLATE_VIS allocator<const void>
|
||||
{
|
||||
#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS)
|
||||
public:
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef const void* pointer;
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef const void* const_pointer;
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef const void value_type;
|
||||
|
||||
template <class _Up> struct _LIBCPP_DEPRECATED_IN_CXX17 rebind {typedef allocator<_Up> other;};
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
// This class provides a non-trivial default constructor to the class that derives from it
|
||||
// if the condition is satisfied.
|
||||
//
|
||||
// The second template parameter exists to allow giving a unique type to __non_trivial_if,
|
||||
// which makes it possible to avoid breaking the ABI when making this a base class of an
|
||||
// existing class. Without that, imagine we have classes D1 and D2, both of which used to
|
||||
// have no base classes, but which now derive from __non_trivial_if. The layout of a class
|
||||
// that inherits from both D1 and D2 will change because the two __non_trivial_if base
|
||||
// classes are not allowed to share the same address.
|
||||
//
|
||||
// By making those __non_trivial_if base classes unique, we work around this problem and
|
||||
// it is safe to start deriving from __non_trivial_if in existing classes.
|
||||
template <bool _Cond, class _Unique>
|
||||
struct __non_trivial_if { };
|
||||
|
||||
template <class _Unique>
|
||||
struct __non_trivial_if<true, _Unique> {
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR __non_trivial_if() _NOEXCEPT { }
|
||||
};
|
||||
|
||||
// allocator
|
||||
//
|
||||
// Note: For ABI compatibility between C++20 and previous standards, we make
|
||||
// allocator<void> trivial in C++20.
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_TEMPLATE_VIS allocator
|
||||
: private __non_trivial_if<!is_void<_Tp>::value, allocator<_Tp> >
|
||||
{
|
||||
static_assert(!is_volatile<_Tp>::value, "std::allocator does not support volatile types");
|
||||
public:
|
||||
typedef size_t size_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef _Tp value_type;
|
||||
typedef true_type propagate_on_container_move_assignment;
|
||||
typedef true_type is_always_equal;
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 allocator() _NOEXCEPT = default;
|
||||
|
||||
template <class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
allocator(const allocator<_Up>&) _NOEXCEPT { }
|
||||
|
||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_Tp* allocate(size_t __n) {
|
||||
if (__n > allocator_traits<allocator>::max_size(*this))
|
||||
__throw_bad_array_new_length();
|
||||
if (__libcpp_is_constant_evaluated()) {
|
||||
return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
|
||||
} else {
|
||||
return static_cast<_Tp*>(_VSTD::__libcpp_allocate(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)));
|
||||
}
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER >= 23
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr
|
||||
allocation_result<_Tp*> allocate_at_least(size_t __n) {
|
||||
return {allocate(__n), __n};
|
||||
}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
void deallocate(_Tp* __p, size_t __n) _NOEXCEPT {
|
||||
if (__libcpp_is_constant_evaluated()) {
|
||||
::operator delete(__p);
|
||||
} else {
|
||||
_VSTD::__libcpp_deallocate((void*)__p, __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
|
||||
}
|
||||
}
|
||||
|
||||
// C++20 Removed members
|
||||
#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS)
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef _Tp* pointer;
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp* const_pointer;
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef _Tp& reference;
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp& const_reference;
|
||||
|
||||
template <class _Up>
|
||||
struct _LIBCPP_DEPRECATED_IN_CXX17 rebind {
|
||||
typedef allocator<_Up> other;
|
||||
};
|
||||
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
|
||||
pointer address(reference __x) const _NOEXCEPT {
|
||||
return _VSTD::addressof(__x);
|
||||
}
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
|
||||
const_pointer address(const_reference __x) const _NOEXCEPT {
|
||||
return _VSTD::addressof(__x);
|
||||
}
|
||||
|
||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_IN_CXX17
|
||||
_Tp* allocate(size_t __n, const void*) {
|
||||
return allocate(__n);
|
||||
}
|
||||
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT {
|
||||
return size_type(~0) / sizeof(_Tp);
|
||||
}
|
||||
|
||||
template <class _Up, class... _Args>
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
|
||||
void construct(_Up* __p, _Args&&... __args) {
|
||||
::new ((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
|
||||
void destroy(pointer __p) {
|
||||
__p->~_Tp();
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_TEMPLATE_VIS allocator<const _Tp>
|
||||
: private __non_trivial_if<!is_void<_Tp>::value, allocator<const _Tp> >
|
||||
{
|
||||
static_assert(!is_volatile<_Tp>::value, "std::allocator does not support volatile types");
|
||||
public:
|
||||
typedef size_t size_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef const _Tp value_type;
|
||||
typedef true_type propagate_on_container_move_assignment;
|
||||
typedef true_type is_always_equal;
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 allocator() _NOEXCEPT = default;
|
||||
|
||||
template <class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
allocator(const allocator<_Up>&) _NOEXCEPT { }
|
||||
|
||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
const _Tp* allocate(size_t __n) {
|
||||
if (__n > allocator_traits<allocator>::max_size(*this))
|
||||
__throw_bad_array_new_length();
|
||||
if (__libcpp_is_constant_evaluated()) {
|
||||
return static_cast<const _Tp*>(::operator new(__n * sizeof(_Tp)));
|
||||
} else {
|
||||
return static_cast<const _Tp*>(_VSTD::__libcpp_allocate(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)));
|
||||
}
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER >= 23
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr
|
||||
allocation_result<const _Tp*> allocate_at_least(size_t __n) {
|
||||
return {allocate(__n), __n};
|
||||
}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
void deallocate(const _Tp* __p, size_t __n) {
|
||||
if (__libcpp_is_constant_evaluated()) {
|
||||
::operator delete(const_cast<_Tp*>(__p));
|
||||
} else {
|
||||
_VSTD::__libcpp_deallocate((void*) const_cast<_Tp *>(__p), __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
|
||||
}
|
||||
}
|
||||
|
||||
// C++20 Removed members
|
||||
#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS)
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp* pointer;
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp* const_pointer;
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp& reference;
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp& const_reference;
|
||||
|
||||
template <class _Up>
|
||||
struct _LIBCPP_DEPRECATED_IN_CXX17 rebind {
|
||||
typedef allocator<_Up> other;
|
||||
};
|
||||
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
|
||||
const_pointer address(const_reference __x) const _NOEXCEPT {
|
||||
return _VSTD::addressof(__x);
|
||||
}
|
||||
|
||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_IN_CXX17
|
||||
const _Tp* allocate(size_t __n, const void*) {
|
||||
return allocate(__n);
|
||||
}
|
||||
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT {
|
||||
return size_type(~0) / sizeof(_Tp);
|
||||
}
|
||||
|
||||
template <class _Up, class... _Args>
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
|
||||
void construct(_Up* __p, _Args&&... __args) {
|
||||
::new ((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
|
||||
void destroy(pointer __p) {
|
||||
__p->~_Tp();
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
template <class _Tp, class _Up>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
bool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;}
|
||||
|
||||
template <class _Tp, class _Up>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
bool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_ALLOCATOR_H
|
80
third_party/libcxx/__memory/allocator_arg_t.h
vendored
Normal file
80
third_party/libcxx/__memory/allocator_arg_t.h
vendored
Normal file
|
@ -0,0 +1,80 @@
|
|||
// -*- 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___FUNCTIONAL_ALLOCATOR_ARG_T_H
|
||||
#define _LIBCPP___FUNCTIONAL_ALLOCATOR_ARG_T_H
|
||||
|
||||
#include <__config>
|
||||
#include <__memory/uses_allocator.h>
|
||||
#include <__type_traits/integral_constant.h>
|
||||
#include <__type_traits/is_constructible.h>
|
||||
#include <__type_traits/remove_cvref.h>
|
||||
#include <__utility/forward.h>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
struct _LIBCPP_TEMPLATE_VIS allocator_arg_t { explicit allocator_arg_t() = default; };
|
||||
|
||||
#if _LIBCPP_STD_VER >= 17
|
||||
inline constexpr allocator_arg_t allocator_arg = allocator_arg_t();
|
||||
#elif !defined(_LIBCPP_CXX03_LANG)
|
||||
constexpr allocator_arg_t allocator_arg = allocator_arg_t();
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
|
||||
// allocator construction
|
||||
|
||||
template <class _Tp, class _Alloc, class ..._Args>
|
||||
struct __uses_alloc_ctor_imp
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG __remove_cvref_t<_Alloc> _RawAlloc;
|
||||
static const bool __ua = uses_allocator<_Tp, _RawAlloc>::value;
|
||||
static const bool __ic =
|
||||
is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value;
|
||||
static const int value = __ua ? 2 - __ic : 0;
|
||||
};
|
||||
|
||||
template <class _Tp, class _Alloc, class ..._Args>
|
||||
struct __uses_alloc_ctor
|
||||
: integral_constant<int, __uses_alloc_ctor_imp<_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);
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___FUNCTIONAL_ALLOCATOR_ARG_T_H
|
42
third_party/libcxx/__memory/allocator_destructor.h
vendored
Normal file
42
third_party/libcxx/__memory/allocator_destructor.h
vendored
Normal file
|
@ -0,0 +1,42 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// 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_DESTRUCTOR_H
|
||||
#define _LIBCPP___MEMORY_ALLOCATOR_DESTRUCTOR_H
|
||||
|
||||
#include <__config>
|
||||
#include <__memory/allocator_traits.h>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Alloc>
|
||||
class __allocator_destructor
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG allocator_traits<_Alloc> __alloc_traits;
|
||||
public:
|
||||
typedef _LIBCPP_NODEBUG typename __alloc_traits::pointer pointer;
|
||||
typedef _LIBCPP_NODEBUG typename __alloc_traits::size_type size_type;
|
||||
private:
|
||||
_Alloc& __alloc_;
|
||||
size_type __s_;
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s)
|
||||
_NOEXCEPT
|
||||
: __alloc_(__a), __s_(__s) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void operator()(pointer __p) _NOEXCEPT
|
||||
{__alloc_traits::deallocate(__alloc_, __p, __s_);}
|
||||
};
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_ALLOCATOR_DESTRUCTOR_H
|
429
third_party/libcxx/__memory/allocator_traits.h
vendored
Normal file
429
third_party/libcxx/__memory/allocator_traits.h
vendored
Normal file
|
@ -0,0 +1,429 @@
|
|||
// -*- 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/construct_at.h>
|
||||
#include <__memory/pointer_traits.h>
|
||||
#include <__type_traits/enable_if.h>
|
||||
#include <__type_traits/is_copy_constructible.h>
|
||||
#include <__type_traits/is_empty.h>
|
||||
#include <__type_traits/is_move_constructible.h>
|
||||
#include <__type_traits/make_unsigned.h>
|
||||
#include <__type_traits/remove_reference.h>
|
||||
#include <__type_traits/void_t.h>
|
||||
#include <__utility/declval.h>
|
||||
#include <__utility/forward.h>
|
||||
#include <limits>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#define _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(NAME, PROPERTY) \
|
||||
template <class _Tp, class = void> struct NAME : false_type { }; \
|
||||
template <class _Tp> struct NAME<_Tp, __void_t<typename _Tp:: PROPERTY > > : true_type { }
|
||||
|
||||
// __pointer
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_pointer, pointer);
|
||||
template <class _Tp, class _Alloc,
|
||||
class _RawAlloc = __libcpp_remove_reference_t<_Alloc>,
|
||||
bool = __has_pointer<_RawAlloc>::value>
|
||||
struct __pointer {
|
||||
using type _LIBCPP_NODEBUG = typename _RawAlloc::pointer;
|
||||
};
|
||||
template <class _Tp, class _Alloc, class _RawAlloc>
|
||||
struct __pointer<_Tp, _Alloc, _RawAlloc, false> {
|
||||
using type _LIBCPP_NODEBUG = _Tp*;
|
||||
};
|
||||
|
||||
// __const_pointer
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_const_pointer, const_pointer);
|
||||
template <class _Tp, class _Ptr, class _Alloc,
|
||||
bool = __has_const_pointer<_Alloc>::value>
|
||||
struct __const_pointer {
|
||||
using type _LIBCPP_NODEBUG = typename _Alloc::const_pointer;
|
||||
};
|
||||
template <class _Tp, class _Ptr, class _Alloc>
|
||||
struct __const_pointer<_Tp, _Ptr, _Alloc, false> {
|
||||
#ifdef _LIBCPP_CXX03_LANG
|
||||
using type = typename pointer_traits<_Ptr>::template rebind<const _Tp>::other;
|
||||
#else
|
||||
using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<const _Tp>;
|
||||
#endif
|
||||
};
|
||||
|
||||
// __void_pointer
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_void_pointer, void_pointer);
|
||||
template <class _Ptr, class _Alloc,
|
||||
bool = __has_void_pointer<_Alloc>::value>
|
||||
struct __void_pointer {
|
||||
using type _LIBCPP_NODEBUG = typename _Alloc::void_pointer;
|
||||
};
|
||||
template <class _Ptr, class _Alloc>
|
||||
struct __void_pointer<_Ptr, _Alloc, false> {
|
||||
#ifdef _LIBCPP_CXX03_LANG
|
||||
using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<void>::other;
|
||||
#else
|
||||
using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<void>;
|
||||
#endif
|
||||
};
|
||||
|
||||
// __const_void_pointer
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_const_void_pointer, const_void_pointer);
|
||||
template <class _Ptr, class _Alloc,
|
||||
bool = __has_const_void_pointer<_Alloc>::value>
|
||||
struct __const_void_pointer {
|
||||
using type _LIBCPP_NODEBUG = typename _Alloc::const_void_pointer;
|
||||
};
|
||||
template <class _Ptr, class _Alloc>
|
||||
struct __const_void_pointer<_Ptr, _Alloc, false> {
|
||||
#ifdef _LIBCPP_CXX03_LANG
|
||||
using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<const void>::other;
|
||||
#else
|
||||
using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<const void>;
|
||||
#endif
|
||||
};
|
||||
|
||||
// __size_type
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_size_type, size_type);
|
||||
template <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value>
|
||||
struct __size_type : make_unsigned<_DiffType> { };
|
||||
template <class _Alloc, class _DiffType>
|
||||
struct __size_type<_Alloc, _DiffType, true> {
|
||||
using type _LIBCPP_NODEBUG = typename _Alloc::size_type;
|
||||
};
|
||||
|
||||
// __alloc_traits_difference_type
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_alloc_traits_difference_type, difference_type);
|
||||
template <class _Alloc, class _Ptr, bool = __has_alloc_traits_difference_type<_Alloc>::value>
|
||||
struct __alloc_traits_difference_type {
|
||||
using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::difference_type;
|
||||
};
|
||||
template <class _Alloc, class _Ptr>
|
||||
struct __alloc_traits_difference_type<_Alloc, _Ptr, true> {
|
||||
using type _LIBCPP_NODEBUG = typename _Alloc::difference_type;
|
||||
};
|
||||
|
||||
// __propagate_on_container_copy_assignment
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_propagate_on_container_copy_assignment, propagate_on_container_copy_assignment);
|
||||
template <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value>
|
||||
struct __propagate_on_container_copy_assignment : false_type { };
|
||||
template <class _Alloc>
|
||||
struct __propagate_on_container_copy_assignment<_Alloc, true> {
|
||||
using type _LIBCPP_NODEBUG = typename _Alloc::propagate_on_container_copy_assignment;
|
||||
};
|
||||
|
||||
// __propagate_on_container_move_assignment
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_propagate_on_container_move_assignment, propagate_on_container_move_assignment);
|
||||
template <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value>
|
||||
struct __propagate_on_container_move_assignment : false_type { };
|
||||
template <class _Alloc>
|
||||
struct __propagate_on_container_move_assignment<_Alloc, true> {
|
||||
using type _LIBCPP_NODEBUG = typename _Alloc::propagate_on_container_move_assignment;
|
||||
};
|
||||
|
||||
// __propagate_on_container_swap
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_propagate_on_container_swap, propagate_on_container_swap);
|
||||
template <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value>
|
||||
struct __propagate_on_container_swap : false_type { };
|
||||
template <class _Alloc>
|
||||
struct __propagate_on_container_swap<_Alloc, true> {
|
||||
using type _LIBCPP_NODEBUG = typename _Alloc::propagate_on_container_swap;
|
||||
};
|
||||
|
||||
// __is_always_equal
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_is_always_equal, is_always_equal);
|
||||
template <class _Alloc, bool = __has_is_always_equal<_Alloc>::value>
|
||||
struct __is_always_equal : is_empty<_Alloc> { };
|
||||
template <class _Alloc>
|
||||
struct __is_always_equal<_Alloc, true> {
|
||||
using type _LIBCPP_NODEBUG = typename _Alloc::is_always_equal;
|
||||
};
|
||||
|
||||
// __allocator_traits_rebind
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
template <class _Tp, class _Up, class = void>
|
||||
struct __has_rebind_other : false_type { };
|
||||
template <class _Tp, class _Up>
|
||||
struct __has_rebind_other<_Tp, _Up, __void_t<typename _Tp::template rebind<_Up>::other> > : true_type { };
|
||||
|
||||
template <class _Tp, class _Up, bool = __has_rebind_other<_Tp, _Up>::value>
|
||||
struct __allocator_traits_rebind {
|
||||
static_assert(__has_rebind_other<_Tp, _Up>::value, "This allocator has to implement rebind");
|
||||
using type _LIBCPP_NODEBUG = typename _Tp::template rebind<_Up>::other;
|
||||
};
|
||||
template <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up>
|
||||
struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true> {
|
||||
using type _LIBCPP_NODEBUG = typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other;
|
||||
};
|
||||
template <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up>
|
||||
struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false> {
|
||||
using type _LIBCPP_NODEBUG = _Alloc<_Up, _Args...>;
|
||||
};
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
|
||||
template<class _Alloc, class _Tp>
|
||||
using __allocator_traits_rebind_t = typename __allocator_traits_rebind<_Alloc, _Tp>::type;
|
||||
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
|
||||
// __has_allocate_hint
|
||||
template <class _Alloc, class _SizeType, class _ConstVoidPtr, class = void>
|
||||
struct __has_allocate_hint : false_type { };
|
||||
|
||||
template <class _Alloc, class _SizeType, class _ConstVoidPtr>
|
||||
struct __has_allocate_hint<_Alloc, _SizeType, _ConstVoidPtr, decltype(
|
||||
(void)std::declval<_Alloc>().allocate(std::declval<_SizeType>(), std::declval<_ConstVoidPtr>())
|
||||
)> : true_type { };
|
||||
|
||||
// __has_construct
|
||||
template <class, class _Alloc, class ..._Args>
|
||||
struct __has_construct_impl : false_type { };
|
||||
|
||||
template <class _Alloc, class ..._Args>
|
||||
struct __has_construct_impl<decltype(
|
||||
(void)std::declval<_Alloc>().construct(std::declval<_Args>()...)
|
||||
), _Alloc, _Args...> : true_type { };
|
||||
|
||||
template <class _Alloc, class ..._Args>
|
||||
struct __has_construct : __has_construct_impl<void, _Alloc, _Args...> { };
|
||||
|
||||
// __has_destroy
|
||||
template <class _Alloc, class _Pointer, class = void>
|
||||
struct __has_destroy : false_type { };
|
||||
|
||||
template <class _Alloc, class _Pointer>
|
||||
struct __has_destroy<_Alloc, _Pointer, decltype(
|
||||
(void)std::declval<_Alloc>().destroy(std::declval<_Pointer>())
|
||||
)> : true_type { };
|
||||
|
||||
// __has_max_size
|
||||
template <class _Alloc, class = void>
|
||||
struct __has_max_size : false_type { };
|
||||
|
||||
template <class _Alloc>
|
||||
struct __has_max_size<_Alloc, decltype(
|
||||
(void)std::declval<_Alloc&>().max_size()
|
||||
)> : true_type { };
|
||||
|
||||
// __has_select_on_container_copy_construction
|
||||
template <class _Alloc, class = void>
|
||||
struct __has_select_on_container_copy_construction : false_type { };
|
||||
|
||||
template <class _Alloc>
|
||||
struct __has_select_on_container_copy_construction<_Alloc, decltype(
|
||||
(void)std::declval<_Alloc>().select_on_container_copy_construction()
|
||||
)> : true_type { };
|
||||
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
|
||||
template <class _Alloc>
|
||||
struct _LIBCPP_TEMPLATE_VIS allocator_traits
|
||||
{
|
||||
using allocator_type = _Alloc;
|
||||
using value_type = typename allocator_type::value_type;
|
||||
using pointer = typename __pointer<value_type, allocator_type>::type;
|
||||
using const_pointer = typename __const_pointer<value_type, pointer, allocator_type>::type;
|
||||
using void_pointer = typename __void_pointer<pointer, allocator_type>::type;
|
||||
using const_void_pointer = typename __const_void_pointer<pointer, allocator_type>::type;
|
||||
using difference_type = typename __alloc_traits_difference_type<allocator_type, pointer>::type;
|
||||
using size_type = typename __size_type<allocator_type, difference_type>::type;
|
||||
using propagate_on_container_copy_assignment = typename __propagate_on_container_copy_assignment<allocator_type>::type;
|
||||
using propagate_on_container_move_assignment = typename __propagate_on_container_move_assignment<allocator_type>::type;
|
||||
using propagate_on_container_swap = typename __propagate_on_container_swap<allocator_type>::type;
|
||||
using is_always_equal = typename __is_always_equal<allocator_type>::type;
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class _Tp>
|
||||
using rebind_alloc = __allocator_traits_rebind_t<allocator_type, _Tp>;
|
||||
template <class _Tp>
|
||||
using rebind_traits = allocator_traits<rebind_alloc<_Tp> >;
|
||||
#else // _LIBCPP_CXX03_LANG
|
||||
template <class _Tp>
|
||||
struct rebind_alloc {
|
||||
using other = __allocator_traits_rebind_t<allocator_type, _Tp>;
|
||||
};
|
||||
template <class _Tp>
|
||||
struct rebind_traits {
|
||||
using other = allocator_traits<typename rebind_alloc<_Tp>::other>;
|
||||
};
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
static pointer allocate(allocator_type& __a, size_type __n) {
|
||||
return __a.allocate(__n);
|
||||
}
|
||||
|
||||
template <class _Ap = _Alloc, class =
|
||||
__enable_if_t<__has_allocate_hint<_Ap, size_type, const_void_pointer>::value> >
|
||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) {
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
return __a.allocate(__n, __hint);
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
}
|
||||
template <class _Ap = _Alloc, class = void, class =
|
||||
__enable_if_t<!__has_allocate_hint<_Ap, size_type, const_void_pointer>::value> >
|
||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer) {
|
||||
return __a.allocate(__n);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT {
|
||||
__a.deallocate(__p, __n);
|
||||
}
|
||||
|
||||
template <class _Tp, class... _Args, class =
|
||||
__enable_if_t<__has_construct<allocator_type, _Tp*, _Args...>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) {
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
__a.construct(__p, _VSTD::forward<_Args>(__args)...);
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
}
|
||||
template <class _Tp, class... _Args, class = void, class =
|
||||
__enable_if_t<!__has_construct<allocator_type, _Tp*, _Args...>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
static void construct(allocator_type&, _Tp* __p, _Args&&... __args) {
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
_VSTD::construct_at(__p, _VSTD::forward<_Args>(__args)...);
|
||||
#else
|
||||
::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _Tp, class =
|
||||
__enable_if_t<__has_destroy<allocator_type, _Tp*>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
static void destroy(allocator_type& __a, _Tp* __p) {
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
__a.destroy(__p);
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
}
|
||||
template <class _Tp, class = void, class =
|
||||
__enable_if_t<!__has_destroy<allocator_type, _Tp*>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
static void destroy(allocator_type&, _Tp* __p) {
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
_VSTD::destroy_at(__p);
|
||||
#else
|
||||
__p->~_Tp();
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _Ap = _Alloc, class =
|
||||
__enable_if_t<__has_max_size<const _Ap>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
static size_type max_size(const allocator_type& __a) _NOEXCEPT {
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
return __a.max_size();
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
}
|
||||
template <class _Ap = _Alloc, class = void, class =
|
||||
__enable_if_t<!__has_max_size<const _Ap>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
static size_type max_size(const allocator_type&) _NOEXCEPT {
|
||||
return numeric_limits<size_type>::max() / sizeof(value_type);
|
||||
}
|
||||
|
||||
template <class _Ap = _Alloc, class =
|
||||
__enable_if_t<__has_select_on_container_copy_construction<const _Ap>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
static allocator_type select_on_container_copy_construction(const allocator_type& __a) {
|
||||
return __a.select_on_container_copy_construction();
|
||||
}
|
||||
template <class _Ap = _Alloc, class = void, class =
|
||||
__enable_if_t<!__has_select_on_container_copy_construction<const _Ap>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
static allocator_type select_on_container_copy_construction(const allocator_type& __a) {
|
||||
return __a;
|
||||
}
|
||||
};
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class _Traits, class _Tp>
|
||||
using __rebind_alloc _LIBCPP_NODEBUG = typename _Traits::template rebind_alloc<_Tp>;
|
||||
#else
|
||||
template <class _Traits, class _Tp>
|
||||
using __rebind_alloc = typename _Traits::template rebind_alloc<_Tp>::other;
|
||||
#endif
|
||||
|
||||
// __is_default_allocator
|
||||
template <class _Tp>
|
||||
struct __is_default_allocator : false_type { };
|
||||
|
||||
template <class> class allocator;
|
||||
|
||||
template <class _Tp>
|
||||
struct __is_default_allocator<allocator<_Tp> > : true_type { };
|
||||
|
||||
// __is_cpp17_move_insertable
|
||||
template <class _Alloc, class = void>
|
||||
struct __is_cpp17_move_insertable
|
||||
: is_move_constructible<typename _Alloc::value_type>
|
||||
{ };
|
||||
|
||||
template <class _Alloc>
|
||||
struct __is_cpp17_move_insertable<_Alloc, __enable_if_t<
|
||||
!__is_default_allocator<_Alloc>::value &&
|
||||
__has_construct<_Alloc, typename _Alloc::value_type*, typename _Alloc::value_type&&>::value
|
||||
> > : true_type { };
|
||||
|
||||
// __is_cpp17_copy_insertable
|
||||
template <class _Alloc, class = void>
|
||||
struct __is_cpp17_copy_insertable
|
||||
: integral_constant<bool,
|
||||
is_copy_constructible<typename _Alloc::value_type>::value &&
|
||||
__is_cpp17_move_insertable<_Alloc>::value
|
||||
>
|
||||
{ };
|
||||
|
||||
template <class _Alloc>
|
||||
struct __is_cpp17_copy_insertable<_Alloc, __enable_if_t<
|
||||
!__is_default_allocator<_Alloc>::value &&
|
||||
__has_construct<_Alloc, typename _Alloc::value_type*, const typename _Alloc::value_type&>::value
|
||||
> >
|
||||
: __is_cpp17_move_insertable<_Alloc>
|
||||
{ };
|
||||
|
||||
// ASan choices
|
||||
#ifndef _LIBCPP_HAS_NO_ASAN
|
||||
# define _LIBCPP_HAS_ASAN_CONTAINER_ANNOTATIONS_FOR_ALL_ALLOCATORS 1
|
||||
#endif
|
||||
|
||||
#ifdef _LIBCPP_HAS_ASAN_CONTAINER_ANNOTATIONS_FOR_ALL_ALLOCATORS
|
||||
template <class _Alloc>
|
||||
struct __asan_annotate_container_with_allocator
|
||||
# if defined(_LIBCPP_CLANG_VER) && _LIBCPP_CLANG_VER >= 1600
|
||||
: true_type {};
|
||||
# else
|
||||
// TODO(LLVM-18): Remove the special-casing
|
||||
: false_type {};
|
||||
# endif
|
||||
|
||||
template <class _Tp>
|
||||
struct __asan_annotate_container_with_allocator<allocator<_Tp> > : true_type {};
|
||||
#endif
|
||||
|
||||
#undef _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___MEMORY_ALLOCATOR_TRAITS_H
|
46
third_party/libcxx/__memory/assume_aligned.h
vendored
Normal file
46
third_party/libcxx/__memory/assume_aligned.h
vendored
Normal file
|
@ -0,0 +1,46 @@
|
|||
// -*- 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_ASSUME_ALIGNED_H
|
||||
#define _LIBCPP___MEMORY_ASSUME_ALIGNED_H
|
||||
|
||||
#include <__assert>
|
||||
#include <__config>
|
||||
#include <__type_traits/is_constant_evaluated.h>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
|
||||
template <size_t _Np, class _Tp>
|
||||
[[nodiscard]]
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
constexpr _Tp* assume_aligned(_Tp* __ptr) {
|
||||
static_assert(_Np != 0 && (_Np & (_Np - 1)) == 0,
|
||||
"std::assume_aligned<N>(p) requires N to be a power of two");
|
||||
|
||||
if (is_constant_evaluated()) {
|
||||
return __ptr;
|
||||
} else {
|
||||
_LIBCPP_ASSERT(reinterpret_cast<uintptr_t>(__ptr) % _Np == 0, "Alignment assumption is violated");
|
||||
return static_cast<_Tp*>(__builtin_assume_aligned(__ptr, _Np));
|
||||
}
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_STD_VER >= 20
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_ASSUME_ALIGNED_H
|
84
third_party/libcxx/__memory/auto_ptr.h
vendored
Normal file
84
third_party/libcxx/__memory/auto_ptr.h
vendored
Normal file
|
@ -0,0 +1,84 @@
|
|||
// -*- 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_AUTO_PTR_H
|
||||
#define _LIBCPP___MEMORY_AUTO_PTR_H
|
||||
|
||||
#include <__config>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr_ref
|
||||
{
|
||||
_Tp* __ptr_;
|
||||
};
|
||||
|
||||
template<class _Tp>
|
||||
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr
|
||||
{
|
||||
private:
|
||||
_Tp* __ptr_;
|
||||
public:
|
||||
typedef _Tp element_type;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY explicit auto_ptr(_Tp* __p = 0) _NOEXCEPT : __ptr_(__p) {}
|
||||
_LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr& __p) _NOEXCEPT : __ptr_(__p.release()) {}
|
||||
template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr<_Up>& __p) _NOEXCEPT
|
||||
: __ptr_(__p.release()) {}
|
||||
_LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr& __p) _NOEXCEPT
|
||||
{reset(__p.release()); return *this;}
|
||||
template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr<_Up>& __p) _NOEXCEPT
|
||||
{reset(__p.release()); return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr_ref<_Tp> __p) _NOEXCEPT
|
||||
{reset(__p.__ptr_); return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY ~auto_ptr() _NOEXCEPT {delete __ptr_;}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _Tp& operator*() const _NOEXCEPT
|
||||
{return *__ptr_;}
|
||||
_LIBCPP_INLINE_VISIBILITY _Tp* operator->() const _NOEXCEPT {return __ptr_;}
|
||||
_LIBCPP_INLINE_VISIBILITY _Tp* get() const _NOEXCEPT {return __ptr_;}
|
||||
_LIBCPP_INLINE_VISIBILITY _Tp* release() _NOEXCEPT
|
||||
{
|
||||
_Tp* __t = __ptr_;
|
||||
__ptr_ = nullptr;
|
||||
return __t;
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY void reset(_Tp* __p = 0) _NOEXCEPT
|
||||
{
|
||||
if (__ptr_ != __p)
|
||||
delete __ptr_;
|
||||
__ptr_ = __p;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr_ref<_Tp> __p) _NOEXCEPT : __ptr_(__p.__ptr_) {}
|
||||
template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr_ref<_Up>() _NOEXCEPT
|
||||
{auto_ptr_ref<_Up> __t; __t.__ptr_ = release(); return __t;}
|
||||
template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr<_Up>() _NOEXCEPT
|
||||
{return auto_ptr<_Up>(release());}
|
||||
};
|
||||
|
||||
template <>
|
||||
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr<void>
|
||||
{
|
||||
public:
|
||||
typedef void element_type;
|
||||
};
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
|
||||
|
||||
#endif // _LIBCPP___MEMORY_AUTO_PTR_H
|
70
third_party/libcxx/__memory/builtin_new_allocator.h
vendored
Normal file
70
third_party/libcxx/__memory/builtin_new_allocator.h
vendored
Normal file
|
@ -0,0 +1,70 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// 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_BUILTIN_NEW_ALLOCATOR_H
|
||||
#define _LIBCPP___MEMORY_BUILTIN_NEW_ALLOCATOR_H
|
||||
|
||||
#include <__config>
|
||||
#include <__memory/unique_ptr.h>
|
||||
#include <cstddef>
|
||||
#include <new>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
// __builtin_new_allocator -- A non-templated helper for allocating and
|
||||
// deallocating memory using __builtin_operator_new and
|
||||
// __builtin_operator_delete. It should be used in preference to
|
||||
// `std::allocator<T>` to avoid additional instantiations.
|
||||
struct __builtin_new_allocator {
|
||||
struct __builtin_new_deleter {
|
||||
typedef void* pointer_type;
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR explicit __builtin_new_deleter(size_t __size, size_t __align)
|
||||
: __size_(__size), __align_(__align) {}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI void operator()(void* __p) const _NOEXCEPT {
|
||||
_VSTD::__libcpp_deallocate(__p, __size_, __align_);
|
||||
}
|
||||
|
||||
private:
|
||||
size_t __size_;
|
||||
size_t __align_;
|
||||
};
|
||||
|
||||
typedef unique_ptr<void, __builtin_new_deleter> __holder_t;
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI static __holder_t __allocate_bytes(size_t __s, size_t __align) {
|
||||
return __holder_t(_VSTD::__libcpp_allocate(__s, __align),
|
||||
__builtin_new_deleter(__s, __align));
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI static void __deallocate_bytes(void* __p, size_t __s,
|
||||
size_t __align) _NOEXCEPT {
|
||||
_VSTD::__libcpp_deallocate(__p, __s, __align);
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_HIDE_FROM_ABI static __holder_t __allocate_type(size_t __n) {
|
||||
return __allocate_bytes(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_HIDE_FROM_ABI static void __deallocate_type(void* __p, size_t __n) _NOEXCEPT {
|
||||
__deallocate_bytes(__p, __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
|
||||
}
|
||||
};
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_BUILTIN_NEW_ALLOCATOR_H
|
177
third_party/libcxx/__memory/compressed_pair.h
vendored
Normal file
177
third_party/libcxx/__memory/compressed_pair.h
vendored
Normal file
|
@ -0,0 +1,177 @@
|
|||
// -*- 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_COMPRESSED_PAIR_H
|
||||
#define _LIBCPP___MEMORY_COMPRESSED_PAIR_H
|
||||
|
||||
#include <__config>
|
||||
#include <__fwd/get.h>
|
||||
#include <__fwd/tuple.h>
|
||||
#include <__tuple/tuple_indices.h>
|
||||
#include <__type_traits/decay.h>
|
||||
#include <__type_traits/dependent_type.h>
|
||||
#include <__type_traits/enable_if.h>
|
||||
#include <__type_traits/is_default_constructible.h>
|
||||
#include <__type_traits/is_empty.h>
|
||||
#include <__type_traits/is_final.h>
|
||||
#include <__type_traits/is_same.h>
|
||||
#include <__type_traits/is_swappable.h>
|
||||
#include <__utility/forward.h>
|
||||
#include <__utility/move.h>
|
||||
#include <__utility/piecewise_construct.h>
|
||||
#include <cstddef>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
// Tag used to default initialize one or both of the pair's elements.
|
||||
struct __default_init_tag {};
|
||||
struct __value_init_tag {};
|
||||
|
||||
template <class _Tp, int _Idx, bool _CanBeEmptyBase = is_empty<_Tp>::value && !__libcpp_is_final<_Tp>::value>
|
||||
struct __compressed_pair_elem {
|
||||
using _ParamT = _Tp;
|
||||
using reference = _Tp&;
|
||||
using const_reference = const _Tp&;
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR explicit __compressed_pair_elem(__default_init_tag) {}
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR explicit __compressed_pair_elem(__value_init_tag) : __value_() {}
|
||||
|
||||
template <class _Up, class = __enable_if_t<!is_same<__compressed_pair_elem, __decay_t<_Up> >::value> >
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR
|
||||
explicit __compressed_pair_elem(_Up&& __u) : __value_(std::forward<_Up>(__u)) {}
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class... _Args, size_t... _Indices>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17
|
||||
explicit __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args, __tuple_indices<_Indices...>)
|
||||
: __value_(std::forward<_Args>(std::get<_Indices>(__args))...) {}
|
||||
#endif
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 reference __get() _NOEXCEPT { return __value_; }
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR const_reference __get() const _NOEXCEPT { return __value_; }
|
||||
|
||||
private:
|
||||
_Tp __value_;
|
||||
};
|
||||
|
||||
template <class _Tp, int _Idx>
|
||||
struct __compressed_pair_elem<_Tp, _Idx, true> : private _Tp {
|
||||
using _ParamT = _Tp;
|
||||
using reference = _Tp&;
|
||||
using const_reference = const _Tp&;
|
||||
using __value_type = _Tp;
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR explicit __compressed_pair_elem() = default;
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR explicit __compressed_pair_elem(__default_init_tag) {}
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR explicit __compressed_pair_elem(__value_init_tag) : __value_type() {}
|
||||
|
||||
template <class _Up, class = __enable_if_t<!is_same<__compressed_pair_elem, __decay_t<_Up> >::value> >
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR
|
||||
explicit __compressed_pair_elem(_Up&& __u) : __value_type(std::forward<_Up>(__u)) {}
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class... _Args, size_t... _Indices>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17
|
||||
__compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args, __tuple_indices<_Indices...>)
|
||||
: __value_type(std::forward<_Args>(std::get<_Indices>(__args))...) {}
|
||||
#endif
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 reference __get() _NOEXCEPT { return *this; }
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR const_reference __get() const _NOEXCEPT { return *this; }
|
||||
};
|
||||
|
||||
template <class _T1, class _T2>
|
||||
class __compressed_pair : private __compressed_pair_elem<_T1, 0>,
|
||||
private __compressed_pair_elem<_T2, 1> {
|
||||
public:
|
||||
// NOTE: This static assert should never fire because __compressed_pair
|
||||
// is *almost never* used in a scenario where it's possible for T1 == T2.
|
||||
// (The exception is std::function where it is possible that the function
|
||||
// object and the allocator have the same type).
|
||||
static_assert((!is_same<_T1, _T2>::value),
|
||||
"__compressed_pair cannot be instantiated when T1 and T2 are the same type; "
|
||||
"The current implementation is NOT ABI-compatible with the previous implementation for this configuration");
|
||||
|
||||
using _Base1 _LIBCPP_NODEBUG = __compressed_pair_elem<_T1, 0>;
|
||||
using _Base2 _LIBCPP_NODEBUG = __compressed_pair_elem<_T2, 1>;
|
||||
|
||||
template <bool _Dummy = true,
|
||||
class = __enable_if_t<
|
||||
__dependent_type<is_default_constructible<_T1>, _Dummy>::value &&
|
||||
__dependent_type<is_default_constructible<_T2>, _Dummy>::value
|
||||
>
|
||||
>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR
|
||||
explicit __compressed_pair() : _Base1(__value_init_tag()), _Base2(__value_init_tag()) {}
|
||||
|
||||
template <class _U1, class _U2>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR
|
||||
explicit __compressed_pair(_U1&& __t1, _U2&& __t2) : _Base1(std::forward<_U1>(__t1)), _Base2(std::forward<_U2>(__t2)) {}
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class... _Args1, class... _Args2>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17
|
||||
explicit __compressed_pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args,
|
||||
tuple<_Args2...> __second_args)
|
||||
: _Base1(__pc, std::move(__first_args), typename __make_tuple_indices<sizeof...(_Args1)>::type()),
|
||||
_Base2(__pc, std::move(__second_args), typename __make_tuple_indices<sizeof...(_Args2)>::type()) {}
|
||||
#endif
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
typename _Base1::reference first() _NOEXCEPT {
|
||||
return static_cast<_Base1&>(*this).__get();
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR
|
||||
typename _Base1::const_reference first() const _NOEXCEPT {
|
||||
return static_cast<_Base1 const&>(*this).__get();
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
typename _Base2::reference second() _NOEXCEPT {
|
||||
return static_cast<_Base2&>(*this).__get();
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR
|
||||
typename _Base2::const_reference second() const _NOEXCEPT {
|
||||
return static_cast<_Base2 const&>(*this).__get();
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR static
|
||||
_Base1* __get_first_base(__compressed_pair* __pair) _NOEXCEPT {
|
||||
return static_cast<_Base1*>(__pair);
|
||||
}
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR static
|
||||
_Base2* __get_second_base(__compressed_pair* __pair) _NOEXCEPT {
|
||||
return static_cast<_Base2*>(__pair);
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
void swap(__compressed_pair& __x)
|
||||
_NOEXCEPT_(__is_nothrow_swappable<_T1>::value && __is_nothrow_swappable<_T2>::value) {
|
||||
using std::swap;
|
||||
swap(first(), __x.first());
|
||||
swap(second(), __x.second());
|
||||
}
|
||||
};
|
||||
|
||||
template <class _T1, class _T2>
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
void swap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y)
|
||||
_NOEXCEPT_(__is_nothrow_swappable<_T1>::value && __is_nothrow_swappable<_T2>::value) {
|
||||
__x.swap(__y);
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_COMPRESSED_PAIR_H
|
69
third_party/libcxx/__memory/concepts.h
vendored
Normal file
69
third_party/libcxx/__memory/concepts.h
vendored
Normal file
|
@ -0,0 +1,69 @@
|
|||
// -*- 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_CONCEPTS_H
|
||||
#define _LIBCPP___MEMORY_CONCEPTS_H
|
||||
|
||||
#include <__concepts/same_as.h>
|
||||
#include <__config>
|
||||
#include <__iterator/concepts.h>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <__iterator/readable_traits.h>
|
||||
#include <__ranges/access.h>
|
||||
#include <__ranges/concepts.h>
|
||||
#include <__type_traits/is_reference.h>
|
||||
#include <__type_traits/remove_cvref.h>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
|
||||
namespace ranges {
|
||||
|
||||
// [special.mem.concepts]
|
||||
|
||||
// This concept ensures that uninitialized algorithms can construct an object
|
||||
// at the address pointed-to by the iterator, which requires an lvalue.
|
||||
template <class _Ip>
|
||||
concept __nothrow_input_iterator =
|
||||
input_iterator<_Ip> &&
|
||||
is_lvalue_reference_v<iter_reference_t<_Ip>> &&
|
||||
same_as<remove_cvref_t<iter_reference_t<_Ip>>, iter_value_t<_Ip>>;
|
||||
|
||||
template <class _Sp, class _Ip>
|
||||
concept __nothrow_sentinel_for = sentinel_for<_Sp, _Ip>;
|
||||
|
||||
template <class _Rp>
|
||||
concept __nothrow_input_range =
|
||||
range<_Rp> &&
|
||||
__nothrow_input_iterator<iterator_t<_Rp>> &&
|
||||
__nothrow_sentinel_for<sentinel_t<_Rp>, iterator_t<_Rp>>;
|
||||
|
||||
template <class _Ip>
|
||||
concept __nothrow_forward_iterator =
|
||||
__nothrow_input_iterator<_Ip> &&
|
||||
forward_iterator<_Ip> &&
|
||||
__nothrow_sentinel_for<_Ip, _Ip>;
|
||||
|
||||
template <class _Rp>
|
||||
concept __nothrow_forward_range =
|
||||
__nothrow_input_range<_Rp> &&
|
||||
__nothrow_forward_iterator<iterator_t<_Rp>>;
|
||||
|
||||
} // namespace ranges
|
||||
|
||||
#endif // _LIBCPP_STD_VER >= 20
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_CONCEPTS_H
|
130
third_party/libcxx/__memory/construct_at.h
vendored
Normal file
130
third_party/libcxx/__memory/construct_at.h
vendored
Normal file
|
@ -0,0 +1,130 @@
|
|||
// -*- 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_CONSTRUCT_AT_H
|
||||
#define _LIBCPP___MEMORY_CONSTRUCT_AT_H
|
||||
|
||||
#include <__assert>
|
||||
#include <__config>
|
||||
#include <__iterator/access.h>
|
||||
#include <__memory/addressof.h>
|
||||
#include <__memory/voidify.h>
|
||||
#include <__type_traits/enable_if.h>
|
||||
#include <__type_traits/is_array.h>
|
||||
#include <__utility/declval.h>
|
||||
#include <__utility/forward.h>
|
||||
#include <__utility/move.h>
|
||||
#include <new>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
// construct_at
|
||||
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
|
||||
template <class _Tp, class... _Args, class = decltype(::new(std::declval<void*>()) _Tp(std::declval<_Args>()...))>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr _Tp* construct_at(_Tp* __location, _Args&&... __args) {
|
||||
_LIBCPP_ASSERT(__location != nullptr, "null pointer given to construct_at");
|
||||
return ::new (std::__voidify(*__location)) _Tp(std::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
template <class _Tp, class... _Args, class = decltype(::new(std::declval<void*>()) _Tp(std::declval<_Args>()...))>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Tp* __construct_at(_Tp* __location, _Args&&... __args) {
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
return std::construct_at(__location, std::forward<_Args>(__args)...);
|
||||
#else
|
||||
return _LIBCPP_ASSERT(__location != nullptr, "null pointer given to construct_at"),
|
||||
::new (std::__voidify(*__location)) _Tp(std::forward<_Args>(__args)...);
|
||||
#endif
|
||||
}
|
||||
|
||||
// destroy_at
|
||||
|
||||
// The internal functions are available regardless of the language version (with the exception of the `__destroy_at`
|
||||
// taking an array).
|
||||
|
||||
template <class _ForwardIterator>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_ForwardIterator __destroy(_ForwardIterator, _ForwardIterator);
|
||||
|
||||
template <class _Tp, typename enable_if<!is_array<_Tp>::value, int>::type = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
void __destroy_at(_Tp* __loc) {
|
||||
_LIBCPP_ASSERT(__loc != nullptr, "null pointer given to destroy_at");
|
||||
__loc->~_Tp();
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
template <class _Tp, typename enable_if<is_array<_Tp>::value, int>::type = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
void __destroy_at(_Tp* __loc) {
|
||||
_LIBCPP_ASSERT(__loc != nullptr, "null pointer given to destroy_at");
|
||||
std::__destroy(std::begin(*__loc), std::end(*__loc));
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class _ForwardIterator>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_ForwardIterator __destroy(_ForwardIterator __first, _ForwardIterator __last) {
|
||||
for (; __first != __last; ++__first)
|
||||
std::__destroy_at(std::addressof(*__first));
|
||||
return __first;
|
||||
}
|
||||
|
||||
template <class _BidirectionalIterator>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_BidirectionalIterator __reverse_destroy(_BidirectionalIterator __first, _BidirectionalIterator __last) {
|
||||
while (__last != __first) {
|
||||
--__last;
|
||||
std::__destroy_at(std::addressof(*__last));
|
||||
}
|
||||
return __last;
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER >= 17
|
||||
|
||||
template <class _Tp, enable_if_t<!is_array_v<_Tp>, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
void destroy_at(_Tp* __loc) {
|
||||
std::__destroy_at(__loc);
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
template <class _Tp, enable_if_t<is_array_v<_Tp>, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
void destroy_at(_Tp* __loc) {
|
||||
std::__destroy_at(__loc);
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class _ForwardIterator>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
void destroy(_ForwardIterator __first, _ForwardIterator __last) {
|
||||
(void)std::__destroy(std::move(__first), std::move(__last));
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Size>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_ForwardIterator destroy_n(_ForwardIterator __first, _Size __n) {
|
||||
for (; __n > 0; (void)++__first, --__n)
|
||||
std::__destroy_at(std::addressof(*__first));
|
||||
return __first;
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_STD_VER >= 17
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_CONSTRUCT_AT_H
|
64
third_party/libcxx/__memory/destruct_n.h
vendored
Normal file
64
third_party/libcxx/__memory/destruct_n.h
vendored
Normal file
|
@ -0,0 +1,64 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// 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_DESTRUCT_N_H
|
||||
#define _LIBCPP___MEMORY_DESTRUCT_N_H
|
||||
|
||||
#include <__config>
|
||||
#include <__type_traits/integral_constant.h>
|
||||
#include <__type_traits/is_trivially_destructible.h>
|
||||
#include <cstddef>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
struct __destruct_n
|
||||
{
|
||||
private:
|
||||
size_t __size_;
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT
|
||||
{for (size_t __i = 0; __i < __size_; ++__i, ++__p) __p->~_Tp();}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT
|
||||
{}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT
|
||||
{++__size_;}
|
||||
_LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT
|
||||
{}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT
|
||||
{__size_ = __s;}
|
||||
_LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT
|
||||
{}
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT
|
||||
: __size_(__s) {}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY void __incr() _NOEXCEPT
|
||||
{__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT
|
||||
{__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT
|
||||
{__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
|
||||
};
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_DESTRUCT_N_H
|
242
third_party/libcxx/__memory/pointer_traits.h
vendored
Normal file
242
third_party/libcxx/__memory/pointer_traits.h
vendored
Normal file
|
@ -0,0 +1,242 @@
|
|||
// -*- 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_POINTER_TRAITS_H
|
||||
#define _LIBCPP___MEMORY_POINTER_TRAITS_H
|
||||
|
||||
#include <__config>
|
||||
#include <__memory/addressof.h>
|
||||
#include <__type_traits/conditional.h>
|
||||
#include <__type_traits/conjunction.h>
|
||||
#include <__type_traits/decay.h>
|
||||
#include <__type_traits/is_class.h>
|
||||
#include <__type_traits/is_function.h>
|
||||
#include <__type_traits/is_void.h>
|
||||
#include <__type_traits/void_t.h>
|
||||
#include <__utility/declval.h>
|
||||
#include <cstddef>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp, class = void>
|
||||
struct __has_element_type : false_type {};
|
||||
|
||||
template <class _Tp>
|
||||
struct __has_element_type<_Tp, __void_t<typename _Tp::element_type> > : true_type {};
|
||||
|
||||
template <class _Ptr, bool = __has_element_type<_Ptr>::value>
|
||||
struct __pointer_traits_element_type;
|
||||
|
||||
template <class _Ptr>
|
||||
struct __pointer_traits_element_type<_Ptr, true>
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG typename _Ptr::element_type type;
|
||||
};
|
||||
|
||||
template <template <class, class...> class _Sp, class _Tp, class ..._Args>
|
||||
struct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true>
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG typename _Sp<_Tp, _Args...>::element_type type;
|
||||
};
|
||||
|
||||
template <template <class, class...> class _Sp, class _Tp, class ..._Args>
|
||||
struct __pointer_traits_element_type<_Sp<_Tp, _Args...>, false>
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG _Tp type;
|
||||
};
|
||||
|
||||
template <class _Tp, class = void>
|
||||
struct __has_difference_type : false_type {};
|
||||
|
||||
template <class _Tp>
|
||||
struct __has_difference_type<_Tp, __void_t<typename _Tp::difference_type> > : true_type {};
|
||||
|
||||
template <class _Ptr, bool = __has_difference_type<_Ptr>::value>
|
||||
struct __pointer_traits_difference_type
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG ptrdiff_t type;
|
||||
};
|
||||
|
||||
template <class _Ptr>
|
||||
struct __pointer_traits_difference_type<_Ptr, true>
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG typename _Ptr::difference_type type;
|
||||
};
|
||||
|
||||
template <class _Tp, class _Up>
|
||||
struct __has_rebind
|
||||
{
|
||||
private:
|
||||
template <class _Xp> static false_type __test(...);
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
template <class _Xp> static true_type __test(typename _Xp::template rebind<_Up>* = 0);
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
public:
|
||||
static const bool value = decltype(__test<_Tp>(0))::value;
|
||||
};
|
||||
|
||||
template <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value>
|
||||
struct __pointer_traits_rebind
|
||||
{
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef _LIBCPP_NODEBUG typename _Tp::template rebind<_Up> type;
|
||||
#else
|
||||
typedef _LIBCPP_NODEBUG typename _Tp::template rebind<_Up>::other type;
|
||||
#endif
|
||||
};
|
||||
|
||||
template <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up>
|
||||
struct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, true>
|
||||
{
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef _LIBCPP_NODEBUG typename _Sp<_Tp, _Args...>::template rebind<_Up> type;
|
||||
#else
|
||||
typedef _LIBCPP_NODEBUG typename _Sp<_Tp, _Args...>::template rebind<_Up>::other type;
|
||||
#endif
|
||||
};
|
||||
|
||||
template <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up>
|
||||
struct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false>
|
||||
{
|
||||
typedef _Sp<_Up, _Args...> type;
|
||||
};
|
||||
|
||||
template <class _Ptr>
|
||||
struct _LIBCPP_TEMPLATE_VIS pointer_traits
|
||||
{
|
||||
typedef _Ptr pointer;
|
||||
typedef typename __pointer_traits_element_type<pointer>::type element_type;
|
||||
typedef typename __pointer_traits_difference_type<pointer>::type difference_type;
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class _Up> using rebind = typename __pointer_traits_rebind<pointer, _Up>::type;
|
||||
#else
|
||||
template <class _Up> struct rebind
|
||||
{typedef typename __pointer_traits_rebind<pointer, _Up>::type other;};
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
private:
|
||||
struct __nat {};
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
static pointer pointer_to(__conditional_t<is_void<element_type>::value, __nat, element_type>& __r)
|
||||
{return pointer::pointer_to(__r);}
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_TEMPLATE_VIS pointer_traits<_Tp*>
|
||||
{
|
||||
typedef _Tp* pointer;
|
||||
typedef _Tp element_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class _Up> using rebind = _Up*;
|
||||
#else
|
||||
template <class _Up> struct rebind {typedef _Up* other;};
|
||||
#endif
|
||||
|
||||
private:
|
||||
struct __nat {};
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
static pointer pointer_to(__conditional_t<is_void<element_type>::value, __nat, element_type>& __r) _NOEXCEPT
|
||||
{return _VSTD::addressof(__r);}
|
||||
};
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class _From, class _To>
|
||||
using __rebind_pointer_t = typename pointer_traits<_From>::template rebind<_To>;
|
||||
#else
|
||||
template <class _From, class _To>
|
||||
using __rebind_pointer_t = typename pointer_traits<_From>::template rebind<_To>::other;
|
||||
#endif
|
||||
|
||||
// to_address
|
||||
|
||||
template <class _Pointer, class = void>
|
||||
struct __to_address_helper;
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
_Tp* __to_address(_Tp* __p) _NOEXCEPT {
|
||||
static_assert(!is_function<_Tp>::value, "_Tp is a function type");
|
||||
return __p;
|
||||
}
|
||||
|
||||
template <class _Pointer, class = void>
|
||||
struct _HasToAddress : false_type {};
|
||||
|
||||
template <class _Pointer>
|
||||
struct _HasToAddress<_Pointer,
|
||||
decltype((void)pointer_traits<_Pointer>::to_address(std::declval<const _Pointer&>()))
|
||||
> : true_type {};
|
||||
|
||||
template <class _Pointer, class = void>
|
||||
struct _HasArrow : false_type {};
|
||||
|
||||
template <class _Pointer>
|
||||
struct _HasArrow<_Pointer,
|
||||
decltype((void)std::declval<const _Pointer&>().operator->())
|
||||
> : true_type {};
|
||||
|
||||
template <class _Pointer>
|
||||
struct _IsFancyPointer {
|
||||
static const bool value = _HasArrow<_Pointer>::value || _HasToAddress<_Pointer>::value;
|
||||
};
|
||||
|
||||
// enable_if is needed here to avoid instantiating checks for fancy pointers on raw pointers
|
||||
template <class _Pointer, class = __enable_if_t<
|
||||
_And<is_class<_Pointer>, _IsFancyPointer<_Pointer> >::value
|
||||
> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
__decay_t<decltype(__to_address_helper<_Pointer>::__call(std::declval<const _Pointer&>()))>
|
||||
__to_address(const _Pointer& __p) _NOEXCEPT {
|
||||
return __to_address_helper<_Pointer>::__call(__p);
|
||||
}
|
||||
|
||||
template <class _Pointer, class>
|
||||
struct __to_address_helper {
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
static decltype(_VSTD::__to_address(std::declval<const _Pointer&>().operator->()))
|
||||
__call(const _Pointer& __p) _NOEXCEPT {
|
||||
return _VSTD::__to_address(__p.operator->());
|
||||
}
|
||||
};
|
||||
|
||||
template <class _Pointer>
|
||||
struct __to_address_helper<_Pointer, decltype((void)pointer_traits<_Pointer>::to_address(std::declval<const _Pointer&>()))> {
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
static decltype(pointer_traits<_Pointer>::to_address(std::declval<const _Pointer&>()))
|
||||
__call(const _Pointer& __p) _NOEXCEPT {
|
||||
return pointer_traits<_Pointer>::to_address(__p);
|
||||
}
|
||||
};
|
||||
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY constexpr
|
||||
auto to_address(_Tp *__p) noexcept {
|
||||
return _VSTD::__to_address(__p);
|
||||
}
|
||||
|
||||
template <class _Pointer>
|
||||
inline _LIBCPP_INLINE_VISIBILITY constexpr
|
||||
auto to_address(const _Pointer& __p) noexcept -> decltype(std::__to_address(__p)) {
|
||||
return _VSTD::__to_address(__p);
|
||||
}
|
||||
#endif
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_POINTER_TRAITS_H
|
125
third_party/libcxx/__memory/ranges_construct_at.h
vendored
Normal file
125
third_party/libcxx/__memory/ranges_construct_at.h
vendored
Normal file
|
@ -0,0 +1,125 @@
|
|||
// -*- 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_RANGES_CONSTRUCT_AT_H
|
||||
#define _LIBCPP___MEMORY_RANGES_CONSTRUCT_AT_H
|
||||
|
||||
#include <__concepts/destructible.h>
|
||||
#include <__config>
|
||||
#include <__iterator/incrementable_traits.h>
|
||||
#include <__iterator/readable_traits.h>
|
||||
#include <__memory/concepts.h>
|
||||
#include <__memory/construct_at.h>
|
||||
#include <__ranges/access.h>
|
||||
#include <__ranges/concepts.h>
|
||||
#include <__ranges/dangling.h>
|
||||
#include <__utility/declval.h>
|
||||
#include <__utility/forward.h>
|
||||
#include <__utility/move.h>
|
||||
#include <new>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
namespace ranges {
|
||||
|
||||
// construct_at
|
||||
|
||||
namespace __construct_at {
|
||||
|
||||
struct __fn {
|
||||
template<class _Tp, class... _Args, class = decltype(
|
||||
::new (std::declval<void*>()) _Tp(std::declval<_Args>()...)
|
||||
)>
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
constexpr _Tp* operator()(_Tp* __location, _Args&& ...__args) const {
|
||||
return _VSTD::construct_at(__location, _VSTD::forward<_Args>(__args)...);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __construct_at
|
||||
|
||||
inline namespace __cpo {
|
||||
inline constexpr auto construct_at = __construct_at::__fn{};
|
||||
} // namespace __cpo
|
||||
|
||||
// destroy_at
|
||||
|
||||
namespace __destroy_at {
|
||||
|
||||
struct __fn {
|
||||
template <destructible _Tp>
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
constexpr void operator()(_Tp* __location) const noexcept {
|
||||
_VSTD::destroy_at(__location);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __destroy_at
|
||||
|
||||
inline namespace __cpo {
|
||||
inline constexpr auto destroy_at = __destroy_at::__fn{};
|
||||
} // namespace __cpo
|
||||
|
||||
// destroy
|
||||
|
||||
namespace __destroy {
|
||||
|
||||
struct __fn {
|
||||
template <__nothrow_input_iterator _InputIterator, __nothrow_sentinel_for<_InputIterator> _Sentinel>
|
||||
requires destructible<iter_value_t<_InputIterator>>
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
constexpr _InputIterator operator()(_InputIterator __first, _Sentinel __last) const noexcept {
|
||||
return _VSTD::__destroy(_VSTD::move(__first), _VSTD::move(__last));
|
||||
}
|
||||
|
||||
template <__nothrow_input_range _InputRange>
|
||||
requires destructible<range_value_t<_InputRange>>
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
constexpr borrowed_iterator_t<_InputRange> operator()(_InputRange&& __range) const noexcept {
|
||||
return (*this)(ranges::begin(__range), ranges::end(__range));
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __destroy
|
||||
|
||||
inline namespace __cpo {
|
||||
inline constexpr auto destroy = __destroy::__fn{};
|
||||
} // namespace __cpo
|
||||
|
||||
// destroy_n
|
||||
|
||||
namespace __destroy_n {
|
||||
|
||||
struct __fn {
|
||||
template <__nothrow_input_iterator _InputIterator>
|
||||
requires destructible<iter_value_t<_InputIterator>>
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
constexpr _InputIterator operator()(_InputIterator __first, iter_difference_t<_InputIterator> __n) const noexcept {
|
||||
return _VSTD::destroy_n(_VSTD::move(__first), __n);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __destroy_n
|
||||
|
||||
inline namespace __cpo {
|
||||
inline constexpr auto destroy_n = __destroy_n::__fn{};
|
||||
} // namespace __cpo
|
||||
|
||||
} // namespace ranges
|
||||
|
||||
#endif // _LIBCPP_STD_VER >= 20
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_RANGES_CONSTRUCT_AT_H
|
319
third_party/libcxx/__memory/ranges_uninitialized_algorithms.h
vendored
Normal file
319
third_party/libcxx/__memory/ranges_uninitialized_algorithms.h
vendored
Normal file
|
@ -0,0 +1,319 @@
|
|||
// -*- 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_RANGES_UNINITIALIZED_ALGORITHMS_H
|
||||
#define _LIBCPP___MEMORY_RANGES_UNINITIALIZED_ALGORITHMS_H
|
||||
|
||||
#include <__algorithm/in_out_result.h>
|
||||
#include <__concepts/constructible.h>
|
||||
#include <__config>
|
||||
#include <__iterator/concepts.h>
|
||||
#include <__iterator/incrementable_traits.h>
|
||||
#include <__iterator/iter_move.h>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <__iterator/readable_traits.h>
|
||||
#include <__memory/concepts.h>
|
||||
#include <__memory/uninitialized_algorithms.h>
|
||||
#include <__ranges/access.h>
|
||||
#include <__ranges/concepts.h>
|
||||
#include <__ranges/dangling.h>
|
||||
#include <__type_traits/remove_reference.h>
|
||||
#include <__utility/move.h>
|
||||
#include <new>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
|
||||
namespace ranges {
|
||||
|
||||
// uninitialized_default_construct
|
||||
|
||||
namespace __uninitialized_default_construct {
|
||||
|
||||
struct __fn {
|
||||
template <__nothrow_forward_iterator _ForwardIterator,
|
||||
__nothrow_sentinel_for<_ForwardIterator> _Sentinel>
|
||||
requires default_initializable<iter_value_t<_ForwardIterator>>
|
||||
_LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first, _Sentinel __last) const {
|
||||
using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;
|
||||
return _VSTD::__uninitialized_default_construct<_ValueType>(
|
||||
_VSTD::move(__first), _VSTD::move(__last));
|
||||
}
|
||||
|
||||
template <__nothrow_forward_range _ForwardRange>
|
||||
requires default_initializable<range_value_t<_ForwardRange>>
|
||||
_LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_ForwardRange> operator()(_ForwardRange&& __range) const {
|
||||
return (*this)(ranges::begin(__range), ranges::end(__range));
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __uninitialized_default_construct
|
||||
|
||||
inline namespace __cpo {
|
||||
inline constexpr auto uninitialized_default_construct = __uninitialized_default_construct::__fn{};
|
||||
} // namespace __cpo
|
||||
|
||||
// uninitialized_default_construct_n
|
||||
|
||||
namespace __uninitialized_default_construct_n {
|
||||
|
||||
struct __fn {
|
||||
template <__nothrow_forward_iterator _ForwardIterator>
|
||||
requires default_initializable<iter_value_t<_ForwardIterator>>
|
||||
_LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first,
|
||||
iter_difference_t<_ForwardIterator> __n) const {
|
||||
using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;
|
||||
return _VSTD::__uninitialized_default_construct_n<_ValueType>(_VSTD::move(__first), __n);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __uninitialized_default_construct_n
|
||||
|
||||
inline namespace __cpo {
|
||||
inline constexpr auto uninitialized_default_construct_n = __uninitialized_default_construct_n::__fn{};
|
||||
} // namespace __cpo
|
||||
|
||||
// uninitialized_value_construct
|
||||
|
||||
namespace __uninitialized_value_construct {
|
||||
|
||||
struct __fn {
|
||||
template <__nothrow_forward_iterator _ForwardIterator,
|
||||
__nothrow_sentinel_for<_ForwardIterator> _Sentinel>
|
||||
requires default_initializable<iter_value_t<_ForwardIterator>>
|
||||
_LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first, _Sentinel __last) const {
|
||||
using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;
|
||||
return _VSTD::__uninitialized_value_construct<_ValueType>(
|
||||
_VSTD::move(__first), _VSTD::move(__last));
|
||||
}
|
||||
|
||||
template <__nothrow_forward_range _ForwardRange>
|
||||
requires default_initializable<range_value_t<_ForwardRange>>
|
||||
_LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_ForwardRange> operator()(_ForwardRange&& __range) const {
|
||||
return (*this)(ranges::begin(__range), ranges::end(__range));
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __uninitialized_value_construct
|
||||
|
||||
inline namespace __cpo {
|
||||
inline constexpr auto uninitialized_value_construct = __uninitialized_value_construct::__fn{};
|
||||
} // namespace __cpo
|
||||
|
||||
// uninitialized_value_construct_n
|
||||
|
||||
namespace __uninitialized_value_construct_n {
|
||||
|
||||
struct __fn {
|
||||
template <__nothrow_forward_iterator _ForwardIterator>
|
||||
requires default_initializable<iter_value_t<_ForwardIterator>>
|
||||
_LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first,
|
||||
iter_difference_t<_ForwardIterator> __n) const {
|
||||
using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;
|
||||
return _VSTD::__uninitialized_value_construct_n<_ValueType>(_VSTD::move(__first), __n);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __uninitialized_value_construct_n
|
||||
|
||||
inline namespace __cpo {
|
||||
inline constexpr auto uninitialized_value_construct_n = __uninitialized_value_construct_n::__fn{};
|
||||
} // namespace __cpo
|
||||
|
||||
// uninitialized_fill
|
||||
|
||||
namespace __uninitialized_fill {
|
||||
|
||||
struct __fn {
|
||||
template <__nothrow_forward_iterator _ForwardIterator,
|
||||
__nothrow_sentinel_for<_ForwardIterator> _Sentinel,
|
||||
class _Tp>
|
||||
requires constructible_from<iter_value_t<_ForwardIterator>, const _Tp&>
|
||||
_LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first, _Sentinel __last, const _Tp& __x) const {
|
||||
using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;
|
||||
return _VSTD::__uninitialized_fill<_ValueType>(_VSTD::move(__first), _VSTD::move(__last), __x);
|
||||
}
|
||||
|
||||
template <__nothrow_forward_range _ForwardRange, class _Tp>
|
||||
requires constructible_from<range_value_t<_ForwardRange>, const _Tp&>
|
||||
_LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_ForwardRange> operator()(_ForwardRange&& __range, const _Tp& __x) const {
|
||||
return (*this)(ranges::begin(__range), ranges::end(__range), __x);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __uninitialized_fill
|
||||
|
||||
inline namespace __cpo {
|
||||
inline constexpr auto uninitialized_fill = __uninitialized_fill::__fn{};
|
||||
} // namespace __cpo
|
||||
|
||||
// uninitialized_fill_n
|
||||
|
||||
namespace __uninitialized_fill_n {
|
||||
|
||||
struct __fn {
|
||||
template <__nothrow_forward_iterator _ForwardIterator, class _Tp>
|
||||
requires constructible_from<iter_value_t<_ForwardIterator>, const _Tp&>
|
||||
_LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first,
|
||||
iter_difference_t<_ForwardIterator> __n,
|
||||
const _Tp& __x) const {
|
||||
using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;
|
||||
return _VSTD::__uninitialized_fill_n<_ValueType>(_VSTD::move(__first), __n, __x);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __uninitialized_fill_n
|
||||
|
||||
inline namespace __cpo {
|
||||
inline constexpr auto uninitialized_fill_n = __uninitialized_fill_n::__fn{};
|
||||
} // namespace __cpo
|
||||
|
||||
// uninitialized_copy
|
||||
|
||||
template <class _InputIterator, class _OutputIterator>
|
||||
using uninitialized_copy_result = in_out_result<_InputIterator, _OutputIterator>;
|
||||
|
||||
namespace __uninitialized_copy {
|
||||
|
||||
struct __fn {
|
||||
template <input_iterator _InputIterator,
|
||||
sentinel_for<_InputIterator> _Sentinel1,
|
||||
__nothrow_forward_iterator _OutputIterator,
|
||||
__nothrow_sentinel_for<_OutputIterator> _Sentinel2>
|
||||
requires constructible_from<iter_value_t<_OutputIterator>, iter_reference_t<_InputIterator>>
|
||||
_LIBCPP_HIDE_FROM_ABI uninitialized_copy_result<_InputIterator, _OutputIterator>
|
||||
operator()(_InputIterator __ifirst, _Sentinel1 __ilast, _OutputIterator __ofirst, _Sentinel2 __olast) const {
|
||||
using _ValueType = remove_reference_t<iter_reference_t<_OutputIterator>>;
|
||||
|
||||
auto __result = _VSTD::__uninitialized_copy<_ValueType>(_VSTD::move(__ifirst), _VSTD::move(__ilast),
|
||||
_VSTD::move(__ofirst), _VSTD::move(__olast));
|
||||
return {_VSTD::move(__result.first), _VSTD::move(__result.second)};
|
||||
}
|
||||
|
||||
template <input_range _InputRange, __nothrow_forward_range _OutputRange>
|
||||
requires constructible_from<range_value_t<_OutputRange>, range_reference_t<_InputRange>>
|
||||
_LIBCPP_HIDE_FROM_ABI uninitialized_copy_result<borrowed_iterator_t<_InputRange>, borrowed_iterator_t<_OutputRange>>
|
||||
operator()( _InputRange&& __in_range, _OutputRange&& __out_range) const {
|
||||
return (*this)(ranges::begin(__in_range), ranges::end(__in_range),
|
||||
ranges::begin(__out_range), ranges::end(__out_range));
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __uninitialized_copy
|
||||
|
||||
inline namespace __cpo {
|
||||
inline constexpr auto uninitialized_copy = __uninitialized_copy::__fn{};
|
||||
} // namespace __cpo
|
||||
|
||||
// uninitialized_copy_n
|
||||
|
||||
template <class _InputIterator, class _OutputIterator>
|
||||
using uninitialized_copy_n_result = in_out_result<_InputIterator, _OutputIterator>;
|
||||
|
||||
namespace __uninitialized_copy_n {
|
||||
|
||||
struct __fn {
|
||||
template <input_iterator _InputIterator,
|
||||
__nothrow_forward_iterator _OutputIterator,
|
||||
__nothrow_sentinel_for<_OutputIterator> _Sentinel>
|
||||
requires constructible_from<iter_value_t<_OutputIterator>, iter_reference_t<_InputIterator>>
|
||||
_LIBCPP_HIDE_FROM_ABI uninitialized_copy_n_result<_InputIterator, _OutputIterator>
|
||||
operator()(_InputIterator __ifirst, iter_difference_t<_InputIterator> __n,
|
||||
_OutputIterator __ofirst, _Sentinel __olast) const {
|
||||
using _ValueType = remove_reference_t<iter_reference_t<_OutputIterator>>;
|
||||
auto __result = _VSTD::__uninitialized_copy_n<_ValueType>(_VSTD::move(__ifirst), __n,
|
||||
_VSTD::move(__ofirst), _VSTD::move(__olast));
|
||||
return {_VSTD::move(__result.first), _VSTD::move(__result.second)};
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __uninitialized_copy_n
|
||||
|
||||
inline namespace __cpo {
|
||||
inline constexpr auto uninitialized_copy_n = __uninitialized_copy_n::__fn{};
|
||||
} // namespace __cpo
|
||||
|
||||
// uninitialized_move
|
||||
|
||||
template <class _InputIterator, class _OutputIterator>
|
||||
using uninitialized_move_result = in_out_result<_InputIterator, _OutputIterator>;
|
||||
|
||||
namespace __uninitialized_move {
|
||||
|
||||
struct __fn {
|
||||
template <input_iterator _InputIterator,
|
||||
sentinel_for<_InputIterator> _Sentinel1,
|
||||
__nothrow_forward_iterator _OutputIterator,
|
||||
__nothrow_sentinel_for<_OutputIterator> _Sentinel2>
|
||||
requires constructible_from<iter_value_t<_OutputIterator>, iter_rvalue_reference_t<_InputIterator>>
|
||||
_LIBCPP_HIDE_FROM_ABI uninitialized_move_result<_InputIterator, _OutputIterator>
|
||||
operator()(_InputIterator __ifirst, _Sentinel1 __ilast, _OutputIterator __ofirst, _Sentinel2 __olast) const {
|
||||
using _ValueType = remove_reference_t<iter_reference_t<_OutputIterator>>;
|
||||
auto __iter_move = [](auto&& __iter) -> decltype(auto) { return ranges::iter_move(__iter); };
|
||||
auto __result = _VSTD::__uninitialized_move<_ValueType>(_VSTD::move(__ifirst), _VSTD::move(__ilast),
|
||||
_VSTD::move(__ofirst), _VSTD::move(__olast), __iter_move);
|
||||
return {_VSTD::move(__result.first), _VSTD::move(__result.second)};
|
||||
}
|
||||
|
||||
template <input_range _InputRange, __nothrow_forward_range _OutputRange>
|
||||
requires constructible_from<range_value_t<_OutputRange>, range_rvalue_reference_t<_InputRange>>
|
||||
_LIBCPP_HIDE_FROM_ABI uninitialized_move_result<borrowed_iterator_t<_InputRange>, borrowed_iterator_t<_OutputRange>>
|
||||
operator()(_InputRange&& __in_range, _OutputRange&& __out_range) const {
|
||||
return (*this)(ranges::begin(__in_range), ranges::end(__in_range),
|
||||
ranges::begin(__out_range), ranges::end(__out_range));
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __uninitialized_move
|
||||
|
||||
inline namespace __cpo {
|
||||
inline constexpr auto uninitialized_move = __uninitialized_move::__fn{};
|
||||
} // namespace __cpo
|
||||
|
||||
// uninitialized_move_n
|
||||
|
||||
template <class _InputIterator, class _OutputIterator>
|
||||
using uninitialized_move_n_result = in_out_result<_InputIterator, _OutputIterator>;
|
||||
|
||||
namespace __uninitialized_move_n {
|
||||
|
||||
struct __fn {
|
||||
template <input_iterator _InputIterator,
|
||||
__nothrow_forward_iterator _OutputIterator,
|
||||
__nothrow_sentinel_for<_OutputIterator> _Sentinel>
|
||||
requires constructible_from<iter_value_t<_OutputIterator>, iter_rvalue_reference_t<_InputIterator>>
|
||||
_LIBCPP_HIDE_FROM_ABI uninitialized_move_n_result<_InputIterator, _OutputIterator>
|
||||
operator()(_InputIterator __ifirst, iter_difference_t<_InputIterator> __n,
|
||||
_OutputIterator __ofirst, _Sentinel __olast) const {
|
||||
using _ValueType = remove_reference_t<iter_reference_t<_OutputIterator>>;
|
||||
auto __iter_move = [](auto&& __iter) -> decltype(auto) { return ranges::iter_move(__iter); };
|
||||
auto __result = _VSTD::__uninitialized_move_n<_ValueType>(_VSTD::move(__ifirst), __n,
|
||||
_VSTD::move(__ofirst), _VSTD::move(__olast), __iter_move);
|
||||
return {_VSTD::move(__result.first), _VSTD::move(__result.second)};
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __uninitialized_move_n
|
||||
|
||||
inline namespace __cpo {
|
||||
inline constexpr auto uninitialized_move_n = __uninitialized_move_n::__fn{};
|
||||
} // namespace __cpo
|
||||
|
||||
} // namespace ranges
|
||||
|
||||
#endif // _LIBCPP_STD_VER >= 20
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_RANGES_UNINITIALIZED_ALGORITHMS_H
|
70
third_party/libcxx/__memory/raw_storage_iterator.h
vendored
Normal file
70
third_party/libcxx/__memory/raw_storage_iterator.h
vendored
Normal file
|
@ -0,0 +1,70 @@
|
|||
// -*- 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_RAW_STORAGE_ITERATOR_H
|
||||
#define _LIBCPP___MEMORY_RAW_STORAGE_ITERATOR_H
|
||||
|
||||
#include <__config>
|
||||
#include <__iterator/iterator.h>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <__memory/addressof.h>
|
||||
#include <__utility/move.h>
|
||||
#include <cstddef>
|
||||
#include <new>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_RAW_STORAGE_ITERATOR)
|
||||
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
template <class _OutputIterator, class _Tp>
|
||||
class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 raw_storage_iterator
|
||||
#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES)
|
||||
: public iterator<output_iterator_tag, void, void, void, void>
|
||||
#endif
|
||||
{
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
private:
|
||||
_OutputIterator __x_;
|
||||
public:
|
||||
typedef output_iterator_tag iterator_category;
|
||||
typedef void value_type;
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
typedef ptrdiff_t difference_type;
|
||||
#else
|
||||
typedef void difference_type;
|
||||
#endif
|
||||
typedef void pointer;
|
||||
typedef void reference;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {}
|
||||
_LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element)
|
||||
{::new ((void*)_VSTD::addressof(*__x_)) _Tp(__element); return *this;}
|
||||
#if _LIBCPP_STD_VER >= 14
|
||||
_LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(_Tp&& __element)
|
||||
{::new ((void*)_VSTD::addressof(*__x_)) _Tp(_VSTD::move(__element)); return *this;}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY raw_storage_iterator operator++(int)
|
||||
{raw_storage_iterator __t(*this); ++__x_; return __t;}
|
||||
#if _LIBCPP_STD_VER >= 14
|
||||
_LIBCPP_INLINE_VISIBILITY _OutputIterator base() const { return __x_; }
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif // _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_RAW_STORAGE_ITERATOR)
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_RAW_STORAGE_ITERATOR_H
|
2089
third_party/libcxx/__memory/shared_ptr.h
vendored
Normal file
2089
third_party/libcxx/__memory/shared_ptr.h
vendored
Normal file
File diff suppressed because it is too large
Load diff
54
third_party/libcxx/__memory/swap_allocator.h
vendored
Normal file
54
third_party/libcxx/__memory/swap_allocator.h
vendored
Normal file
|
@ -0,0 +1,54 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// 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_SWAP_ALLOCATOR_H
|
||||
#define _LIBCPP___MEMORY_SWAP_ALLOCATOR_H
|
||||
|
||||
#include <__config>
|
||||
#include <__memory/allocator_traits.h>
|
||||
#include <__type_traits/integral_constant.h>
|
||||
#include <__type_traits/is_swappable.h>
|
||||
#include <__utility/swap.h>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <typename _Alloc>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void __swap_allocator(_Alloc& __a1, _Alloc& __a2, true_type)
|
||||
#if _LIBCPP_STD_VER >= 14
|
||||
_NOEXCEPT
|
||||
#else
|
||||
_NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value)
|
||||
#endif
|
||||
{
|
||||
using _VSTD::swap;
|
||||
swap(__a1, __a2);
|
||||
}
|
||||
|
||||
template <typename _Alloc>
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void
|
||||
__swap_allocator(_Alloc&, _Alloc&, false_type) _NOEXCEPT {}
|
||||
|
||||
template <typename _Alloc>
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void __swap_allocator(_Alloc& __a1, _Alloc& __a2)
|
||||
#if _LIBCPP_STD_VER >= 14
|
||||
_NOEXCEPT
|
||||
#else
|
||||
_NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value)
|
||||
#endif
|
||||
{
|
||||
_VSTD::__swap_allocator(
|
||||
__a1, __a2, integral_constant<bool, allocator_traits<_Alloc>::propagate_on_container_swap::value>());
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_SWAP_ALLOCATOR_H
|
56
third_party/libcxx/__memory/temp_value.h
vendored
Normal file
56
third_party/libcxx/__memory/temp_value.h
vendored
Normal file
|
@ -0,0 +1,56 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// 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_TEMP_VALUE_H
|
||||
#define _LIBCPP___MEMORY_TEMP_VALUE_H
|
||||
|
||||
#include <__config>
|
||||
#include <__memory/addressof.h>
|
||||
#include <__memory/allocator_traits.h>
|
||||
#include <__type_traits/aligned_storage.h>
|
||||
#include <__utility/forward.h>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
struct __temp_value {
|
||||
typedef allocator_traits<_Alloc> _Traits;
|
||||
|
||||
#ifdef _LIBCPP_CXX03_LANG
|
||||
typename aligned_storage<sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)>::type __v;
|
||||
#else
|
||||
union { _Tp __v; };
|
||||
#endif
|
||||
_Alloc &__a;
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Tp *__addr() {
|
||||
#ifdef _LIBCPP_CXX03_LANG
|
||||
return reinterpret_cast<_Tp*>(std::addressof(__v));
|
||||
#else
|
||||
return std::addressof(__v);
|
||||
#endif
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Tp & get() { return *__addr(); }
|
||||
|
||||
template<class... _Args>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_NO_CFI
|
||||
_LIBCPP_CONSTEXPR_SINCE_CXX20 __temp_value(_Alloc &__alloc, _Args&& ... __args) : __a(__alloc) {
|
||||
_Traits::construct(__a, __addr(), std::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 ~__temp_value() { _Traits::destroy(__a, __addr()); }
|
||||
};
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_TEMP_VALUE_H
|
87
third_party/libcxx/__memory/temporary_buffer.h
vendored
Normal file
87
third_party/libcxx/__memory/temporary_buffer.h
vendored
Normal file
|
@ -0,0 +1,87 @@
|
|||
// -*- 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_TEMPORARY_BUFFER_H
|
||||
#define _LIBCPP___MEMORY_TEMPORARY_BUFFER_H
|
||||
|
||||
#include <__config>
|
||||
#include <__type_traits/alignment_of.h>
|
||||
#include <__utility/pair.h>
|
||||
#include <cstddef>
|
||||
#include <new>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_NO_CFI _LIBCPP_DEPRECATED_IN_CXX17
|
||||
pair<_Tp*, ptrdiff_t>
|
||||
get_temporary_buffer(ptrdiff_t __n) _NOEXCEPT
|
||||
{
|
||||
pair<_Tp*, ptrdiff_t> __r(0, 0);
|
||||
const ptrdiff_t __m = (~ptrdiff_t(0) ^
|
||||
ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1)))
|
||||
/ sizeof(_Tp);
|
||||
if (__n > __m)
|
||||
__n = __m;
|
||||
while (__n > 0)
|
||||
{
|
||||
#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION)
|
||||
if (__is_overaligned_for_new(_LIBCPP_ALIGNOF(_Tp)))
|
||||
{
|
||||
align_val_t __al =
|
||||
align_val_t(alignment_of<_Tp>::value);
|
||||
__r.first = static_cast<_Tp*>(::operator new(
|
||||
__n * sizeof(_Tp), __al, nothrow));
|
||||
} else {
|
||||
__r.first = static_cast<_Tp*>(::operator new(
|
||||
__n * sizeof(_Tp), nothrow));
|
||||
}
|
||||
#else
|
||||
if (__is_overaligned_for_new(_LIBCPP_ALIGNOF(_Tp)))
|
||||
{
|
||||
// Since aligned operator new is unavailable, return an empty
|
||||
// buffer rather than one with invalid alignment.
|
||||
return __r;
|
||||
}
|
||||
|
||||
__r.first = static_cast<_Tp*>(::operator new(__n * sizeof(_Tp), nothrow));
|
||||
#endif
|
||||
|
||||
if (__r.first)
|
||||
{
|
||||
__r.second = __n;
|
||||
break;
|
||||
}
|
||||
__n /= 2;
|
||||
}
|
||||
return __r;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_IN_CXX17
|
||||
void return_temporary_buffer(_Tp* __p) _NOEXCEPT
|
||||
{
|
||||
_VSTD::__libcpp_deallocate_unsized((void*)__p, _LIBCPP_ALIGNOF(_Tp));
|
||||
}
|
||||
|
||||
struct __return_temporary_buffer
|
||||
{
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_temporary_buffer(__p);}
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
};
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_TEMPORARY_BUFFER_H
|
657
third_party/libcxx/__memory/uninitialized_algorithms.h
vendored
Normal file
657
third_party/libcxx/__memory/uninitialized_algorithms.h
vendored
Normal file
|
@ -0,0 +1,657 @@
|
|||
// -*- 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_UNINITIALIZED_ALGORITHMS_H
|
||||
#define _LIBCPP___MEMORY_UNINITIALIZED_ALGORITHMS_H
|
||||
|
||||
#include <__algorithm/copy.h>
|
||||
#include <__algorithm/move.h>
|
||||
#include <__algorithm/unwrap_iter.h>
|
||||
#include <__algorithm/unwrap_range.h>
|
||||
#include <__config>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <__iterator/reverse_iterator.h>
|
||||
#include <__memory/addressof.h>
|
||||
#include <__memory/allocator_traits.h>
|
||||
#include <__memory/construct_at.h>
|
||||
#include <__memory/pointer_traits.h>
|
||||
#include <__memory/voidify.h>
|
||||
#include <__type_traits/extent.h>
|
||||
#include <__type_traits/is_array.h>
|
||||
#include <__type_traits/is_constant_evaluated.h>
|
||||
#include <__type_traits/is_trivially_copy_assignable.h>
|
||||
#include <__type_traits/is_trivially_copy_constructible.h>
|
||||
#include <__type_traits/is_trivially_move_assignable.h>
|
||||
#include <__type_traits/is_trivially_move_constructible.h>
|
||||
#include <__type_traits/is_unbounded_array.h>
|
||||
#include <__type_traits/negation.h>
|
||||
#include <__type_traits/remove_const.h>
|
||||
#include <__type_traits/remove_extent.h>
|
||||
#include <__utility/exception_guard.h>
|
||||
#include <__utility/move.h>
|
||||
#include <__utility/pair.h>
|
||||
#include <new>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
// This is a simplified version of C++20 `unreachable_sentinel` that doesn't use concepts and thus can be used in any
|
||||
// language mode.
|
||||
struct __unreachable_sentinel {
|
||||
template <class _Iter>
|
||||
_LIBCPP_HIDE_FROM_ABI friend _LIBCPP_CONSTEXPR bool operator!=(const _Iter&, __unreachable_sentinel) _NOEXCEPT {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
// uninitialized_copy
|
||||
|
||||
template <class _ValueType, class _InputIterator, class _Sentinel1, class _ForwardIterator, class _Sentinel2>
|
||||
inline _LIBCPP_HIDE_FROM_ABI pair<_InputIterator, _ForwardIterator>
|
||||
__uninitialized_copy(_InputIterator __ifirst, _Sentinel1 __ilast,
|
||||
_ForwardIterator __ofirst, _Sentinel2 __olast) {
|
||||
_ForwardIterator __idx = __ofirst;
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (; __ifirst != __ilast && __idx != __olast; ++__ifirst, (void)++__idx)
|
||||
::new (_VSTD::__voidify(*__idx)) _ValueType(*__ifirst);
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
} catch (...) {
|
||||
_VSTD::__destroy(__ofirst, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
|
||||
return pair<_InputIterator, _ForwardIterator>(_VSTD::move(__ifirst), _VSTD::move(__idx));
|
||||
}
|
||||
|
||||
template <class _InputIterator, class _ForwardIterator>
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
_ForwardIterator uninitialized_copy(_InputIterator __ifirst, _InputIterator __ilast,
|
||||
_ForwardIterator __ofirst) {
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
|
||||
auto __result = _VSTD::__uninitialized_copy<_ValueType>(_VSTD::move(__ifirst), _VSTD::move(__ilast),
|
||||
_VSTD::move(__ofirst), __unreachable_sentinel());
|
||||
return _VSTD::move(__result.second);
|
||||
}
|
||||
|
||||
// uninitialized_copy_n
|
||||
|
||||
template <class _ValueType, class _InputIterator, class _Size, class _ForwardIterator, class _Sentinel>
|
||||
inline _LIBCPP_HIDE_FROM_ABI pair<_InputIterator, _ForwardIterator>
|
||||
__uninitialized_copy_n(_InputIterator __ifirst, _Size __n,
|
||||
_ForwardIterator __ofirst, _Sentinel __olast) {
|
||||
_ForwardIterator __idx = __ofirst;
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (; __n > 0 && __idx != __olast; ++__ifirst, (void)++__idx, (void)--__n)
|
||||
::new (_VSTD::__voidify(*__idx)) _ValueType(*__ifirst);
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
} catch (...) {
|
||||
_VSTD::__destroy(__ofirst, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
|
||||
return pair<_InputIterator, _ForwardIterator>(_VSTD::move(__ifirst), _VSTD::move(__idx));
|
||||
}
|
||||
|
||||
template <class _InputIterator, class _Size, class _ForwardIterator>
|
||||
inline _LIBCPP_HIDE_FROM_ABI _ForwardIterator uninitialized_copy_n(_InputIterator __ifirst, _Size __n,
|
||||
_ForwardIterator __ofirst) {
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
|
||||
auto __result = _VSTD::__uninitialized_copy_n<_ValueType>(_VSTD::move(__ifirst), __n, _VSTD::move(__ofirst),
|
||||
__unreachable_sentinel());
|
||||
return _VSTD::move(__result.second);
|
||||
}
|
||||
|
||||
// uninitialized_fill
|
||||
|
||||
template <class _ValueType, class _ForwardIterator, class _Sentinel, class _Tp>
|
||||
inline _LIBCPP_HIDE_FROM_ABI
|
||||
_ForwardIterator __uninitialized_fill(_ForwardIterator __first, _Sentinel __last, const _Tp& __x)
|
||||
{
|
||||
_ForwardIterator __idx = __first;
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
try
|
||||
{
|
||||
#endif
|
||||
for (; __idx != __last; ++__idx)
|
||||
::new (_VSTD::__voidify(*__idx)) _ValueType(__x);
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
_VSTD::__destroy(__first, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
|
||||
return __idx;
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Tp>
|
||||
inline _LIBCPP_HIDE_FROM_ABI
|
||||
void uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __x)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
|
||||
(void)_VSTD::__uninitialized_fill<_ValueType>(__first, __last, __x);
|
||||
}
|
||||
|
||||
// uninitialized_fill_n
|
||||
|
||||
template <class _ValueType, class _ForwardIterator, class _Size, class _Tp>
|
||||
inline _LIBCPP_HIDE_FROM_ABI
|
||||
_ForwardIterator __uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x)
|
||||
{
|
||||
_ForwardIterator __idx = __first;
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
try
|
||||
{
|
||||
#endif
|
||||
for (; __n > 0; ++__idx, (void) --__n)
|
||||
::new (_VSTD::__voidify(*__idx)) _ValueType(__x);
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
_VSTD::__destroy(__first, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
|
||||
return __idx;
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Size, class _Tp>
|
||||
inline _LIBCPP_HIDE_FROM_ABI
|
||||
_ForwardIterator uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
|
||||
return _VSTD::__uninitialized_fill_n<_ValueType>(__first, __n, __x);
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER >= 17
|
||||
|
||||
// uninitialized_default_construct
|
||||
|
||||
template <class _ValueType, class _ForwardIterator, class _Sentinel>
|
||||
inline _LIBCPP_HIDE_FROM_ABI
|
||||
_ForwardIterator __uninitialized_default_construct(_ForwardIterator __first, _Sentinel __last) {
|
||||
auto __idx = __first;
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (; __idx != __last; ++__idx)
|
||||
::new (_VSTD::__voidify(*__idx)) _ValueType;
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
} catch (...) {
|
||||
_VSTD::__destroy(__first, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
|
||||
return __idx;
|
||||
}
|
||||
|
||||
template <class _ForwardIterator>
|
||||
inline _LIBCPP_HIDE_FROM_ABI
|
||||
void uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last) {
|
||||
using _ValueType = typename iterator_traits<_ForwardIterator>::value_type;
|
||||
(void)_VSTD::__uninitialized_default_construct<_ValueType>(
|
||||
_VSTD::move(__first), _VSTD::move(__last));
|
||||
}
|
||||
|
||||
// uninitialized_default_construct_n
|
||||
|
||||
template <class _ValueType, class _ForwardIterator, class _Size>
|
||||
inline _LIBCPP_HIDE_FROM_ABI
|
||||
_ForwardIterator __uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) {
|
||||
auto __idx = __first;
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (; __n > 0; ++__idx, (void) --__n)
|
||||
::new (_VSTD::__voidify(*__idx)) _ValueType;
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
} catch (...) {
|
||||
_VSTD::__destroy(__first, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
|
||||
return __idx;
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Size>
|
||||
inline _LIBCPP_HIDE_FROM_ABI
|
||||
_ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) {
|
||||
using _ValueType = typename iterator_traits<_ForwardIterator>::value_type;
|
||||
return _VSTD::__uninitialized_default_construct_n<_ValueType>(_VSTD::move(__first), __n);
|
||||
}
|
||||
|
||||
// uninitialized_value_construct
|
||||
|
||||
template <class _ValueType, class _ForwardIterator, class _Sentinel>
|
||||
inline _LIBCPP_HIDE_FROM_ABI
|
||||
_ForwardIterator __uninitialized_value_construct(_ForwardIterator __first, _Sentinel __last) {
|
||||
auto __idx = __first;
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (; __idx != __last; ++__idx)
|
||||
::new (_VSTD::__voidify(*__idx)) _ValueType();
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
} catch (...) {
|
||||
_VSTD::__destroy(__first, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
|
||||
return __idx;
|
||||
}
|
||||
|
||||
template <class _ForwardIterator>
|
||||
inline _LIBCPP_HIDE_FROM_ABI
|
||||
void uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last) {
|
||||
using _ValueType = typename iterator_traits<_ForwardIterator>::value_type;
|
||||
(void)_VSTD::__uninitialized_value_construct<_ValueType>(
|
||||
_VSTD::move(__first), _VSTD::move(__last));
|
||||
}
|
||||
|
||||
// uninitialized_value_construct_n
|
||||
|
||||
template <class _ValueType, class _ForwardIterator, class _Size>
|
||||
inline _LIBCPP_HIDE_FROM_ABI
|
||||
_ForwardIterator __uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) {
|
||||
auto __idx = __first;
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (; __n > 0; ++__idx, (void) --__n)
|
||||
::new (_VSTD::__voidify(*__idx)) _ValueType();
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
} catch (...) {
|
||||
_VSTD::__destroy(__first, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
|
||||
return __idx;
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Size>
|
||||
inline _LIBCPP_HIDE_FROM_ABI
|
||||
_ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) {
|
||||
using _ValueType = typename iterator_traits<_ForwardIterator>::value_type;
|
||||
return std::__uninitialized_value_construct_n<_ValueType>(_VSTD::move(__first), __n);
|
||||
}
|
||||
|
||||
// uninitialized_move
|
||||
|
||||
template <class _ValueType, class _InputIterator, class _Sentinel1, class _ForwardIterator, class _Sentinel2,
|
||||
class _IterMove>
|
||||
inline _LIBCPP_HIDE_FROM_ABI pair<_InputIterator, _ForwardIterator>
|
||||
__uninitialized_move(_InputIterator __ifirst, _Sentinel1 __ilast,
|
||||
_ForwardIterator __ofirst, _Sentinel2 __olast, _IterMove __iter_move) {
|
||||
auto __idx = __ofirst;
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (; __ifirst != __ilast && __idx != __olast; ++__idx, (void)++__ifirst) {
|
||||
::new (_VSTD::__voidify(*__idx)) _ValueType(__iter_move(__ifirst));
|
||||
}
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
} catch (...) {
|
||||
_VSTD::__destroy(__ofirst, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
|
||||
return {_VSTD::move(__ifirst), _VSTD::move(__idx)};
|
||||
}
|
||||
|
||||
template <class _InputIterator, class _ForwardIterator>
|
||||
inline _LIBCPP_HIDE_FROM_ABI _ForwardIterator uninitialized_move(_InputIterator __ifirst, _InputIterator __ilast,
|
||||
_ForwardIterator __ofirst) {
|
||||
using _ValueType = typename iterator_traits<_ForwardIterator>::value_type;
|
||||
auto __iter_move = [](auto&& __iter) -> decltype(auto) { return _VSTD::move(*__iter); };
|
||||
|
||||
auto __result = _VSTD::__uninitialized_move<_ValueType>(_VSTD::move(__ifirst), _VSTD::move(__ilast),
|
||||
_VSTD::move(__ofirst), __unreachable_sentinel(), __iter_move);
|
||||
return _VSTD::move(__result.second);
|
||||
}
|
||||
|
||||
// uninitialized_move_n
|
||||
|
||||
template <class _ValueType, class _InputIterator, class _Size, class _ForwardIterator, class _Sentinel, class _IterMove>
|
||||
inline _LIBCPP_HIDE_FROM_ABI pair<_InputIterator, _ForwardIterator>
|
||||
__uninitialized_move_n(_InputIterator __ifirst, _Size __n,
|
||||
_ForwardIterator __ofirst, _Sentinel __olast, _IterMove __iter_move) {
|
||||
auto __idx = __ofirst;
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (; __n > 0 && __idx != __olast; ++__idx, (void)++__ifirst, --__n)
|
||||
::new (_VSTD::__voidify(*__idx)) _ValueType(__iter_move(__ifirst));
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
} catch (...) {
|
||||
_VSTD::__destroy(__ofirst, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
|
||||
return {_VSTD::move(__ifirst), _VSTD::move(__idx)};
|
||||
}
|
||||
|
||||
template <class _InputIterator, class _Size, class _ForwardIterator>
|
||||
inline _LIBCPP_HIDE_FROM_ABI pair<_InputIterator, _ForwardIterator>
|
||||
uninitialized_move_n(_InputIterator __ifirst, _Size __n, _ForwardIterator __ofirst) {
|
||||
using _ValueType = typename iterator_traits<_ForwardIterator>::value_type;
|
||||
auto __iter_move = [](auto&& __iter) -> decltype(auto) { return _VSTD::move(*__iter); };
|
||||
|
||||
return _VSTD::__uninitialized_move_n<_ValueType>(_VSTD::move(__ifirst), __n, _VSTD::move(__ofirst),
|
||||
__unreachable_sentinel(), __iter_move);
|
||||
}
|
||||
|
||||
// TODO: Rewrite this to iterate left to right and use reverse_iterators when calling
|
||||
// Destroys every element in the range [first, last) FROM RIGHT TO LEFT using allocator
|
||||
// destruction. If elements are themselves C-style arrays, they are recursively destroyed
|
||||
// in the same manner.
|
||||
//
|
||||
// This function assumes that destructors do not throw, and that the allocator is bound to
|
||||
// the correct type.
|
||||
template<class _Alloc, class _BidirIter, class = __enable_if_t<
|
||||
__has_bidirectional_iterator_category<_BidirIter>::value
|
||||
>>
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
constexpr void __allocator_destroy_multidimensional(_Alloc& __alloc, _BidirIter __first, _BidirIter __last) noexcept {
|
||||
using _ValueType = typename iterator_traits<_BidirIter>::value_type;
|
||||
static_assert(is_same_v<typename allocator_traits<_Alloc>::value_type, _ValueType>,
|
||||
"The allocator should already be rebound to the correct type");
|
||||
|
||||
if (__first == __last)
|
||||
return;
|
||||
|
||||
if constexpr (is_array_v<_ValueType>) {
|
||||
static_assert(!__libcpp_is_unbounded_array<_ValueType>::value,
|
||||
"arrays of unbounded arrays don't exist, but if they did we would mess up here");
|
||||
|
||||
using _Element = remove_extent_t<_ValueType>;
|
||||
__allocator_traits_rebind_t<_Alloc, _Element> __elem_alloc(__alloc);
|
||||
do {
|
||||
--__last;
|
||||
decltype(auto) __array = *__last;
|
||||
std::__allocator_destroy_multidimensional(__elem_alloc, __array, __array + extent_v<_ValueType>);
|
||||
} while (__last != __first);
|
||||
} else {
|
||||
do {
|
||||
--__last;
|
||||
allocator_traits<_Alloc>::destroy(__alloc, std::addressof(*__last));
|
||||
} while (__last != __first);
|
||||
}
|
||||
}
|
||||
|
||||
// Constructs the object at the given location using the allocator's construct method.
|
||||
//
|
||||
// If the object being constructed is an array, each element of the array is allocator-constructed,
|
||||
// recursively. If an exception is thrown during the construction of an array, the initialized
|
||||
// elements are destroyed in reverse order of initialization using allocator destruction.
|
||||
//
|
||||
// This function assumes that the allocator is bound to the correct type.
|
||||
template<class _Alloc, class _Tp>
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
constexpr void __allocator_construct_at_multidimensional(_Alloc& __alloc, _Tp* __loc) {
|
||||
static_assert(is_same_v<typename allocator_traits<_Alloc>::value_type, _Tp>,
|
||||
"The allocator should already be rebound to the correct type");
|
||||
|
||||
if constexpr (is_array_v<_Tp>) {
|
||||
using _Element = remove_extent_t<_Tp>;
|
||||
__allocator_traits_rebind_t<_Alloc, _Element> __elem_alloc(__alloc);
|
||||
size_t __i = 0;
|
||||
_Tp& __array = *__loc;
|
||||
|
||||
// If an exception is thrown, destroy what we have constructed so far in reverse order.
|
||||
auto __guard = std::__make_exception_guard([&]() {
|
||||
std::__allocator_destroy_multidimensional(__elem_alloc, __array, __array + __i);
|
||||
});
|
||||
|
||||
for (; __i != extent_v<_Tp>; ++__i) {
|
||||
std::__allocator_construct_at_multidimensional(__elem_alloc, std::addressof(__array[__i]));
|
||||
}
|
||||
__guard.__complete();
|
||||
} else {
|
||||
allocator_traits<_Alloc>::construct(__alloc, __loc);
|
||||
}
|
||||
}
|
||||
|
||||
// Constructs the object at the given location using the allocator's construct method, passing along
|
||||
// the provided argument.
|
||||
//
|
||||
// If the object being constructed is an array, the argument is also assumed to be an array. Each
|
||||
// each element of the array being constructed is allocator-constructed from the corresponding
|
||||
// element of the argument array. If an exception is thrown during the construction of an array,
|
||||
// the initialized elements are destroyed in reverse order of initialization using allocator
|
||||
// destruction.
|
||||
//
|
||||
// This function assumes that the allocator is bound to the correct type.
|
||||
template<class _Alloc, class _Tp, class _Arg>
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
constexpr void __allocator_construct_at_multidimensional(_Alloc& __alloc, _Tp* __loc, _Arg const& __arg) {
|
||||
static_assert(is_same_v<typename allocator_traits<_Alloc>::value_type, _Tp>,
|
||||
"The allocator should already be rebound to the correct type");
|
||||
|
||||
if constexpr (is_array_v<_Tp>) {
|
||||
static_assert(is_array_v<_Arg>,
|
||||
"Provided non-array initialization argument to __allocator_construct_at_multidimensional when "
|
||||
"trying to construct an array.");
|
||||
|
||||
using _Element = remove_extent_t<_Tp>;
|
||||
__allocator_traits_rebind_t<_Alloc, _Element> __elem_alloc(__alloc);
|
||||
size_t __i = 0;
|
||||
_Tp& __array = *__loc;
|
||||
|
||||
// If an exception is thrown, destroy what we have constructed so far in reverse order.
|
||||
auto __guard = std::__make_exception_guard([&]() {
|
||||
std::__allocator_destroy_multidimensional(__elem_alloc, __array, __array + __i);
|
||||
});
|
||||
for (; __i != extent_v<_Tp>; ++__i) {
|
||||
std::__allocator_construct_at_multidimensional(__elem_alloc, std::addressof(__array[__i]), __arg[__i]);
|
||||
}
|
||||
__guard.__complete();
|
||||
} else {
|
||||
allocator_traits<_Alloc>::construct(__alloc, __loc, __arg);
|
||||
}
|
||||
}
|
||||
|
||||
// Given a range starting at it and containing n elements, initializes each element in the
|
||||
// range from left to right using the construct method of the allocator (rebound to the
|
||||
// correct type).
|
||||
//
|
||||
// If an exception is thrown, the initialized elements are destroyed in reverse order of
|
||||
// initialization using allocator_traits destruction. If the elements in the range are C-style
|
||||
// arrays, they are initialized element-wise using allocator construction, and recursively so.
|
||||
template<class _Alloc, class _BidirIter, class _Tp, class _Size = typename iterator_traits<_BidirIter>::difference_type>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr void
|
||||
__uninitialized_allocator_fill_n_multidimensional(_Alloc& __alloc, _BidirIter __it, _Size __n, _Tp const& __value) {
|
||||
using _ValueType = typename iterator_traits<_BidirIter>::value_type;
|
||||
__allocator_traits_rebind_t<_Alloc, _ValueType> __value_alloc(__alloc);
|
||||
_BidirIter __begin = __it;
|
||||
|
||||
// If an exception is thrown, destroy what we have constructed so far in reverse order.
|
||||
auto __guard = std::__make_exception_guard([&]() { std::__allocator_destroy_multidimensional(__value_alloc, __begin, __it); });
|
||||
for (; __n != 0; --__n, ++__it) {
|
||||
std::__allocator_construct_at_multidimensional(__value_alloc, std::addressof(*__it), __value);
|
||||
}
|
||||
__guard.__complete();
|
||||
}
|
||||
|
||||
// Same as __uninitialized_allocator_fill_n_multidimensional, but doesn't pass any initialization argument
|
||||
// to the allocator's construct method, which results in value initialization.
|
||||
template <class _Alloc, class _BidirIter, class _Size = typename iterator_traits<_BidirIter>::difference_type>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr void
|
||||
__uninitialized_allocator_value_construct_n_multidimensional(_Alloc& __alloc, _BidirIter __it, _Size __n) {
|
||||
using _ValueType = typename iterator_traits<_BidirIter>::value_type;
|
||||
__allocator_traits_rebind_t<_Alloc, _ValueType> __value_alloc(__alloc);
|
||||
_BidirIter __begin = __it;
|
||||
|
||||
// If an exception is thrown, destroy what we have constructed so far in reverse order.
|
||||
auto __guard = std::__make_exception_guard([&]() { std::__allocator_destroy_multidimensional(__value_alloc, __begin, __it); });
|
||||
for (; __n != 0; --__n, ++__it) {
|
||||
std::__allocator_construct_at_multidimensional(__value_alloc, std::addressof(*__it));
|
||||
}
|
||||
__guard.__complete();
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_STD_VER >= 17
|
||||
|
||||
// Destroy all elements in [__first, __last) from left to right using allocator destruction.
|
||||
template <class _Alloc, class _Iter, class _Sent>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void
|
||||
__allocator_destroy(_Alloc& __alloc, _Iter __first, _Sent __last) {
|
||||
for (; __first != __last; ++__first)
|
||||
allocator_traits<_Alloc>::destroy(__alloc, std::__to_address(__first));
|
||||
}
|
||||
|
||||
template <class _Alloc, class _Iter>
|
||||
class _AllocatorDestroyRangeReverse {
|
||||
public:
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
_AllocatorDestroyRangeReverse(_Alloc& __alloc, _Iter& __first, _Iter& __last)
|
||||
: __alloc_(__alloc), __first_(__first), __last_(__last) {}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void operator()() const {
|
||||
std::__allocator_destroy(__alloc_, std::reverse_iterator<_Iter>(__last_), std::reverse_iterator<_Iter>(__first_));
|
||||
}
|
||||
|
||||
private:
|
||||
_Alloc& __alloc_;
|
||||
_Iter& __first_;
|
||||
_Iter& __last_;
|
||||
};
|
||||
|
||||
// Copy-construct [__first1, __last1) in [__first2, __first2 + N), where N is distance(__first1, __last1).
|
||||
//
|
||||
// The caller has to ensure that __first2 can hold at least N uninitialized elements. If an exception is thrown the
|
||||
// already copied elements are destroyed in reverse order of their construction.
|
||||
template <class _Alloc, class _Iter1, class _Sent1, class _Iter2>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Iter2
|
||||
__uninitialized_allocator_copy_impl(_Alloc& __alloc, _Iter1 __first1, _Sent1 __last1, _Iter2 __first2) {
|
||||
auto __destruct_first = __first2;
|
||||
auto __guard =
|
||||
std::__make_exception_guard(_AllocatorDestroyRangeReverse<_Alloc, _Iter2>(__alloc, __destruct_first, __first2));
|
||||
while (__first1 != __last1) {
|
||||
allocator_traits<_Alloc>::construct(__alloc, std::__to_address(__first2), *__first1);
|
||||
++__first1;
|
||||
++__first2;
|
||||
}
|
||||
__guard.__complete();
|
||||
return __first2;
|
||||
}
|
||||
|
||||
template <class _Alloc, class _Type>
|
||||
struct __allocator_has_trivial_copy_construct : _Not<__has_construct<_Alloc, _Type*, const _Type&> > {};
|
||||
|
||||
template <class _Type>
|
||||
struct __allocator_has_trivial_copy_construct<allocator<_Type>, _Type> : true_type {};
|
||||
|
||||
template <class _Alloc,
|
||||
class _In,
|
||||
class _RawTypeIn = __remove_const_t<_In>,
|
||||
class _Out,
|
||||
__enable_if_t<
|
||||
// using _RawTypeIn because of the allocator<T const> extension
|
||||
is_trivially_copy_constructible<_RawTypeIn>::value && is_trivially_copy_assignable<_RawTypeIn>::value &&
|
||||
is_same<__remove_cv_t<_In>, __remove_cv_t<_Out> >::value &&
|
||||
__allocator_has_trivial_copy_construct<_Alloc, _RawTypeIn>::value>* = nullptr>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Out*
|
||||
__uninitialized_allocator_copy_impl(_Alloc&, _In* __first1, _In* __last1, _Out* __first2) {
|
||||
// TODO: Remove the const_cast once we drop support for std::allocator<T const>
|
||||
if (__libcpp_is_constant_evaluated()) {
|
||||
while (__first1 != __last1) {
|
||||
std::__construct_at(std::__to_address(__first2), *__first1);
|
||||
++__first1;
|
||||
++__first2;
|
||||
}
|
||||
return __first2;
|
||||
} else {
|
||||
return std::copy(__first1, __last1, const_cast<_RawTypeIn*>(__first2));
|
||||
}
|
||||
}
|
||||
|
||||
template <class _Alloc, class _Iter1, class _Sent1, class _Iter2>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Iter2 __uninitialized_allocator_copy(_Alloc& __alloc, _Iter1 __first1, _Sent1 __last1, _Iter2 __first2) {
|
||||
auto __unwrapped_range = std::__unwrap_range(__first1, __last1);
|
||||
auto __result = std::__uninitialized_allocator_copy_impl(__alloc, __unwrapped_range.first, __unwrapped_range.second, std::__unwrap_iter(__first2));
|
||||
return std::__rewrap_iter(__first2, __result);
|
||||
}
|
||||
|
||||
// Move-construct the elements [__first1, __last1) into [__first2, __first2 + N)
|
||||
// if the move constructor is noexcept, where N is distance(__first1, __last1).
|
||||
//
|
||||
// Otherwise try to copy all elements. If an exception is thrown the already copied
|
||||
// elements are destroyed in reverse order of their construction.
|
||||
template <class _Alloc, class _Iter1, class _Sent1, class _Iter2>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Iter2 __uninitialized_allocator_move_if_noexcept(
|
||||
_Alloc& __alloc, _Iter1 __first1, _Sent1 __last1, _Iter2 __first2) {
|
||||
static_assert(__is_cpp17_move_insertable<_Alloc>::value,
|
||||
"The specified type does not meet the requirements of Cpp17MoveInsertable");
|
||||
auto __destruct_first = __first2;
|
||||
auto __guard =
|
||||
std::__make_exception_guard(_AllocatorDestroyRangeReverse<_Alloc, _Iter2>(__alloc, __destruct_first, __first2));
|
||||
while (__first1 != __last1) {
|
||||
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
|
||||
allocator_traits<_Alloc>::construct(__alloc, std::__to_address(__first2), std::move_if_noexcept(*__first1));
|
||||
#else
|
||||
allocator_traits<_Alloc>::construct(__alloc, std::__to_address(__first2), std::move(*__first1));
|
||||
#endif
|
||||
++__first1;
|
||||
++__first2;
|
||||
}
|
||||
__guard.__complete();
|
||||
return __first2;
|
||||
}
|
||||
|
||||
template <class _Alloc, class _Type>
|
||||
struct __allocator_has_trivial_move_construct : _Not<__has_construct<_Alloc, _Type*, _Type&&> > {};
|
||||
|
||||
template <class _Type>
|
||||
struct __allocator_has_trivial_move_construct<allocator<_Type>, _Type> : true_type {};
|
||||
|
||||
#ifndef _LIBCPP_COMPILER_GCC
|
||||
template <
|
||||
class _Alloc,
|
||||
class _Iter1,
|
||||
class _Iter2,
|
||||
class _Type = typename iterator_traits<_Iter1>::value_type,
|
||||
class = __enable_if_t<is_trivially_move_constructible<_Type>::value && is_trivially_move_assignable<_Type>::value &&
|
||||
__allocator_has_trivial_move_construct<_Alloc, _Type>::value> >
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Iter2
|
||||
__uninitialized_allocator_move_if_noexcept(_Alloc&, _Iter1 __first1, _Iter1 __last1, _Iter2 __first2) {
|
||||
if (__libcpp_is_constant_evaluated()) {
|
||||
while (__first1 != __last1) {
|
||||
std::__construct_at(std::__to_address(__first2), std::move(*__first1));
|
||||
++__first1;
|
||||
++__first2;
|
||||
}
|
||||
return __first2;
|
||||
} else {
|
||||
return std::move(__first1, __last1, __first2);
|
||||
}
|
||||
}
|
||||
#endif // _LIBCPP_COMPILER_GCC
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_UNINITIALIZED_ALGORITHMS_H
|
746
third_party/libcxx/__memory/unique_ptr.h
vendored
Normal file
746
third_party/libcxx/__memory/unique_ptr.h
vendored
Normal file
|
@ -0,0 +1,746 @@
|
|||
// -*- 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_UNIQUE_PTR_H
|
||||
#define _LIBCPP___MEMORY_UNIQUE_PTR_H
|
||||
|
||||
#include <__compare/compare_three_way.h>
|
||||
#include <__compare/compare_three_way_result.h>
|
||||
#include <__compare/three_way_comparable.h>
|
||||
#include <__config>
|
||||
#include <__functional/hash.h>
|
||||
#include <__functional/operations.h>
|
||||
#include <__memory/allocator_traits.h> // __pointer
|
||||
#include <__memory/auto_ptr.h>
|
||||
#include <__memory/compressed_pair.h>
|
||||
#include <__type_traits/add_lvalue_reference.h>
|
||||
#include <__type_traits/common_type.h>
|
||||
#include <__type_traits/dependent_type.h>
|
||||
#include <__type_traits/integral_constant.h>
|
||||
#include <__type_traits/is_array.h>
|
||||
#include <__type_traits/is_assignable.h>
|
||||
#include <__type_traits/is_constructible.h>
|
||||
#include <__type_traits/is_convertible.h>
|
||||
#include <__type_traits/is_default_constructible.h>
|
||||
#include <__type_traits/is_function.h>
|
||||
#include <__type_traits/is_pointer.h>
|
||||
#include <__type_traits/is_reference.h>
|
||||
#include <__type_traits/is_same.h>
|
||||
#include <__type_traits/is_swappable.h>
|
||||
#include <__type_traits/is_void.h>
|
||||
#include <__type_traits/remove_extent.h>
|
||||
#include <__type_traits/type_identity.h>
|
||||
#include <__utility/forward.h>
|
||||
#include <__utility/move.h>
|
||||
#include <cstddef>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_TEMPLATE_VIS default_delete {
|
||||
static_assert(!is_function<_Tp>::value,
|
||||
"default_delete cannot be instantiated for function types");
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr default_delete() _NOEXCEPT = default;
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY default_delete() {}
|
||||
#endif
|
||||
template <class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 default_delete(
|
||||
const default_delete<_Up>&, typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 0) _NOEXCEPT {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 void operator()(_Tp* __ptr) const _NOEXCEPT {
|
||||
static_assert(sizeof(_Tp) >= 0, "cannot delete an incomplete type");
|
||||
static_assert(!is_void<_Tp>::value, "cannot delete an incomplete type");
|
||||
delete __ptr;
|
||||
}
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_TEMPLATE_VIS default_delete<_Tp[]> {
|
||||
private:
|
||||
template <class _Up>
|
||||
struct _EnableIfConvertible
|
||||
: enable_if<is_convertible<_Up(*)[], _Tp(*)[]>::value> {};
|
||||
|
||||
public:
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr default_delete() _NOEXCEPT = default;
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY default_delete() {}
|
||||
#endif
|
||||
|
||||
template <class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23
|
||||
default_delete(const default_delete<_Up[]>&, typename _EnableIfConvertible<_Up>::type* = 0) _NOEXCEPT {}
|
||||
|
||||
template <class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 typename _EnableIfConvertible<_Up>::type
|
||||
operator()(_Up* __ptr) const _NOEXCEPT {
|
||||
static_assert(sizeof(_Up) >= 0, "cannot delete an incomplete type");
|
||||
delete[] __ptr;
|
||||
}
|
||||
};
|
||||
|
||||
template <class _Deleter>
|
||||
struct __unique_ptr_deleter_sfinae {
|
||||
static_assert(!is_reference<_Deleter>::value, "incorrect specialization");
|
||||
typedef const _Deleter& __lval_ref_type;
|
||||
typedef _Deleter&& __good_rval_ref_type;
|
||||
typedef true_type __enable_rval_overload;
|
||||
};
|
||||
|
||||
template <class _Deleter>
|
||||
struct __unique_ptr_deleter_sfinae<_Deleter const&> {
|
||||
typedef const _Deleter& __lval_ref_type;
|
||||
typedef const _Deleter&& __bad_rval_ref_type;
|
||||
typedef false_type __enable_rval_overload;
|
||||
};
|
||||
|
||||
template <class _Deleter>
|
||||
struct __unique_ptr_deleter_sfinae<_Deleter&> {
|
||||
typedef _Deleter& __lval_ref_type;
|
||||
typedef _Deleter&& __bad_rval_ref_type;
|
||||
typedef false_type __enable_rval_overload;
|
||||
};
|
||||
|
||||
#if defined(_LIBCPP_ABI_ENABLE_UNIQUE_PTR_TRIVIAL_ABI)
|
||||
# define _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI __attribute__((__trivial_abi__))
|
||||
#else
|
||||
# define _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI
|
||||
#endif
|
||||
|
||||
template <class _Tp, class _Dp = default_delete<_Tp> >
|
||||
class _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI _LIBCPP_TEMPLATE_VIS unique_ptr {
|
||||
public:
|
||||
typedef _Tp element_type;
|
||||
typedef _Dp deleter_type;
|
||||
typedef _LIBCPP_NODEBUG typename __pointer<_Tp, deleter_type>::type pointer;
|
||||
|
||||
static_assert(!is_rvalue_reference<deleter_type>::value,
|
||||
"the specified deleter type cannot be an rvalue reference");
|
||||
|
||||
private:
|
||||
__compressed_pair<pointer, deleter_type> __ptr_;
|
||||
|
||||
struct __nat { int __for_bool_; };
|
||||
|
||||
typedef _LIBCPP_NODEBUG __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE;
|
||||
|
||||
template <bool _Dummy>
|
||||
using _LValRefType _LIBCPP_NODEBUG =
|
||||
typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type;
|
||||
|
||||
template <bool _Dummy>
|
||||
using _GoodRValRefType _LIBCPP_NODEBUG =
|
||||
typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;
|
||||
|
||||
template <bool _Dummy>
|
||||
using _BadRValRefType _LIBCPP_NODEBUG =
|
||||
typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type;
|
||||
|
||||
template <bool _Dummy, class _Deleter = typename __dependent_type<
|
||||
__type_identity<deleter_type>, _Dummy>::type>
|
||||
using _EnableIfDeleterDefaultConstructible _LIBCPP_NODEBUG =
|
||||
typename enable_if<is_default_constructible<_Deleter>::value &&
|
||||
!is_pointer<_Deleter>::value>::type;
|
||||
|
||||
template <class _ArgType>
|
||||
using _EnableIfDeleterConstructible _LIBCPP_NODEBUG =
|
||||
typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type;
|
||||
|
||||
template <class _UPtr, class _Up>
|
||||
using _EnableIfMoveConvertible _LIBCPP_NODEBUG = typename enable_if<
|
||||
is_convertible<typename _UPtr::pointer, pointer>::value &&
|
||||
!is_array<_Up>::value
|
||||
>::type;
|
||||
|
||||
template <class _UDel>
|
||||
using _EnableIfDeleterConvertible _LIBCPP_NODEBUG = typename enable_if<
|
||||
(is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) ||
|
||||
(!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value)
|
||||
>::type;
|
||||
|
||||
template <class _UDel>
|
||||
using _EnableIfDeleterAssignable = typename enable_if<
|
||||
is_assignable<_Dp&, _UDel&&>::value
|
||||
>::type;
|
||||
|
||||
public:
|
||||
template <bool _Dummy = true,
|
||||
class = _EnableIfDeleterDefaultConstructible<_Dummy> >
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT : __ptr_(__value_init_tag(), __value_init_tag()) {}
|
||||
|
||||
template <bool _Dummy = true,
|
||||
class = _EnableIfDeleterDefaultConstructible<_Dummy> >
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT : __ptr_(__value_init_tag(), __value_init_tag()) {}
|
||||
|
||||
template <bool _Dummy = true, class = _EnableIfDeleterDefaultConstructible<_Dummy> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 explicit unique_ptr(pointer __p) _NOEXCEPT
|
||||
: __ptr_(__p, __value_init_tag()) {}
|
||||
|
||||
template <bool _Dummy = true, class = _EnableIfDeleterConstructible<_LValRefType<_Dummy> > >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr(pointer __p, _LValRefType<_Dummy> __d) _NOEXCEPT
|
||||
: __ptr_(__p, __d) {}
|
||||
|
||||
template <bool _Dummy = true, class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy> > >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23
|
||||
unique_ptr(pointer __p, _GoodRValRefType<_Dummy> __d) _NOEXCEPT : __ptr_(__p, _VSTD::move(__d)) {
|
||||
static_assert(!is_reference<deleter_type>::value,
|
||||
"rvalue deleter bound to reference");
|
||||
}
|
||||
|
||||
template <bool _Dummy = true,
|
||||
class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy> > >
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
unique_ptr(pointer __p, _BadRValRefType<_Dummy> __d) = delete;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr(unique_ptr&& __u) _NOEXCEPT
|
||||
: __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {}
|
||||
|
||||
template <class _Up,
|
||||
class _Ep,
|
||||
class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
|
||||
class = _EnableIfDeleterConvertible<_Ep> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT
|
||||
: __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {}
|
||||
|
||||
#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
|
||||
template <class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
unique_ptr(auto_ptr<_Up>&& __p,
|
||||
typename enable_if<is_convertible<_Up*, _Tp*>::value &&
|
||||
is_same<_Dp, default_delete<_Tp> >::value,
|
||||
__nat>::type = __nat()) _NOEXCEPT
|
||||
: __ptr_(__p.release(), __value_init_tag()) {}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT {
|
||||
reset(__u.release());
|
||||
__ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter());
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class _Up,
|
||||
class _Ep,
|
||||
class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
|
||||
class = _EnableIfDeleterAssignable<_Ep> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr& operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT {
|
||||
reset(__u.release());
|
||||
__ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter());
|
||||
return *this;
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
|
||||
template <class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if<is_convertible<_Up*, _Tp*>::value &&
|
||||
is_same<_Dp, default_delete<_Tp> >::value,
|
||||
unique_ptr&>::type
|
||||
operator=(auto_ptr<_Up> __p) {
|
||||
reset(__p.release());
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef _LIBCPP_CXX03_LANG
|
||||
unique_ptr(unique_ptr const&) = delete;
|
||||
unique_ptr& operator=(unique_ptr const&) = delete;
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 ~unique_ptr() { reset(); }
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr& operator=(nullptr_t) _NOEXCEPT {
|
||||
reset();
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 __add_lvalue_reference_t<_Tp> operator*() const {
|
||||
return *__ptr_.first();
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 pointer operator->() const _NOEXCEPT {
|
||||
return __ptr_.first();
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 pointer get() const _NOEXCEPT { return __ptr_.first(); }
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 deleter_type& get_deleter() _NOEXCEPT {
|
||||
return __ptr_.second();
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 const deleter_type& get_deleter() const _NOEXCEPT {
|
||||
return __ptr_.second();
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 explicit operator bool() const _NOEXCEPT {
|
||||
return __ptr_.first() != nullptr;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 pointer release() _NOEXCEPT {
|
||||
pointer __t = __ptr_.first();
|
||||
__ptr_.first() = pointer();
|
||||
return __t;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 void reset(pointer __p = pointer()) _NOEXCEPT {
|
||||
pointer __tmp = __ptr_.first();
|
||||
__ptr_.first() = __p;
|
||||
if (__tmp)
|
||||
__ptr_.second()(__tmp);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 void swap(unique_ptr& __u) _NOEXCEPT {
|
||||
__ptr_.swap(__u.__ptr_);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template <class _Tp, class _Dp>
|
||||
class _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI _LIBCPP_TEMPLATE_VIS unique_ptr<_Tp[], _Dp> {
|
||||
public:
|
||||
typedef _Tp element_type;
|
||||
typedef _Dp deleter_type;
|
||||
typedef typename __pointer<_Tp, deleter_type>::type pointer;
|
||||
|
||||
private:
|
||||
__compressed_pair<pointer, deleter_type> __ptr_;
|
||||
|
||||
template <class _From>
|
||||
struct _CheckArrayPointerConversion : is_same<_From, pointer> {};
|
||||
|
||||
template <class _FromElem>
|
||||
struct _CheckArrayPointerConversion<_FromElem*>
|
||||
: integral_constant<bool,
|
||||
is_same<_FromElem*, pointer>::value ||
|
||||
(is_same<pointer, element_type*>::value &&
|
||||
is_convertible<_FromElem(*)[], element_type(*)[]>::value)
|
||||
>
|
||||
{};
|
||||
|
||||
typedef __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE;
|
||||
|
||||
template <bool _Dummy>
|
||||
using _LValRefType _LIBCPP_NODEBUG =
|
||||
typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type;
|
||||
|
||||
template <bool _Dummy>
|
||||
using _GoodRValRefType _LIBCPP_NODEBUG =
|
||||
typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;
|
||||
|
||||
template <bool _Dummy>
|
||||
using _BadRValRefType _LIBCPP_NODEBUG =
|
||||
typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type;
|
||||
|
||||
template <bool _Dummy, class _Deleter = typename __dependent_type<
|
||||
__type_identity<deleter_type>, _Dummy>::type>
|
||||
using _EnableIfDeleterDefaultConstructible _LIBCPP_NODEBUG =
|
||||
typename enable_if<is_default_constructible<_Deleter>::value &&
|
||||
!is_pointer<_Deleter>::value>::type;
|
||||
|
||||
template <class _ArgType>
|
||||
using _EnableIfDeleterConstructible _LIBCPP_NODEBUG =
|
||||
typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type;
|
||||
|
||||
template <class _Pp>
|
||||
using _EnableIfPointerConvertible _LIBCPP_NODEBUG = typename enable_if<
|
||||
_CheckArrayPointerConversion<_Pp>::value
|
||||
>::type;
|
||||
|
||||
template <class _UPtr, class _Up,
|
||||
class _ElemT = typename _UPtr::element_type>
|
||||
using _EnableIfMoveConvertible _LIBCPP_NODEBUG = typename enable_if<
|
||||
is_array<_Up>::value &&
|
||||
is_same<pointer, element_type*>::value &&
|
||||
is_same<typename _UPtr::pointer, _ElemT*>::value &&
|
||||
is_convertible<_ElemT(*)[], element_type(*)[]>::value
|
||||
>::type;
|
||||
|
||||
template <class _UDel>
|
||||
using _EnableIfDeleterConvertible _LIBCPP_NODEBUG = typename enable_if<
|
||||
(is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) ||
|
||||
(!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value)
|
||||
>::type;
|
||||
|
||||
template <class _UDel>
|
||||
using _EnableIfDeleterAssignable _LIBCPP_NODEBUG = typename enable_if<
|
||||
is_assignable<_Dp&, _UDel&&>::value
|
||||
>::type;
|
||||
|
||||
public:
|
||||
template <bool _Dummy = true,
|
||||
class = _EnableIfDeleterDefaultConstructible<_Dummy> >
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT : __ptr_(__value_init_tag(), __value_init_tag()) {}
|
||||
|
||||
template <bool _Dummy = true,
|
||||
class = _EnableIfDeleterDefaultConstructible<_Dummy> >
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT : __ptr_(__value_init_tag(), __value_init_tag()) {}
|
||||
|
||||
template <class _Pp,
|
||||
bool _Dummy = true,
|
||||
class = _EnableIfDeleterDefaultConstructible<_Dummy>,
|
||||
class = _EnableIfPointerConvertible<_Pp> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 explicit unique_ptr(_Pp __p) _NOEXCEPT
|
||||
: __ptr_(__p, __value_init_tag()) {}
|
||||
|
||||
template <class _Pp,
|
||||
bool _Dummy = true,
|
||||
class = _EnableIfDeleterConstructible<_LValRefType<_Dummy> >,
|
||||
class = _EnableIfPointerConvertible<_Pp> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr(_Pp __p, _LValRefType<_Dummy> __d) _NOEXCEPT
|
||||
: __ptr_(__p, __d) {}
|
||||
|
||||
template <bool _Dummy = true, class = _EnableIfDeleterConstructible<_LValRefType<_Dummy> > >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr(nullptr_t, _LValRefType<_Dummy> __d) _NOEXCEPT
|
||||
: __ptr_(nullptr, __d) {}
|
||||
|
||||
template <class _Pp,
|
||||
bool _Dummy = true,
|
||||
class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy> >,
|
||||
class = _EnableIfPointerConvertible<_Pp> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr(_Pp __p, _GoodRValRefType<_Dummy> __d) _NOEXCEPT
|
||||
: __ptr_(__p, _VSTD::move(__d)) {
|
||||
static_assert(!is_reference<deleter_type>::value,
|
||||
"rvalue deleter bound to reference");
|
||||
}
|
||||
|
||||
template <bool _Dummy = true, class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy> > >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr(nullptr_t, _GoodRValRefType<_Dummy> __d) _NOEXCEPT
|
||||
: __ptr_(nullptr, _VSTD::move(__d)) {
|
||||
static_assert(!is_reference<deleter_type>::value,
|
||||
"rvalue deleter bound to reference");
|
||||
}
|
||||
|
||||
template <class _Pp, bool _Dummy = true,
|
||||
class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy> >,
|
||||
class = _EnableIfPointerConvertible<_Pp> >
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
unique_ptr(_Pp __p, _BadRValRefType<_Dummy> __d) = delete;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr(unique_ptr&& __u) _NOEXCEPT
|
||||
: __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT {
|
||||
reset(__u.release());
|
||||
__ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter());
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class _Up,
|
||||
class _Ep,
|
||||
class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
|
||||
class = _EnableIfDeleterConvertible<_Ep> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT
|
||||
: __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {}
|
||||
|
||||
template <class _Up,
|
||||
class _Ep,
|
||||
class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
|
||||
class = _EnableIfDeleterAssignable<_Ep> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr& operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT {
|
||||
reset(__u.release());
|
||||
__ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter());
|
||||
return *this;
|
||||
}
|
||||
|
||||
#ifdef _LIBCPP_CXX03_LANG
|
||||
unique_ptr(unique_ptr const&) = delete;
|
||||
unique_ptr& operator=(unique_ptr const&) = delete;
|
||||
#endif
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 ~unique_ptr() { reset(); }
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 unique_ptr& operator=(nullptr_t) _NOEXCEPT {
|
||||
reset();
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 __add_lvalue_reference_t<_Tp>
|
||||
operator[](size_t __i) const {
|
||||
return __ptr_.first()[__i];
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 pointer get() const _NOEXCEPT { return __ptr_.first(); }
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 deleter_type& get_deleter() _NOEXCEPT {
|
||||
return __ptr_.second();
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 const deleter_type& get_deleter() const _NOEXCEPT {
|
||||
return __ptr_.second();
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 explicit operator bool() const _NOEXCEPT {
|
||||
return __ptr_.first() != nullptr;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 pointer release() _NOEXCEPT {
|
||||
pointer __t = __ptr_.first();
|
||||
__ptr_.first() = pointer();
|
||||
return __t;
|
||||
}
|
||||
|
||||
template <class _Pp>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23
|
||||
typename enable_if< _CheckArrayPointerConversion<_Pp>::value >::type
|
||||
reset(_Pp __p) _NOEXCEPT {
|
||||
pointer __tmp = __ptr_.first();
|
||||
__ptr_.first() = __p;
|
||||
if (__tmp)
|
||||
__ptr_.second()(__tmp);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 void reset(nullptr_t = nullptr) _NOEXCEPT {
|
||||
pointer __tmp = __ptr_.first();
|
||||
__ptr_.first() = nullptr;
|
||||
if (__tmp)
|
||||
__ptr_.second()(__tmp);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 void swap(unique_ptr& __u) _NOEXCEPT {
|
||||
__ptr_.swap(__u.__ptr_);
|
||||
}
|
||||
};
|
||||
|
||||
template <class _Tp, class _Dp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23
|
||||
typename enable_if< __is_swappable<_Dp>::value, void >::type
|
||||
swap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {
|
||||
__x.swap(__y);
|
||||
}
|
||||
|
||||
template <class _T1, class _D1, class _T2, class _D2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 bool
|
||||
operator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {
|
||||
return __x.get() == __y.get();
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER <= 17
|
||||
template <class _T1, class _D1, class _T2, class _D2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x == __y);}
|
||||
#endif
|
||||
|
||||
template <class _T1, class _D1, class _T2, class _D2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator< (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y)
|
||||
{
|
||||
typedef typename unique_ptr<_T1, _D1>::pointer _P1;
|
||||
typedef typename unique_ptr<_T2, _D2>::pointer _P2;
|
||||
typedef typename common_type<_P1, _P2>::type _Vp;
|
||||
return less<_Vp>()(__x.get(), __y.get());
|
||||
}
|
||||
|
||||
template <class _T1, class _D1, class _T2, class _D2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator> (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __y < __x;}
|
||||
|
||||
template <class _T1, class _D1, class _T2, class _D2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__y < __x);}
|
||||
|
||||
template <class _T1, class _D1, class _T2, class _D2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x < __y);}
|
||||
|
||||
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
template <class _T1, class _D1, class _T2, class _D2>
|
||||
requires three_way_comparable_with<typename unique_ptr<_T1, _D1>::pointer,
|
||||
typename unique_ptr<_T2, _D2>::pointer>
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
compare_three_way_result_t<typename unique_ptr<_T1, _D1>::pointer,
|
||||
typename unique_ptr<_T2, _D2>::pointer>
|
||||
operator<=>(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {
|
||||
return compare_three_way()(__x.get(), __y.get());
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class _T1, class _D1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 bool
|
||||
operator==(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT {
|
||||
return !__x;
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER <= 17
|
||||
template <class _T1, class _D1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator==(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT
|
||||
{
|
||||
return !__x;
|
||||
}
|
||||
|
||||
template <class _T1, class _D1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator!=(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT
|
||||
{
|
||||
return static_cast<bool>(__x);
|
||||
}
|
||||
|
||||
template <class _T1, class _D1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator!=(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT
|
||||
{
|
||||
return static_cast<bool>(__x);
|
||||
}
|
||||
#endif // _LIBCPP_STD_VER <= 17
|
||||
|
||||
template <class _T1, class _D1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 bool
|
||||
operator<(const unique_ptr<_T1, _D1>& __x, nullptr_t) {
|
||||
typedef typename unique_ptr<_T1, _D1>::pointer _P1;
|
||||
return less<_P1>()(__x.get(), nullptr);
|
||||
}
|
||||
|
||||
template <class _T1, class _D1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 bool
|
||||
operator<(nullptr_t, const unique_ptr<_T1, _D1>& __x) {
|
||||
typedef typename unique_ptr<_T1, _D1>::pointer _P1;
|
||||
return less<_P1>()(nullptr, __x.get());
|
||||
}
|
||||
|
||||
template <class _T1, class _D1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 bool
|
||||
operator>(const unique_ptr<_T1, _D1>& __x, nullptr_t) {
|
||||
return nullptr < __x;
|
||||
}
|
||||
|
||||
template <class _T1, class _D1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 bool
|
||||
operator>(nullptr_t, const unique_ptr<_T1, _D1>& __x) {
|
||||
return __x < nullptr;
|
||||
}
|
||||
|
||||
template <class _T1, class _D1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 bool
|
||||
operator<=(const unique_ptr<_T1, _D1>& __x, nullptr_t) {
|
||||
return !(nullptr < __x);
|
||||
}
|
||||
|
||||
template <class _T1, class _D1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 bool
|
||||
operator<=(nullptr_t, const unique_ptr<_T1, _D1>& __x) {
|
||||
return !(__x < nullptr);
|
||||
}
|
||||
|
||||
template <class _T1, class _D1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 bool
|
||||
operator>=(const unique_ptr<_T1, _D1>& __x, nullptr_t) {
|
||||
return !(__x < nullptr);
|
||||
}
|
||||
|
||||
template <class _T1, class _D1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 bool
|
||||
operator>=(nullptr_t, const unique_ptr<_T1, _D1>& __x) {
|
||||
return !(nullptr < __x);
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
template <class _T1, class _D1>
|
||||
requires three_way_comparable<
|
||||
typename unique_ptr<_T1, _D1>::pointer> _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23
|
||||
compare_three_way_result_t<typename unique_ptr<_T1, _D1>::pointer>
|
||||
operator<=>(const unique_ptr<_T1, _D1>& __x, nullptr_t) {
|
||||
return compare_three_way()(__x.get(), static_cast<typename unique_ptr<_T1, _D1>::pointer>(nullptr));
|
||||
}
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_STD_VER >= 14
|
||||
|
||||
template<class _Tp>
|
||||
struct __unique_if
|
||||
{
|
||||
typedef unique_ptr<_Tp> __unique_single;
|
||||
};
|
||||
|
||||
template<class _Tp>
|
||||
struct __unique_if<_Tp[]>
|
||||
{
|
||||
typedef unique_ptr<_Tp[]> __unique_array_unknown_bound;
|
||||
};
|
||||
|
||||
template<class _Tp, size_t _Np>
|
||||
struct __unique_if<_Tp[_Np]>
|
||||
{
|
||||
typedef void __unique_array_known_bound;
|
||||
};
|
||||
|
||||
template <class _Tp, class... _Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 typename __unique_if<_Tp>::__unique_single
|
||||
make_unique(_Args&&... __args) {
|
||||
return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...));
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 typename __unique_if<_Tp>::__unique_array_unknown_bound
|
||||
make_unique(size_t __n) {
|
||||
typedef __remove_extent_t<_Tp> _Up;
|
||||
return unique_ptr<_Tp>(new _Up[__n]());
|
||||
}
|
||||
|
||||
template<class _Tp, class... _Args>
|
||||
typename __unique_if<_Tp>::__unique_array_known_bound
|
||||
make_unique(_Args&&...) = delete;
|
||||
|
||||
#endif // _LIBCPP_STD_VER >= 14
|
||||
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 typename __unique_if<_Tp>::__unique_single
|
||||
make_unique_for_overwrite() {
|
||||
return unique_ptr<_Tp>(new _Tp);
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 typename __unique_if<_Tp>::__unique_array_unknown_bound
|
||||
make_unique_for_overwrite(size_t __n) {
|
||||
return unique_ptr<_Tp>(new __remove_extent_t<_Tp>[__n]);
|
||||
}
|
||||
|
||||
template<class _Tp, class... _Args>
|
||||
typename __unique_if<_Tp>::__unique_array_known_bound make_unique_for_overwrite(_Args&&...) = delete;
|
||||
|
||||
#endif // _LIBCPP_STD_VER >= 20
|
||||
|
||||
template <class _Tp> struct _LIBCPP_TEMPLATE_VIS hash;
|
||||
|
||||
template <class _Tp, class _Dp>
|
||||
#ifdef _LIBCPP_CXX03_LANG
|
||||
struct _LIBCPP_TEMPLATE_VIS hash<unique_ptr<_Tp, _Dp> >
|
||||
#else
|
||||
struct _LIBCPP_TEMPLATE_VIS hash<__enable_hash_helper<
|
||||
unique_ptr<_Tp, _Dp>, typename unique_ptr<_Tp, _Dp>::pointer> >
|
||||
#endif
|
||||
{
|
||||
#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS)
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef unique_ptr<_Tp, _Dp> argument_type;
|
||||
_LIBCPP_DEPRECATED_IN_CXX17 typedef size_t result_type;
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_t operator()(const unique_ptr<_Tp, _Dp>& __ptr) const
|
||||
{
|
||||
typedef typename unique_ptr<_Tp, _Dp>::pointer pointer;
|
||||
return hash<pointer>()(__ptr.get());
|
||||
}
|
||||
};
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_UNIQUE_PTR_H
|
59
third_party/libcxx/__memory/uses_allocator.h
vendored
Normal file
59
third_party/libcxx/__memory/uses_allocator.h
vendored
Normal file
|
@ -0,0 +1,59 @@
|
|||
// -*- 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_USES_ALLOCATOR_H
|
||||
#define _LIBCPP___MEMORY_USES_ALLOCATOR_H
|
||||
|
||||
#include <__config>
|
||||
#include <__type_traits/is_convertible.h>
|
||||
#include <cstddef>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp>
|
||||
struct __has_allocator_type
|
||||
{
|
||||
private:
|
||||
template <class _Up> static false_type __test(...);
|
||||
template <class _Up> static true_type __test(typename _Up::allocator_type* = 0);
|
||||
public:
|
||||
static const bool value = decltype(__test<_Tp>(0))::value;
|
||||
};
|
||||
|
||||
template <class _Tp, class _Alloc, bool = __has_allocator_type<_Tp>::value>
|
||||
struct __uses_allocator
|
||||
: public integral_constant<bool,
|
||||
is_convertible<_Alloc, typename _Tp::allocator_type>::value>
|
||||
{
|
||||
};
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
struct __uses_allocator<_Tp, _Alloc, false>
|
||||
: public false_type
|
||||
{
|
||||
};
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
struct _LIBCPP_TEMPLATE_VIS uses_allocator
|
||||
: public __uses_allocator<_Tp, _Alloc>
|
||||
{
|
||||
};
|
||||
|
||||
#if _LIBCPP_STD_VER >= 17
|
||||
template <class _Tp, class _Alloc>
|
||||
inline constexpr bool uses_allocator_v = uses_allocator<_Tp, _Alloc>::value;
|
||||
#endif
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_USES_ALLOCATOR_H
|
221
third_party/libcxx/__memory/uses_allocator_construction.h
vendored
Normal file
221
third_party/libcxx/__memory/uses_allocator_construction.h
vendored
Normal file
|
@ -0,0 +1,221 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// 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_USES_ALLOCATOR_CONSTRUCTION_H
|
||||
#define _LIBCPP___MEMORY_USES_ALLOCATOR_CONSTRUCTION_H
|
||||
|
||||
#include <__config>
|
||||
#include <__memory/construct_at.h>
|
||||
#include <__memory/uses_allocator.h>
|
||||
#include <__type_traits/enable_if.h>
|
||||
#include <__type_traits/is_same.h>
|
||||
#include <__type_traits/remove_cv.h>
|
||||
#include <__utility/declval.h>
|
||||
#include <__utility/pair.h>
|
||||
#include <tuple>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER >= 17
|
||||
|
||||
template <class _Type>
|
||||
inline constexpr bool __is_std_pair = false;
|
||||
|
||||
template <class _Type1, class _Type2>
|
||||
inline constexpr bool __is_std_pair<pair<_Type1, _Type2>> = true;
|
||||
|
||||
template <class _Type, class _Alloc, class... _Args, __enable_if_t<!__is_std_pair<_Type>, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto
|
||||
__uses_allocator_construction_args(const _Alloc& __alloc, _Args&&... __args) noexcept {
|
||||
if constexpr (!uses_allocator_v<_Type, _Alloc> && is_constructible_v<_Type, _Args...>) {
|
||||
return std::forward_as_tuple(std::forward<_Args>(__args)...);
|
||||
} else if constexpr (uses_allocator_v<_Type, _Alloc> &&
|
||||
is_constructible_v<_Type, allocator_arg_t, const _Alloc&, _Args...>) {
|
||||
return tuple<allocator_arg_t, const _Alloc&, _Args&&...>(allocator_arg, __alloc, std::forward<_Args>(__args)...);
|
||||
} else if constexpr (uses_allocator_v<_Type, _Alloc> && is_constructible_v<_Type, _Args..., const _Alloc&>) {
|
||||
return std::forward_as_tuple(std::forward<_Args>(__args)..., __alloc);
|
||||
} else {
|
||||
static_assert(
|
||||
sizeof(_Type) + 1 == 0, "If uses_allocator_v<Type> is true, the type has to be allocator-constructible");
|
||||
}
|
||||
}
|
||||
|
||||
template <class _Pair, class _Alloc, class _Tuple1, class _Tuple2, __enable_if_t<__is_std_pair<_Pair>, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto __uses_allocator_construction_args(
|
||||
const _Alloc& __alloc, piecewise_construct_t, _Tuple1&& __x, _Tuple2&& __y) noexcept {
|
||||
return std::make_tuple(
|
||||
piecewise_construct,
|
||||
std::apply(
|
||||
[&__alloc](auto&&... __args1) {
|
||||
return std::__uses_allocator_construction_args<typename _Pair::first_type>(
|
||||
__alloc, std::forward<decltype(__args1)>(__args1)...);
|
||||
},
|
||||
std::forward<_Tuple1>(__x)),
|
||||
std::apply(
|
||||
[&__alloc](auto&&... __args2) {
|
||||
return std::__uses_allocator_construction_args<typename _Pair::second_type>(
|
||||
__alloc, std::forward<decltype(__args2)>(__args2)...);
|
||||
},
|
||||
std::forward<_Tuple2>(__y)));
|
||||
}
|
||||
|
||||
template <class _Pair, class _Alloc, __enable_if_t<__is_std_pair<_Pair>, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto __uses_allocator_construction_args(const _Alloc& __alloc) noexcept {
|
||||
return std::__uses_allocator_construction_args<_Pair>(__alloc, piecewise_construct, tuple<>{}, tuple<>{});
|
||||
}
|
||||
|
||||
template <class _Pair, class _Alloc, class _Up, class _Vp, __enable_if_t<__is_std_pair<_Pair>, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto
|
||||
__uses_allocator_construction_args(const _Alloc& __alloc, _Up&& __u, _Vp&& __v) noexcept {
|
||||
return std::__uses_allocator_construction_args<_Pair>(
|
||||
__alloc,
|
||||
piecewise_construct,
|
||||
std::forward_as_tuple(std::forward<_Up>(__u)),
|
||||
std::forward_as_tuple(std::forward<_Vp>(__v)));
|
||||
}
|
||||
|
||||
# if _LIBCPP_STD_VER >= 23
|
||||
template <class _Pair, class _Alloc, class _Up, class _Vp, __enable_if_t<__is_std_pair<_Pair>, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto
|
||||
__uses_allocator_construction_args(const _Alloc& __alloc, pair<_Up, _Vp>& __pair) noexcept {
|
||||
return std::__uses_allocator_construction_args<_Pair>(
|
||||
__alloc, piecewise_construct, std::forward_as_tuple(__pair.first), std::forward_as_tuple(__pair.second));
|
||||
}
|
||||
# endif
|
||||
|
||||
template <class _Pair, class _Alloc, class _Up, class _Vp, __enable_if_t<__is_std_pair<_Pair>, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto
|
||||
__uses_allocator_construction_args(const _Alloc& __alloc, const pair<_Up, _Vp>& __pair) noexcept {
|
||||
return std::__uses_allocator_construction_args<_Pair>(
|
||||
__alloc, piecewise_construct, std::forward_as_tuple(__pair.first), std::forward_as_tuple(__pair.second));
|
||||
}
|
||||
|
||||
template <class _Pair, class _Alloc, class _Up, class _Vp, __enable_if_t<__is_std_pair<_Pair>, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto
|
||||
__uses_allocator_construction_args(const _Alloc& __alloc, pair<_Up, _Vp>&& __pair) noexcept {
|
||||
return std::__uses_allocator_construction_args<_Pair>(
|
||||
__alloc,
|
||||
piecewise_construct,
|
||||
std::forward_as_tuple(std::get<0>(std::move(__pair))),
|
||||
std::forward_as_tuple(std::get<1>(std::move(__pair))));
|
||||
}
|
||||
|
||||
# if _LIBCPP_STD_VER >= 23
|
||||
template <class _Pair, class _Alloc, class _Up, class _Vp, __enable_if_t<__is_std_pair<_Pair>, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto
|
||||
__uses_allocator_construction_args(const _Alloc& __alloc, const pair<_Up, _Vp>&& __pair) noexcept {
|
||||
return std::__uses_allocator_construction_args<_Pair>(
|
||||
__alloc,
|
||||
piecewise_construct,
|
||||
std::forward_as_tuple(std::get<0>(std::move(__pair))),
|
||||
std::forward_as_tuple(std::get<1>(std::move(__pair))));
|
||||
}
|
||||
# endif
|
||||
|
||||
namespace __uses_allocator_detail {
|
||||
|
||||
template <class _Ap, class _Bp>
|
||||
void __fun(const pair<_Ap, _Bp>&);
|
||||
|
||||
template <class _Tp>
|
||||
decltype(__uses_allocator_detail::__fun(std::declval<_Tp>()), true_type()) __convertible_to_const_pair_ref_impl(int);
|
||||
|
||||
template <class>
|
||||
false_type __convertible_to_const_pair_ref_impl(...);
|
||||
|
||||
template <class _Tp>
|
||||
inline constexpr bool __convertible_to_const_pair_ref =
|
||||
decltype(__uses_allocator_detail::__convertible_to_const_pair_ref_impl<_Tp>(0))::value;
|
||||
|
||||
} // namespace __uses_allocator_detail
|
||||
|
||||
template <
|
||||
class _Pair,
|
||||
class _Alloc,
|
||||
class _Type,
|
||||
__enable_if_t<__is_std_pair<_Pair> && !__uses_allocator_detail::__convertible_to_const_pair_ref<_Type>, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto
|
||||
__uses_allocator_construction_args(const _Alloc& __alloc, _Type&& __value) noexcept;
|
||||
|
||||
template <class _Type, class _Alloc, class... _Args>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr _Type __make_obj_using_allocator(const _Alloc& __alloc, _Args&&... __args);
|
||||
|
||||
template <class _Pair,
|
||||
class _Alloc,
|
||||
class _Type,
|
||||
__enable_if_t<__is_std_pair<_Pair> && !__uses_allocator_detail::__convertible_to_const_pair_ref<_Type>, int>>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto
|
||||
__uses_allocator_construction_args(const _Alloc& __alloc, _Type&& __value) noexcept {
|
||||
struct __pair_constructor {
|
||||
using _PairMutable = remove_cv_t<_Pair>;
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto __do_construct(const _PairMutable& __pair) const {
|
||||
return std::__make_obj_using_allocator<_PairMutable>(__alloc_, __pair);
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto __do_construct(_PairMutable&& __pair) const {
|
||||
return std::__make_obj_using_allocator<_PairMutable>(__alloc_, std::move(__pair));
|
||||
}
|
||||
|
||||
const _Alloc& __alloc_;
|
||||
_Type& __value_;
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr operator _PairMutable() const {
|
||||
return __do_construct(std::forward<_Type>(this->__value_));
|
||||
}
|
||||
};
|
||||
|
||||
return std::make_tuple(__pair_constructor{__alloc, __value});
|
||||
}
|
||||
|
||||
template <class _Type, class _Alloc, class... _Args>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr _Type __make_obj_using_allocator(const _Alloc& __alloc, _Args&&... __args) {
|
||||
return std::make_from_tuple<_Type>(
|
||||
std::__uses_allocator_construction_args<_Type>(__alloc, std::forward<_Args>(__args)...));
|
||||
}
|
||||
|
||||
template <class _Type, class _Alloc, class... _Args>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr _Type*
|
||||
__uninitialized_construct_using_allocator(_Type* __ptr, const _Alloc& __alloc, _Args&&... __args) {
|
||||
return std::apply(
|
||||
[&__ptr](auto&&... __xs) { return std::__construct_at(__ptr, std::forward<decltype(__xs)>(__xs)...); },
|
||||
std::__uses_allocator_construction_args<_Type>(__alloc, std::forward<_Args>(__args)...));
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_STD_VER >= 17
|
||||
|
||||
#if _LIBCPP_STD_VER >= 20
|
||||
|
||||
template <class _Type, class _Alloc, class... _Args>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto uses_allocator_construction_args(const _Alloc& __alloc, _Args&&... __args) noexcept
|
||||
-> decltype(std::__uses_allocator_construction_args<_Type>(__alloc, std::forward<_Args>(__args)...)) {
|
||||
return /*--*/ std::__uses_allocator_construction_args<_Type>(__alloc, std::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
template <class _Type, class _Alloc, class... _Args>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto make_obj_using_allocator(const _Alloc& __alloc, _Args&&... __args)
|
||||
-> decltype(std::__make_obj_using_allocator<_Type>(__alloc, std::forward<_Args>(__args)...)) {
|
||||
return /*--*/ std::__make_obj_using_allocator<_Type>(__alloc, std::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
template <class _Type, class _Alloc, class... _Args>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr auto
|
||||
uninitialized_construct_using_allocator(_Type* __ptr, const _Alloc& __alloc, _Args&&... __args)
|
||||
-> decltype(std::__uninitialized_construct_using_allocator(__ptr, __alloc, std::forward<_Args>(__args)...)) {
|
||||
return /*--*/ std::__uninitialized_construct_using_allocator(__ptr, __alloc, std::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_STD_VER >= 20
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_USES_ALLOCATOR_CONSTRUCTION_H
|
30
third_party/libcxx/__memory/voidify.h
vendored
Normal file
30
third_party/libcxx/__memory/voidify.h
vendored
Normal file
|
@ -0,0 +1,30 @@
|
|||
// -*- 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_VOIDIFY_H
|
||||
#define _LIBCPP___MEMORY_VOIDIFY_H
|
||||
|
||||
#include <__config>
|
||||
#include <__memory/addressof.h>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <typename _Tp>
|
||||
_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void* __voidify(_Tp& __from) {
|
||||
// Cast away cv-qualifiers to allow modifying elements of a range through const iterators.
|
||||
return const_cast<void*>(static_cast<const volatile void*>(_VSTD::addressof(__from)));
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___MEMORY_VOIDIFY_H
|
Loading…
Add table
Add a link
Reference in a new issue