From a72451cdbe34ec618dde18995aa39b5017d2cab1 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 6 Jun 2017 18:38:55 +0200 Subject: [PATCH] Add Destroyable::cleaner to help w/ shared_ptr<> wrapping --- src/misc/pv/destroyable.h | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/misc/pv/destroyable.h b/src/misc/pv/destroyable.h index dd66729..7f109c5 100644 --- a/src/misc/pv/destroyable.h +++ b/src/misc/pv/destroyable.h @@ -22,18 +22,37 @@ namespace epics { namespace pvData { * @author mse */ class epicsShareClass Destroyable { - public: + public: POINTER_DEFINITIONS(Destroyable); /** * Destroy this instance. */ virtual void destroy() = 0; - protected: + protected: /** * Do not allow delete on this instance and derived classes, destroy() must be used instead. */ virtual ~Destroyable() {}; + public: + + /** for use with shared_ptr<> when wrapping + * + @code + shared_ptr inner(new foo), + outer(inner.get, Destroyable::cleaner(inner)); + @endcode + */ + class cleaner { + Destroyable::shared_pointer ptr; + public: + cleaner(const Destroyable::shared_pointer& ptr) :ptr(ptr) {} + void operator()(Destroyable*) { + Destroyable::shared_pointer P; + P.swap(ptr); + P->destroy(); + } + }; }; }}