forked from OSchip/llvm-project
[libc++] Move pointer safety related utilities out of <memory>
Differential Revision: https://reviews.llvm.org/D100318
This commit is contained in:
parent
916fecb499
commit
7f1963dc8e
|
@ -18,6 +18,7 @@ set(files
|
|||
__memory/auto_ptr.h
|
||||
__memory/base.h
|
||||
__memory/compressed_pair.h
|
||||
__memory/pointer_safety.h
|
||||
__memory/pointer_traits.h
|
||||
__memory/raw_storage_iterator.h
|
||||
__memory/shared_ptr.h
|
||||
|
|
|
@ -0,0 +1,86 @@
|
|||
// -*- 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_SAFETY_H
|
||||
#define _LIBCPP___MEMORY_POINTER_SAFETY_H
|
||||
|
||||
#include <__config>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
//enum class
|
||||
#if defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE)
|
||||
# ifndef _LIBCPP_CXX03_LANG
|
||||
enum class pointer_safety : unsigned char {
|
||||
relaxed,
|
||||
preferred,
|
||||
strict
|
||||
};
|
||||
# endif
|
||||
#else
|
||||
struct _LIBCPP_TYPE_VIS pointer_safety
|
||||
{
|
||||
enum __lx
|
||||
{
|
||||
relaxed,
|
||||
preferred,
|
||||
strict
|
||||
};
|
||||
|
||||
__lx __v_;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pointer_safety() : __v_() {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pointer_safety(__lx __v) : __v_(__v) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
operator int() const {return __v_;}
|
||||
};
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) && \
|
||||
defined(_LIBCPP_BUILDING_LIBRARY)
|
||||
_LIBCPP_FUNC_VIS pointer_safety get_pointer_safety() _NOEXCEPT;
|
||||
#else
|
||||
// This function is only offered in C++03 under ABI v1.
|
||||
# if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) || !defined(_LIBCPP_CXX03_LANG)
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
pointer_safety get_pointer_safety() _NOEXCEPT {
|
||||
return pointer_safety::relaxed;
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
_LIBCPP_FUNC_VIS void declare_reachable(void* __p);
|
||||
_LIBCPP_FUNC_VIS void declare_no_pointers(char* __p, size_t __n);
|
||||
_LIBCPP_FUNC_VIS void undeclare_no_pointers(char* __p, size_t __n);
|
||||
_LIBCPP_FUNC_VIS void* __undeclare_reachable(void* __p);
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_Tp*
|
||||
undeclare_reachable(_Tp* __p)
|
||||
{
|
||||
return static_cast<_Tp*>(__undeclare_reachable(__p));
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___MEMORY_POINTER_SAFETY_H
|
|
@ -683,6 +683,7 @@ void* align(size_t alignment, size_t size, void*& ptr, size_t& space);
|
|||
#include <__memory/auto_ptr.h>
|
||||
#include <__memory/base.h>
|
||||
#include <__memory/compressed_pair.h>
|
||||
#include <__memory/pointer_safety.h>
|
||||
#include <__memory/pointer_traits.h>
|
||||
#include <__memory/raw_storage_iterator.h>
|
||||
#include <__memory/shared_ptr.h>
|
||||
|
@ -828,64 +829,6 @@ public:
|
|||
{__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
|
||||
};
|
||||
|
||||
//enum class
|
||||
#if defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE)
|
||||
# ifndef _LIBCPP_CXX03_LANG
|
||||
enum class pointer_safety : unsigned char {
|
||||
relaxed,
|
||||
preferred,
|
||||
strict
|
||||
};
|
||||
# endif
|
||||
#else
|
||||
struct _LIBCPP_TYPE_VIS pointer_safety
|
||||
{
|
||||
enum __lx
|
||||
{
|
||||
relaxed,
|
||||
preferred,
|
||||
strict
|
||||
};
|
||||
|
||||
__lx __v_;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pointer_safety() : __v_() {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pointer_safety(__lx __v) : __v_(__v) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
operator int() const {return __v_;}
|
||||
};
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) && \
|
||||
defined(_LIBCPP_BUILDING_LIBRARY)
|
||||
_LIBCPP_FUNC_VIS pointer_safety get_pointer_safety() _NOEXCEPT;
|
||||
#else
|
||||
// This function is only offered in C++03 under ABI v1.
|
||||
# if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) || !defined(_LIBCPP_CXX03_LANG)
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
pointer_safety get_pointer_safety() _NOEXCEPT {
|
||||
return pointer_safety::relaxed;
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
_LIBCPP_FUNC_VIS void declare_reachable(void* __p);
|
||||
_LIBCPP_FUNC_VIS void declare_no_pointers(char* __p, size_t __n);
|
||||
_LIBCPP_FUNC_VIS void undeclare_no_pointers(char* __p, size_t __n);
|
||||
_LIBCPP_FUNC_VIS void* __undeclare_reachable(void* __p);
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_Tp*
|
||||
undeclare_reachable(_Tp* __p)
|
||||
{
|
||||
return static_cast<_Tp*>(__undeclare_reachable(__p));
|
||||
}
|
||||
|
||||
_LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space);
|
||||
|
||||
// --- Helper for container swap --
|
||||
|
|
Loading…
Reference in New Issue