diff options
author | Wim Vriend <facetracknoir@gmail.com> | 2011-03-21 21:32:13 +0000 |
---|---|---|
committer | Wim Vriend <facetracknoir@gmail.com> | 2011-03-21 21:32:13 +0000 |
commit | 7eeb8dfaede7bb54b37b8ea538135914a43ab011 (patch) | |
tree | 890f04508697583a3d3e1b849181122278096701 /FaceTrackNoIR/AutoClosePtr.h | |
parent | 09b4c95b8036b9466ca89acbe0b1f3d810499863 (diff) |
New effort to embrace faceAPI 3.2.6
git-svn-id: svn+ssh://svn.code.sf.net/p/facetracknoir/code@54 19e81ba0-9b1a-49c3-bd6c-561e1906d5fb
Diffstat (limited to 'FaceTrackNoIR/AutoClosePtr.h')
-rw-r--r-- | FaceTrackNoIR/AutoClosePtr.h | 89 |
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 |