1 #ifndef CRYPTOPP_SMARTPTR_H
2 #define CRYPTOPP_SMARTPTR_H
7 NAMESPACE_BEGIN(CryptoPP)
12 simple_ptr(T *p = NULL) : m_p(p) {}
13 ~simple_ptr() {
delete m_p; m_p = NULL;}
24 const T& operator*()
const {
return *m_p; }
25 T& operator*() {
return *m_p; }
27 const T* operator->()
const {
return m_p; }
28 T* operator->() {
return m_p; }
30 const T*
get()
const {
return m_p; }
31 T*
get() {
return m_p; }
65 return (!this->m_p && !rhs.m_p) || (this->m_p && rhs.m_p && *this->m_p == *rhs.m_p);
72 this->m_p = rhs.m_p ?
new T(*rhs.m_p) : NULL;
93 this->m_p = rhs.m_p ? rhs.m_p->Clone() : NULL;
109 const T& operator*()
const {
return *m_p; }
110 T& operator*() {
return *m_p; }
112 const T* operator->()
const {
return m_p; }
113 T* operator->() {
return get(); }
115 const T*
get()
const {
return m_p; }
118 void attach(
const T &p);
130 m_p->m_referenceCount = 1;
137 m_p->m_referenceCount++;
142 if (m_p && --m_p->m_referenceCount == 0)
148 if (m_p && --m_p->m_referenceCount == 0)
150 if (r.m_referenceCount == 0)
153 m_p->m_referenceCount = 1;
157 m_p =
const_cast<T *
>(&r);
158 m_p->m_referenceCount++;
164 if (m_p && m_p->m_referenceCount > 1)
166 T *temp = m_p->clone();
167 m_p->m_referenceCount--;
169 m_p->m_referenceCount = 1;
178 if (m_p && --m_p->m_referenceCount == 0)
182 m_p->m_referenceCount++;
195 {
delete [] this->m_ptr;}
198 {assert(index<this->m_size);
return this->m_ptr[index];}
200 {assert(index<this->m_size);
return this->m_ptr[index];}
202 size_t size()
const {
return this->m_size;}
203 void resize(
size_t newSize)
206 for (
size_t i=0; i<this->m_size && i<newSize; i++)
207 newPtr[i].reset(this->m_ptr[i].release());
208 delete [] this->m_ptr;
209 this->m_size = newSize;
210 this->m_ptr = newPtr;