1 #pragma once
2 
3 namespace APE
4 {
5 
6 // disable the operator -> on UDT warning
7 #ifdef _MSC_VER
8     #pragma warning(push)
9     #pragma warning(disable : 4284)
10 #endif
11 
12 /*************************************************************************************************
13 CSmartPtr - a simple smart pointer class that can automatically initialize and free memory
14     note: (doesn't do garbage collection / reference counting because of the many pitfalls)
15 *************************************************************************************************/
16 template <class TYPE> class CSmartPtr
17 {
18 public:
19     TYPE * m_pObject;
20     bool m_bArray;
21     bool m_bDelete;
22 
CSmartPtr()23     CSmartPtr()
24     {
25         m_bDelete = true;
26         m_pObject = NULL;
27     }
28     CSmartPtr(TYPE * a_pObject, bool a_bArray = false, bool a_bDelete = true)
29     {
30         m_bDelete = true;
31         m_pObject = NULL;
32         Assign(a_pObject, a_bArray, a_bDelete);
33     }
34 
~CSmartPtr()35     ~CSmartPtr()
36     {
37         Delete();
38     }
39 
40     void Assign(TYPE * a_pObject, bool a_bArray = false, bool a_bDelete = true)
41     {
42         Delete();
43 
44         m_bDelete = a_bDelete;
45         m_bArray = a_bArray;
46         m_pObject = a_pObject;
47     }
48 
Delete()49     void Delete()
50     {
51         if (m_bDelete && m_pObject)
52         {
53             if (m_bArray)
54                 delete [] m_pObject;
55             else
56                 delete m_pObject;
57 
58             m_pObject = NULL;
59         }
60     }
61 
SetDelete(const bool a_bDelete)62     void SetDelete(const bool a_bDelete)
63     {
64         m_bDelete = a_bDelete;
65     }
66 
GetPtr()67     __forceinline TYPE * GetPtr() const
68     {
69         return m_pObject;
70     }
71 
72     __forceinline operator TYPE * () const
73     {
74         return m_pObject;
75     }
76 
77     __forceinline TYPE * operator ->() const
78     {
79         return m_pObject;
80     }
81 
82     // declare assignment, but don't implement (compiler error if we try to use)
83     // that way we can't carelessly mix smart pointers and regular pointers
84     __forceinline void * operator =(void *) const;
85 };
86 
87 #ifdef _MSC_VER
88     #pragma warning(pop)
89 #endif
90 
91 }
92