From 66a8e8b3c1125660fea0e057f23feb0fb3eb09e0 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Thu, 21 Nov 2002 14:46:45 +0000 Subject: [PATCH] get_deleter<> added. [SVN r16365] --- include/boost/detail/shared_count.hpp | 13 +++++++++++++ include/boost/shared_ptr.hpp | 12 ++++++++++++ 2 files changed, 25 insertions(+) diff --git a/include/boost/detail/shared_count.hpp b/include/boost/detail/shared_count.hpp index 9c7e77f..a7eb08c 100644 --- a/include/boost/detail/shared_count.hpp +++ b/include/boost/detail/shared_count.hpp @@ -29,6 +29,7 @@ #include // for std::less #include // for std::exception #include // for std::bad_alloc +#include // for std::type_info in get_deleter #ifdef __BORLANDC__ # pragma warn -8026 // Functions with excep. spec. are not expanded inline @@ -106,6 +107,8 @@ public: delete this; } + virtual void * get_deleter(std::type_info const & ti) = 0; + void add_ref() { #if defined(BOOST_HAS_THREADS) @@ -253,6 +256,11 @@ public: del(ptr); } + virtual void * get_deleter(std::type_info const & ti) + { + return ti == typeid(D)? &del: 0; + } + #if defined(BOOST_SP_USE_STD_ALLOCATOR) void * operator new(std::size_t) @@ -371,6 +379,11 @@ public: { return std::less()(a.pi_, b.pi_); } + + void * get_deleter(std::type_info const & ti) const + { + return pi_->get_deleter(ti); + } }; #ifdef __CODEGUARD__ diff --git a/include/boost/shared_ptr.hpp b/include/boost/shared_ptr.hpp index fedfdd8..cbd9fd3 100644 --- a/include/boost/shared_ptr.hpp +++ b/include/boost/shared_ptr.hpp @@ -275,6 +275,11 @@ public: return pn < rhs.pn; } + void * _internal_get_deleter(std::type_info const & ti) const + { + return pn.get_deleter(ti); + } + // Tasteless as this may seem, making all members public allows member templates // to work in the absence of member template friends. (Matthew Langston) @@ -364,6 +369,13 @@ template inline T * get_pointer(shared_ptr const & p) return p.get(); } +// get_deleter (experimental) + +template D * get_deleter(shared_ptr const & p) +{ + return static_cast(p._internal_get_deleter(typeid(D))); +} + } // namespace boost #ifdef BOOST_MSVC