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(); + } + }; }; }}