mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-19 17:31:55 +00:00

In addition to making the code a lot easier to grasp by localizing many helper functions to the only file where they are actually needed, this will allow creating helper functions that depend on allocator_traits outside of <memory>. This is done as part of implementing array support in allocate_shared, which requires non-trivial array initialization algorithms that would be better to keep out of <memory> for sanity. It's also a first step towards splitting up our monolithic headers into finer grained ones, which will make it easier to reuse functionality across the library. For example, it's just weird that we had to define `addressof` inside <type_traits> to avoid circular dependencies -- instead it's better to implement those in true helper headers. Differential Revision: https://reviews.llvm.org/D93074
128 lines
2.9 KiB
C++
128 lines
2.9 KiB
C++
// -*- 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_BASE_H
|
|
#define _LIBCPP___MEMORY_BASE_H
|
|
|
|
#include <__config>
|
|
#include <__debug>
|
|
#include <type_traits>
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
#pragma GCC system_header
|
|
#endif
|
|
|
|
_LIBCPP_PUSH_MACROS
|
|
#include <__undef_macros>
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
// addressof
|
|
#ifndef _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
|
|
|
|
template <class _Tp>
|
|
inline _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
_LIBCPP_NO_CFI _LIBCPP_INLINE_VISIBILITY
|
|
_Tp*
|
|
addressof(_Tp& __x) _NOEXCEPT
|
|
{
|
|
return __builtin_addressof(__x);
|
|
}
|
|
|
|
#else
|
|
|
|
template <class _Tp>
|
|
inline _LIBCPP_NO_CFI _LIBCPP_INLINE_VISIBILITY
|
|
_Tp*
|
|
addressof(_Tp& __x) _NOEXCEPT
|
|
{
|
|
return reinterpret_cast<_Tp *>(
|
|
const_cast<char *>(&reinterpret_cast<const volatile char &>(__x)));
|
|
}
|
|
|
|
#endif // _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
|
|
|
|
#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
|
|
|
|
// construct_at
|
|
|
|
#if _LIBCPP_STD_VER > 17
|
|
|
|
template<class _Tp, class ..._Args, class = decltype(
|
|
::new (_VSTD::declval<void*>()) _Tp(_VSTD::declval<_Args>()...)
|
|
)>
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
constexpr _Tp* construct_at(_Tp* __location, _Args&& ...__args) {
|
|
_LIBCPP_ASSERT(__location, "null pointer given to construct_at");
|
|
return ::new ((void*)__location) _Tp(_VSTD::forward<_Args>(__args)...);
|
|
}
|
|
|
|
#endif
|
|
|
|
// destroy_at
|
|
|
|
#if _LIBCPP_STD_VER > 14
|
|
|
|
template <class _Tp>
|
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
|
void destroy_at(_Tp* __loc) {
|
|
_LIBCPP_ASSERT(__loc, "null pointer given to destroy_at");
|
|
__loc->~_Tp();
|
|
}
|
|
|
|
#endif
|
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
_LIBCPP_POP_MACROS
|
|
|
|
#endif // _LIBCPP___MEMORY_BASE_H
|