6#ifndef CRYPTOPP_SMARTPTR_H
7#define CRYPTOPP_SMARTPTR_H
18template <class T> class simple_ptr
21 simple_ptr(T *p = NULLPTR) : m_p(p) {}
37template <
class T>
class member_ptr
40 explicit member_ptr(T *p = NULLPTR) : m_p(p) {}
44 const T& operator*()
const {
return *m_p; }
45 T& operator*() {
return *m_p; }
47 const T* operator->()
const {
return m_p; }
48 T* operator->() {
return m_p; }
50 const T* get()
const {
return m_p; }
51 T* get() {
return m_p; }
60 void reset(T *p = NULLPTR);
63 member_ptr(
const member_ptr<T>& rhs);
64 void operator=(
const member_ptr<T>& rhs);
69template <
class T> member_ptr<T>::~member_ptr() {
delete m_p;}
70template <
class T>
void member_ptr<T>::reset(T *p) {
delete m_p; m_p = p;}
76template<
class T>
class value_ptr :
public member_ptr<T>
79 value_ptr(
const T &obj) : member_ptr<T>(
new T(obj)) {}
80 value_ptr(T *p = NULLPTR) : member_ptr<T>(p) {}
81 value_ptr(
const value_ptr<T>& rhs)
82 : member_ptr<T>(rhs.m_p ?
new T(*rhs.m_p) : NULLPTR) {}
84 value_ptr<T>& operator=(
const value_ptr<T>& rhs);
85 bool operator==(
const value_ptr<T>& rhs)
87 return (!this->m_p && !rhs.m_p) || (this->m_p && rhs.m_p && *this->m_p == *rhs.m_p);
94 this->m_p = rhs.m_p ?
new T(*rhs.m_p) : NULLPTR;
104template<
class T>
class clonable_ptr :
public member_ptr<T>
107 clonable_ptr(
const T &obj) : member_ptr<T>(obj.Clone()) {}
108 clonable_ptr(T *p = NULLPTR) : member_ptr<T>(p) {}
109 clonable_ptr(
const clonable_ptr<T>& rhs)
110 : member_ptr<T>(rhs.m_p ? rhs.m_p->Clone() : NULLPTR) {}
112 clonable_ptr<T>& operator=(
const clonable_ptr<T>& rhs);
117 T *old_p = this->m_p;
118 this->m_p = rhs.m_p ? rhs.m_p->Clone() : NULLPTR;
129template<
class T>
class counted_ptr
132 explicit counted_ptr(T *p = NULLPTR);
133 counted_ptr(
const T &r) : m_p(0) {attach(r);}
134 counted_ptr(
const counted_ptr<T>& rhs);
138 const T& operator*()
const {
return *m_p; }
139 T& operator*() {
return *m_p; }
141 const T* operator->()
const {
return m_p; }
142 T* operator->() {
return get(); }
144 const T* get()
const {
return m_p; }
147 void attach(
const T &p);
149 counted_ptr<T> & operator=(
const counted_ptr<T>& rhs);
155template <
class T> counted_ptr<T>::counted_ptr(T *p)
159 m_p->m_referenceCount = 1;
162template <
class T> counted_ptr<T>::counted_ptr(
const counted_ptr<T>& rhs)
166 m_p->m_referenceCount++;
169template <
class T> counted_ptr<T>::~counted_ptr()
171 if (m_p && --m_p->m_referenceCount == 0)
175template <
class T>
void counted_ptr<T>::attach(
const T &r)
177 if (m_p && --m_p->m_referenceCount == 0)
179 if (r.m_referenceCount == 0)
182 m_p->m_referenceCount = 1;
186 m_p =
const_cast<T *
>(&r);
187 m_p->m_referenceCount++;
191template <
class T> T* counted_ptr<T>::get()
193 if (m_p && m_p->m_referenceCount > 1)
195 T *temp = m_p->clone();
196 m_p->m_referenceCount--;
198 m_p->m_referenceCount = 1;
207 if (m_p && --m_p->m_referenceCount == 0)
211 m_p->m_referenceCount++;
227 : m_size(size), m_ptr(new
member_ptr<T>[size]) {}
229 {
delete [] this->m_ptr;}
231 member_ptr<T>& operator[](
size_t index)
233 const member_ptr<T>& operator[](
size_t index)
const
236 size_t size()
const {
return this->m_size;}
237 void resize(
size_t newSize)
239 member_ptr<T> *newPtr =
new member_ptr<T>[newSize];
240 for (
size_t i=0; i<this->m_size && i<newSize; i++)
241 newPtr[i].reset(this->m_ptr[i].release());
242 delete [] this->m_ptr;
243 this->m_size = newSize;
244 this->m_ptr = newPtr;
252 member_ptr<T> *m_ptr;
A pointer which can be copied and cloned.
Reference counted pointer.
Pointer that overloads operator ->
Manages resources for an array of objects.
vector_member_ptrs(size_t size=0)
Construct an array of T.
Library configuration file.
Crypto++ library namespace.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.