summaryrefslogtreecommitdiffhomepage
path: root/FaceTrackNoIR/AutoClosePtr.h
blob: 690d2c622ccf346e59eed760f03afaeddf95dad7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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