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
|