Add Destroyable::cleaner to help w/ shared_ptr<> wrapping

This commit is contained in:
Michael Davidsaver
2017-06-06 18:38:55 +02:00
parent e82489b158
commit a72451cdbe

View File

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