63namespace pointer_safety {
66#if defined(BIO_POINTER_SAFETY) && BIO_CPP_VERSION >= 11
96 const ::std::size_t
addressHash = ::std::hash< const void* >()(
key.mAddress);
97 const ::std::size_t
typeHash = ::std::hash< const void* >()(
key.mType);
104 ::std::unordered_set< RetiredPointer, RetiredPointerHash >
mRetired;
108template <
typename T >
111 typedef typename ::std::remove_cv< T >::type
BareT;
112 static const char sToken = 0;
117template <
typename T >
152 "BIO_POINTER_SAFETY: dereference of retired (freed) pointer %p at %s:%d\n",
165template <
typename T >
169 detail::PointerSafetyRegistry&
reg = detail::Registry();
170 ::std::lock_guard< ::std::mutex >
guard(
reg.mLock);
171 reg.mRetired.erase(detail::Key< T >(
p));
172 reg.mRetired.erase(detail::UntypedKey(
p));
188template <
typename T >
192 detail::PointerSafetyRegistry&
reg = detail::Registry();
193 ::std::lock_guard< ::std::mutex >
guard(
reg.mLock);
194 reg.mRetired.insert(detail::Key< T >(
p));
210template <
typename T >
211inline bool IsLive(
const void*
p)
213 if (!
p) {
return true; }
214 detail::PointerSafetyRegistry&
reg = detail::Registry();
215 ::std::lock_guard< ::std::mutex >
guard(
reg.mLock);
216 if (
reg.mRetired.find(detail::Key< T >(
p)) !=
reg.mRetired.end())
220 const detail::RetiredPointer
untyped = detail::UntypedKey(
p);
221 if (
untyped.mType != detail::TypeToken< T >()
232inline bool IsLive(
const void*
p)
237template <
typename T >
266template <
typename T >
269template <
typename T >
272template <
typename T >
273inline bool IsLive(
const void*) {
return true; }
274inline bool IsLive(
const void*) {
return true; }
275template <
typename T >