summaryrefslogtreecommitdiffhomepage
path: root/FaceTrackNoIR/AutoClosePtr.h
diff options
context:
space:
mode:
Diffstat (limited to 'FaceTrackNoIR/AutoClosePtr.h')
-rw-r--r--FaceTrackNoIR/AutoClosePtr.h89
1 files changed, 89 insertions, 0 deletions
diff --git a/FaceTrackNoIR/AutoClosePtr.h b/FaceTrackNoIR/AutoClosePtr.h
new file mode 100644
index 00000000..690d2c62
--- /dev/null
+++ b/FaceTrackNoIR/AutoClosePtr.h
@@ -0,0 +1,89 @@
+////////////////////////////////////////////////////////////////////////////////
+// Auto pointer template.
+
+#if !defined(AUTOCLOSEPTR_H)
+#define AUTOCLOSEPTR_H
+
+//////////////////////////////////////////////////////////////////////////////
+// T auto pointer (not suitable for containers).
+// This auto pointer uses T's member function to perform clean up, rather
+// than `operator Closeete'.
+//
+template<typename T, typename R, R (T::*Close)()>
+class AutoClosePtr
+{
+public:
+ explicit AutoClosePtr(T* p = NULL)
+ : m_p(p)
+ { // construct from object pointer
+ }
+
+ AutoClosePtr(AutoClosePtr& Other)
+ : m_p(Other.Release())
+ { // construct from Other AutoClosePtr
+ }
+
+ AutoClosePtr& operator=(AutoClosePtr& Other)
+ { // assign Other
+ Reset(Other.Release());
+ return (*this);
+ }
+
+ ~AutoClosePtr()
+ { // close and destroy
+ if(m_p)
+ {
+ (m_p->*Close)();
+ m_p = NULL;
+ }
+ }
+
+ T& operator*() const
+ { // return T
+ return (*m_p);
+ }
+
+ T** operator&()
+ { // return the address of the wrapped pointer
+ Reset();
+ return &m_p;
+ }
+
+ T* operator->() const
+ { // return wrapped pointer
+ return Get();
+ }
+
+ operator bool() const
+ { // check wrapped pointer for NULL
+ return m_p != NULL;
+ }
+
+ T* Get() const
+ { // return wrapped pointer
+ return m_p;
+ }
+
+ T* Release()
+ { // return wrapped pointer and give up ownership
+ T* pTmp = m_p;
+ m_p = NULL;
+ return pTmp;
+ }
+
+ void Reset(T* p = NULL)
+ { // destroy the object and store new pointer
+ if(p != m_p)
+ {
+ if(m_p)
+ (m_p->*Close)();
+ }
+
+ m_p = p;
+ }
+
+private:
+ T* m_p; // the wrapped raw pointer
+};
+
+#endif // AUTOCLOSEPTR_H \ No newline at end of file