Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cNewPtr.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cNewPtr_H
7 #define _INC_cNewPtr_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "cPtrFacade.h"
13 
14 namespace Gray
15 {
16  template<class TYPE>
17  class cNewPtr : public cPtrFacade < TYPE >
18  {
23 
24  typedef cNewPtr<TYPE> THIS_t;
25  typedef cPtrFacade<TYPE> SUPER_t;
26 
27  public:
28  cNewPtr() noexcept
29  {
30  }
31  explicit cNewPtr(TYPE* pObj) noexcept
32  : cPtrFacade<TYPE>(pObj)
33  {
34  // explicit to make sure we don't copy an allocated pointer accidentally.
35  }
36 
37  private:
38  // Don't allow this ! copy would be risky.
39  cNewPtr(const THIS_t& rObj) noexcept
40  : cPtrFacade<TYPE>(nullptr)
41  {
43  }
44 
45  public:
47  {
48  FreeLast();
49  }
50 
51  void AllocArray(size_t nSize = 1) noexcept
52  {
53  FreeLast();
54  this->m_p = new TYPE[nSize];
55  }
56  void AllocArray(size_t nSize, const TYPE* p) noexcept
57  {
58  AllocArray(nSize);
59  if (p != nullptr && this->m_p != nullptr)
60  {
61  cMem::Copy(this->m_p, p, sizeof(TYPE)*nSize);
62  }
63  }
64  void ReleasePtr() noexcept
65  {
66  FreeLast();
67  }
68 
69  // Override operators
70 
71  THIS_t& operator = (TYPE* p2) noexcept
72  {
73  AsignPtr(p2);
74  return *this;
75  }
76  THIS_t& operator = (THIS_t& ref) noexcept
77  {
78  AsignRef(ref);
79  return *this;
80  }
81 
82  // Accessor ops.
83  TYPE& operator * () const
84  {
85  ASSERT(this->isValidPtr()); return(*this->m_p);
86  }
87 
88  TYPE* operator -> () const
89  {
90  ASSERT(this->isValidPtr()); return(this->m_p);
91  }
92 
93  // Comparisons.
94  bool operator != (const TYPE* p2) const noexcept
95  {
96  return(p2 != this->m_p);
97  }
98 #if _MSC_VER < 1300 // VC 7.0 has trouble converting to const
99  bool operator == (const TYPE* p2) const noexcept
100  {
101  return(p2 == this->m_p);
102  }
103 #endif
104 
105  protected:
106  void AsignPtr(TYPE* p2) noexcept
107  {
108  if (p2 != this->m_p)
109  {
110  FreeLast();
111  this->m_p = p2;
112  }
113  }
114  void AsignRef(THIS_t& ref) noexcept
115  {
116  if (&ref != this)
117  {
118  FreeLast();
119  this->m_p = ref.get_Ptr();
120  ref.m_p = nullptr; // transferred.
121  }
122  }
123  void FreeLast() noexcept
124  {
125  if (this->m_p != nullptr)
126  {
127  TYPE* p2 = this->m_p;
128  this->m_p = nullptr; // clear this in case the destructor refs itself in some odd way.
129  delete p2;
130  }
131  }
132  };
133 
134  template<class TYPE>
135  class cNewPtr2 : public cNewPtr < TYPE >
136  {
139  typedef cNewPtr2<TYPE> THIS_t;
140  typedef cNewPtr<TYPE> SUPER_t;
141 
142  public:
144  {
145  }
146  cNewPtr2(const THIS_t& rObj)
147  : cNewPtr<TYPE>(Dupe(rObj))
148  {
150  }
151  cNewPtr2(const SUPER_t& rObj)
152  : cNewPtr<TYPE>(Dupe(rObj))
153  {
155  }
156  explicit cNewPtr2(TYPE* pObj)
157  : cNewPtr<TYPE>(pObj)
158  {
159  // explicit to make sure we don't copy an allocated pointer accidentally.
160  }
161 
162  static TYPE* Dupe(const SUPER_t& rObj)
163  {
164  TYPE* p2 = rObj.get_Ptr();
165  if (p2 == nullptr)
166  return nullptr;
167  return new TYPE(*p2);
168  }
169 
170  // Override operators
172  {
173  this->AsignPtr(p2);
174  return *this;
175  }
176  THIS_t& operator = (const THIS_t& ref)
177  {
178  this->AsignPtr(this->Dupe(ref));
179  return *this;
180  }
181  };
182 
183 };
184 #endif // _INC_cNewPtr_H
#define TYPE
Definition: StrT.cpp:38
#define ASSERT(exp)
Definition: cDebugAssert.h:87
Definition: cNewPtr.h:136
cNewPtr2(const SUPER_t &rObj)
Definition: cNewPtr.h:151
cNewPtr2(TYPE *pObj)
Definition: cNewPtr.h:156
cNewPtr2(const THIS_t &rObj)
Definition: cNewPtr.h:146
static TYPE * Dupe(const SUPER_t &rObj)
Definition: cNewPtr.h:162
cNewPtr2()
Definition: cNewPtr.h:143
THIS_t & operator=(TYPE *p2)
Definition: cNewPtr.h:171
Definition: cNewPtr.h:18
void AsignRef(THIS_t &ref) noexcept
Definition: cNewPtr.h:114
bool operator!=(const TYPE *p2) const noexcept
Definition: cNewPtr.h:94
void FreeLast() noexcept
Definition: cNewPtr.h:123
TYPE & operator*() const
Definition: cNewPtr.h:83
void AsignPtr(TYPE *p2) noexcept
Definition: cNewPtr.h:106
bool operator==(const TYPE *p2) const noexcept
Definition: cNewPtr.h:99
void AllocArray(size_t nSize=1) noexcept
Definition: cNewPtr.h:51
cNewPtr(TYPE *pObj) noexcept
Definition: cNewPtr.h:31
THIS_t & operator=(TYPE *p2) noexcept
Definition: cNewPtr.h:71
void ReleasePtr() noexcept
Definition: cNewPtr.h:64
void AllocArray(size_t nSize, const TYPE *p) noexcept
Definition: cNewPtr.h:56
TYPE * operator->() const
Definition: cNewPtr.h:88
cNewPtr() noexcept
Definition: cNewPtr.h:28
~cNewPtr()
Definition: cNewPtr.h:46
Definition: cPtrFacade.h:19
TYPE * m_p
Pointer to some object of TYPE.
Definition: cPtrFacade.h:28
bool isValidPtr() const noexcept
Definition: cPtrFacade.h:41
TYPE * get_Ptr() const noexcept
Definition: cPtrFacade.h:53
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
static void Copy(void *pDst, const void *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:132