diff options
Diffstat (limited to 'curses/cursesobject.H')
| -rw-r--r-- | curses/cursesobject.H | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/curses/cursesobject.H b/curses/cursesobject.H new file mode 100644 index 0000000..377c539 --- /dev/null +++ b/curses/cursesobject.H @@ -0,0 +1,102 @@ +/* +** Copyright 2002, Double Precision Inc. +** +** See COPYING for distribution information. +*/ + +#ifndef cursesobject_H +#define cursesobject_H + +/////////////////////////////////////////////////////////////////////////// +// +// Helper class that detects when the object being pointed to is destroyed. +// +// Subclass cursesObj. Declare CursesPtr<T>, where T is cursesObj's +// subclass. After CursesObj is destroyed, CursesPtr<T>::operator T *() +// will return NULL. +// +// The cursesObj object maintains a list of all CursesPtr<T>s that point to +// it. cursesObj's destructor nulls them out. + +#include "../curses/curses_config.h" +#include <set> +#include <cstdio> + +class cursesPtrBase { +public: + cursesPtrBase(); + virtual ~cursesPtrBase(); + virtual void ptrDestroyed()=0; +}; + +template<class T> class cursesPtr : public cursesPtrBase { + + T *ptr; + +public: + cursesPtr(T *ptrArg) : ptr(NULL) + { + if (ptrArg) + ptrArg->cursesBase.insert(this); + ptr=ptrArg; + } + + cursesPtr(const cursesPtr &o) : ptr(NULL) + { + (*this)=o; + } + + cursesPtr &operator=(const cursesPtr &o) + { + if (o.ptr == NULL || + o.ptr->cursesBase.count(this) == 0) + { + if (o.ptr) + o.ptr->cursesBase.insert(this); + + if (ptr && ptr->cursesBase.count(this) > 0) + ptr->cursesBase.erase(ptr->cursesBase + .find(this)); + } + ptr=o.ptr; + + return *this; + } + + ~cursesPtr() + { + if (ptr && ptr->cursesBase.count(this) > 0) + ptr->cursesBase.erase(ptr->cursesBase + .find(this)); + } + + operator T *() const + { + return ptr; + } + + T * operator->() const + { + return ptr; + } + + bool isDestroyed() const { return ptr == 0; } + + void ptrDestroyed() { ptr=NULL; } + +}; + +class CursesObj { + +public: + std::set<cursesPtrBase *> cursesBase; + + CursesObj(); + virtual ~CursesObj(); + + // UNDEFINED: + CursesObj(const CursesObj &); + CursesObj &operator=(const CursesObj &); +}; + +#endif |
