Line | Count | Source (jump to first uncovered line) |
1 | | // smartptr.h - originally written and placed in the public domain by Wei Dai |
2 | | |
3 | | /// \file smartptr.h |
4 | | /// \brief Classes for automatic resource management |
5 | | |
6 | | #ifndef CRYPTOPP_SMARTPTR_H |
7 | | #define CRYPTOPP_SMARTPTR_H |
8 | | |
9 | | #include "config.h" |
10 | | #include "stdcpp.h" |
11 | | |
12 | | NAMESPACE_BEGIN(CryptoPP) |
13 | | |
14 | | /// \brief Manages resources for a single object |
15 | | /// \tparam T class or type |
16 | | /// \details \p simple_ptr is used frequently in the library to manage resources and |
17 | | /// ensure cleanup under the RAII pattern (Resource Acquisition Is Initialization). |
18 | | template <class T> class simple_ptr |
19 | | { |
20 | | public: |
21 | | simple_ptr(T *p = NULLPTR) : m_p(p) {} |
22 | | ~simple_ptr() |
23 | | { |
24 | | delete m_p; |
25 | | m_p = NULLPTR; |
26 | | } |
27 | | |
28 | | T *m_p; |
29 | | }; |
30 | | |
31 | | /// \brief Pointer that overloads operator -> |
32 | | /// \tparam T class or type |
33 | | /// \details member_ptr is used frequently in the library to avoid the issues related to |
34 | | /// std::auto_ptr in C++11 (deprecated) and std::unique_ptr in C++03 (non-existent). |
35 | | /// \bug <a href="http://github.com/weidai11/cryptopp/issues/48">Issue 48: "Use of auto_ptr |
36 | | /// causes dirty compile under C++11"</a> |
37 | | template <class T> class member_ptr |
38 | | { |
39 | | public: |
40 | 21.7M | explicit member_ptr(T *p = NULLPTR) : m_p(p) {} CryptoPP::member_ptr<CryptoPP::ECP>::member_ptr(CryptoPP::ECP*) Line | Count | Source | 40 | 115k | explicit member_ptr(T *p = NULLPTR) : m_p(p) {} |
CryptoPP::member_ptr<CryptoPP::AlgorithmParametersBase>::member_ptr(CryptoPP::AlgorithmParametersBase*) Line | Count | Source | 40 | 21.2M | explicit member_ptr(T *p = NULLPTR) : m_p(p) {} |
CryptoPP::member_ptr<CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::DES::Base> >::member_ptr(CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::DES::Base>*) Line | Count | Source | 40 | 17 | explicit member_ptr(T *p = NULLPTR) : m_p(p) {} |
CryptoPP::member_ptr<CryptoPP::ModularArithmetic>::member_ptr(CryptoPP::ModularArithmetic*) Line | Count | Source | 40 | 108k | explicit member_ptr(T *p = NULLPTR) : m_p(p) {} |
Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::PK_MessageAccumulator>::member_ptr(CryptoPP::PK_MessageAccumulator*) Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::MontgomeryRepresentation>::member_ptr(CryptoPP::MontgomeryRepresentation*) Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::GF2NP>::member_ptr(CryptoPP::GF2NP*) Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::PK_MessageAccumulatorBase>::member_ptr(CryptoPP::PK_MessageAccumulatorBase*) Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::EC2N>::member_ptr(CryptoPP::EC2N*) Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::RandomNumberGenerator>::member_ptr(CryptoPP::RandomNumberGenerator*) CryptoPP::member_ptr<CryptoPP::BufferedTransformation>::member_ptr(CryptoPP::BufferedTransformation*) Line | Count | Source | 40 | 272k | explicit member_ptr(T *p = NULLPTR) : m_p(p) {} |
Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::OutputProxy>::member_ptr(CryptoPP::OutputProxy*) Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::KDF2_RNG>::member_ptr(CryptoPP::KDF2_RNG*) Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::HashTransformation>::member_ptr(CryptoPP::HashTransformation*) Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::MaskGeneratingFunction>::member_ptr(CryptoPP::MaskGeneratingFunction*) CryptoPP::member_ptr<CryptoPP::BlockCipher>::member_ptr(CryptoPP::BlockCipher*) Line | Count | Source | 40 | 28 | explicit member_ptr(T *p = NULLPTR) : m_p(p) {} |
Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::BlockTransformation>::member_ptr(CryptoPP::BlockTransformation*) |
41 | | |
42 | | ~member_ptr(); |
43 | | |
44 | 244k | const T& operator*() const { return *m_p; } CryptoPP::member_ptr<CryptoPP::ModularArithmetic>::operator*() const Line | Count | Source | 44 | 217k | const T& operator*() const { return *m_p; } |
CryptoPP::member_ptr<CryptoPP::ECP>::operator*() const Line | Count | Source | 44 | 27.1k | const T& operator*() const { return *m_p; } |
Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::GF2NP>::operator*() const |
45 | 27.1k | T& operator*() { return *m_p; } Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::PK_MessageAccumulator>::operator*() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::PK_MessageAccumulatorBase>::operator*() CryptoPP::member_ptr<CryptoPP::ECP>::operator*() Line | Count | Source | 45 | 27.1k | T& operator*() { return *m_p; } |
Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::EC2N>::operator*() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::KDF2_RNG>::operator*() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::HashTransformation>::operator*() |
46 | | |
47 | 5.56M | const T* operator->() const { return m_p; } CryptoPP::member_ptr<CryptoPP::ECP>::operator->() const Line | Count | Source | 47 | 54.3k | const T* operator->() const { return m_p; } |
Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::MontgomeryRepresentation>::operator->() const Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::GF2NP>::operator->() const CryptoPP::member_ptr<CryptoPP::AlgorithmParametersBase>::operator->() const Line | Count | Source | 47 | 5.50M | const T* operator->() const { return m_p; } |
CryptoPP::member_ptr<CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::DES::Base> >::operator->() const Line | Count | Source | 47 | 5 | const T* operator->() const { return m_p; } |
|
48 | 5.36M | T* operator->() { return m_p; } CryptoPP::member_ptr<CryptoPP::AlgorithmParametersBase>::operator->() Line | Count | Source | 48 | 5.36M | T* operator->() { return m_p; } |
Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::BufferedTransformation>::operator->() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::PK_MessageAccumulator>::operator->() CryptoPP::member_ptr<CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::DES::Base> >::operator->() Line | Count | Source | 48 | 5 | T* operator->() { return m_p; } |
Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::RandomNumberGenerator>::operator->() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::GF2NP>::operator->() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::HashTransformation>::operator->() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::MaskGeneratingFunction>::operator->() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::BlockCipher>::operator->() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::BlockTransformation>::operator->() |
49 | | |
50 | 11.2M | const T* get() const { return m_p; } CryptoPP::member_ptr<CryptoPP::AlgorithmParametersBase>::get() const Line | Count | Source | 50 | 5.51M | const T* get() const { return m_p; } |
CryptoPP::member_ptr<CryptoPP::BufferedTransformation>::get() const Line | Count | Source | 50 | 5.73M | const T* get() const { return m_p; } |
|
51 | 49.6M | T* get() { return m_p; } CryptoPP::member_ptr<CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::DES::Base> >::get() Line | Count | Source | 51 | 5 | T* get() { return m_p; } |
CryptoPP::member_ptr<CryptoPP::BufferedTransformation>::get() Line | Count | Source | 51 | 49.6M | T* get() { return m_p; } |
Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::KDF2_RNG>::get() |
52 | | |
53 | | T* release() |
54 | 15.9M | { |
55 | 15.9M | T *old_p = m_p; |
56 | 15.9M | m_p = NULLPTR; |
57 | 15.9M | return old_p; |
58 | 15.9M | } CryptoPP::member_ptr<CryptoPP::AlgorithmParametersBase>::release() Line | Count | Source | 54 | 15.9M | { | 55 | 15.9M | T *old_p = m_p; | 56 | 15.9M | m_p = NULLPTR; | 57 | 15.9M | return old_p; | 58 | 15.9M | } |
Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::PK_MessageAccumulatorBase>::release() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::BufferedTransformation>::release() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::OutputProxy>::release() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::PK_MessageAccumulator>::release() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::GF2NP>::release() |
59 | | |
60 | | void reset(T *p = NULLPTR); |
61 | | |
62 | | protected: |
63 | | member_ptr(const member_ptr<T>& rhs); // copy not allowed |
64 | | void operator=(const member_ptr<T>& rhs); // assignment not allowed |
65 | | |
66 | | T *m_p; |
67 | | }; |
68 | | |
69 | 21.7M | template <class T> member_ptr<T>::~member_ptr() {delete m_p;} CryptoPP::member_ptr<CryptoPP::BufferedTransformation>::~member_ptr() Line | Count | Source | 69 | 272k | template <class T> member_ptr<T>::~member_ptr() {delete m_p;} |
CryptoPP::member_ptr<CryptoPP::ECP>::~member_ptr() Line | Count | Source | 69 | 115k | template <class T> member_ptr<T>::~member_ptr() {delete m_p;} |
CryptoPP::member_ptr<CryptoPP::BlockCipher>::~member_ptr() Line | Count | Source | 69 | 28 | template <class T> member_ptr<T>::~member_ptr() {delete m_p;} |
CryptoPP::member_ptr<CryptoPP::AlgorithmParametersBase>::~member_ptr() Line | Count | Source | 69 | 21.2M | template <class T> member_ptr<T>::~member_ptr() {delete m_p;} |
CryptoPP::member_ptr<CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::DES::Base> >::~member_ptr() Line | Count | Source | 69 | 17 | template <class T> member_ptr<T>::~member_ptr() {delete m_p;} |
CryptoPP::member_ptr<CryptoPP::ModularArithmetic>::~member_ptr() Line | Count | Source | 69 | 108k | template <class T> member_ptr<T>::~member_ptr() {delete m_p;} |
Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::PK_MessageAccumulator>::~member_ptr() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::MontgomeryRepresentation>::~member_ptr() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::GF2NP>::~member_ptr() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::PK_MessageAccumulatorBase>::~member_ptr() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::EC2N>::~member_ptr() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::RandomNumberGenerator>::~member_ptr() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::OutputProxy>::~member_ptr() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::KDF2_RNG>::~member_ptr() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::HashTransformation>::~member_ptr() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::MaskGeneratingFunction>::~member_ptr() Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::BlockTransformation>::~member_ptr() |
70 | 16.4M | template <class T> void member_ptr<T>::reset(T *p) {delete m_p; m_p = p;} CryptoPP::member_ptr<CryptoPP::AlgorithmParametersBase>::reset(CryptoPP::AlgorithmParametersBase*) Line | Count | Source | 70 | 15.9M | template <class T> void member_ptr<T>::reset(T *p) {delete m_p; m_p = p;} |
Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::MontgomeryRepresentation>::reset(CryptoPP::MontgomeryRepresentation*) CryptoPP::member_ptr<CryptoPP::ECP>::reset(CryptoPP::ECP*) Line | Count | Source | 70 | 27.1k | template <class T> void member_ptr<T>::reset(T *p) {delete m_p; m_p = p;} |
CryptoPP::member_ptr<CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::DES::Base> >::reset(CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::DES::Base>*) Line | Count | Source | 70 | 5 | template <class T> void member_ptr<T>::reset(T *p) {delete m_p; m_p = p;} |
Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::RandomNumberGenerator>::reset(CryptoPP::RandomNumberGenerator*) CryptoPP::member_ptr<CryptoPP::ModularArithmetic>::reset(CryptoPP::ModularArithmetic*) Line | Count | Source | 70 | 27.1k | template <class T> void member_ptr<T>::reset(T *p) {delete m_p; m_p = p;} |
CryptoPP::member_ptr<CryptoPP::BufferedTransformation>::reset(CryptoPP::BufferedTransformation*) Line | Count | Source | 70 | 408k | template <class T> void member_ptr<T>::reset(T *p) {delete m_p; m_p = p;} |
Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::PK_MessageAccumulator>::reset(CryptoPP::PK_MessageAccumulator*) Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::GF2NP>::reset(CryptoPP::GF2NP*) Unexecuted instantiation: CryptoPP::member_ptr<CryptoPP::KDF2_RNG>::reset(CryptoPP::KDF2_RNG*) |
71 | | |
72 | | // ******************************************************** |
73 | | |
74 | | /// \brief Value pointer |
75 | | /// \tparam T class or type |
76 | | template<class T> class value_ptr : public member_ptr<T> |
77 | | { |
78 | | public: |
79 | 27.1k | value_ptr(const T &obj) : member_ptr<T>(new T(obj)) {} |
80 | 61.3k | value_ptr(T *p = NULLPTR) : member_ptr<T>(p) {} CryptoPP::value_ptr<CryptoPP::ECP>::value_ptr(CryptoPP::ECP*) Line | Count | Source | 80 | 61.3k | value_ptr(T *p = NULLPTR) : member_ptr<T>(p) {} |
CryptoPP::value_ptr<CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::DES::Base> >::value_ptr(CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::DES::Base>*) Line | Count | Source | 80 | 17 | value_ptr(T *p = NULLPTR) : member_ptr<T>(p) {} |
Unexecuted instantiation: CryptoPP::value_ptr<CryptoPP::MontgomeryRepresentation>::value_ptr(CryptoPP::MontgomeryRepresentation*) |
81 | | value_ptr(const value_ptr<T>& rhs) |
82 | 0 | : member_ptr<T>(rhs.m_p ? new T(*rhs.m_p) : NULLPTR) {} Unexecuted instantiation: CryptoPP::value_ptr<CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::DES::Base> >::value_ptr(CryptoPP::value_ptr<CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::DES::Base> > const&) Unexecuted instantiation: CryptoPP::value_ptr<CryptoPP::ECP>::value_ptr(CryptoPP::value_ptr<CryptoPP::ECP> const&) Unexecuted instantiation: CryptoPP::value_ptr<CryptoPP::MontgomeryRepresentation>::value_ptr(CryptoPP::value_ptr<CryptoPP::MontgomeryRepresentation> const&) |
83 | | |
84 | | value_ptr<T>& operator=(const value_ptr<T>& rhs); |
85 | | bool operator==(const value_ptr<T>& rhs) |
86 | | { |
87 | | return (!this->m_p && !rhs.m_p) || (this->m_p && rhs.m_p && *this->m_p == *rhs.m_p); |
88 | | } |
89 | | }; |
90 | | |
91 | | template <class T> value_ptr<T>& value_ptr<T>::operator=(const value_ptr<T>& rhs) |
92 | 27.1k | { |
93 | 27.1k | T *old_p = this->m_p; |
94 | 27.1k | this->m_p = rhs.m_p ? new T(*rhs.m_p) : NULLPTR; |
95 | 27.1k | delete old_p; |
96 | 27.1k | return *this; |
97 | 27.1k | } CryptoPP::value_ptr<CryptoPP::ECP>::operator=(CryptoPP::value_ptr<CryptoPP::ECP> const&) Line | Count | Source | 92 | 27.1k | { | 93 | 27.1k | T *old_p = this->m_p; | 94 | 27.1k | this->m_p = rhs.m_p ? new T(*rhs.m_p) : NULLPTR; | 95 | 27.1k | delete old_p; | 96 | 27.1k | return *this; | 97 | 27.1k | } |
Unexecuted instantiation: CryptoPP::value_ptr<CryptoPP::MontgomeryRepresentation>::operator=(CryptoPP::value_ptr<CryptoPP::MontgomeryRepresentation> const&) |
98 | | |
99 | | // ******************************************************** |
100 | | |
101 | | /// \brief A pointer which can be copied and cloned |
102 | | /// \tparam T class or type |
103 | | /// \details \p T should adhere to the \p Clonable interface |
104 | | template<class T> class clonable_ptr : public member_ptr<T> |
105 | | { |
106 | | public: |
107 | 0 | clonable_ptr(const T &obj) : member_ptr<T>(obj.Clone()) {} |
108 | 54.3k | clonable_ptr(T *p = NULLPTR) : member_ptr<T>(p) {} CryptoPP::clonable_ptr<CryptoPP::ModularArithmetic>::clonable_ptr(CryptoPP::ModularArithmetic*) Line | Count | Source | 108 | 54.3k | clonable_ptr(T *p = NULLPTR) : member_ptr<T>(p) {} |
Unexecuted instantiation: CryptoPP::clonable_ptr<CryptoPP::GF2NP>::clonable_ptr(CryptoPP::GF2NP*) |
109 | | clonable_ptr(const clonable_ptr<T>& rhs) |
110 | 54.3k | : member_ptr<T>(rhs.m_p ? rhs.m_p->Clone() : NULLPTR) {} |
111 | | |
112 | | clonable_ptr<T>& operator=(const clonable_ptr<T>& rhs); |
113 | | }; |
114 | | |
115 | | template <class T> clonable_ptr<T>& clonable_ptr<T>::operator=(const clonable_ptr<T>& rhs) |
116 | 0 | { |
117 | 0 | T *old_p = this->m_p; |
118 | 0 | this->m_p = rhs.m_p ? rhs.m_p->Clone() : NULLPTR; |
119 | 0 | delete old_p; |
120 | 0 | return *this; |
121 | 0 | } Unexecuted instantiation: CryptoPP::clonable_ptr<CryptoPP::GF2NP>::operator=(CryptoPP::clonable_ptr<CryptoPP::GF2NP> const&) Unexecuted instantiation: CryptoPP::clonable_ptr<CryptoPP::ModularArithmetic>::operator=(CryptoPP::clonable_ptr<CryptoPP::ModularArithmetic> const&) |
122 | | |
123 | | // ******************************************************** |
124 | | |
125 | | /// \brief Reference counted pointer |
126 | | /// \tparam T class or type |
127 | | /// \details users should declare \p m_referenceCount as <tt>std::atomic<unsigned></tt> |
128 | | /// (or similar) under C++ 11 |
129 | | template<class T> class counted_ptr |
130 | | { |
131 | | public: |
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); |
135 | | |
136 | | ~counted_ptr(); |
137 | | |
138 | | const T& operator*() const { return *m_p; } |
139 | | T& operator*() { return *m_p; } |
140 | | |
141 | | const T* operator->() const { return m_p; } |
142 | | T* operator->() { return get(); } |
143 | | |
144 | | const T* get() const { return m_p; } |
145 | | T* get(); |
146 | | |
147 | | void attach(const T &p); |
148 | | |
149 | | counted_ptr<T> & operator=(const counted_ptr<T>& rhs); |
150 | | |
151 | | private: |
152 | | T *m_p; |
153 | | }; |
154 | | |
155 | | template <class T> counted_ptr<T>::counted_ptr(T *p) |
156 | | : m_p(p) |
157 | | { |
158 | | if (m_p) |
159 | | m_p->m_referenceCount = 1; |
160 | | } |
161 | | |
162 | | template <class T> counted_ptr<T>::counted_ptr(const counted_ptr<T>& rhs) |
163 | | : m_p(rhs.m_p) |
164 | | { |
165 | | if (m_p) |
166 | | m_p->m_referenceCount++; |
167 | | } |
168 | | |
169 | | template <class T> counted_ptr<T>::~counted_ptr() |
170 | | { |
171 | | if (m_p && --m_p->m_referenceCount == 0) |
172 | | delete m_p; |
173 | | } |
174 | | |
175 | | template <class T> void counted_ptr<T>::attach(const T &r) |
176 | | { |
177 | | if (m_p && --m_p->m_referenceCount == 0) |
178 | | delete m_p; |
179 | | if (r.m_referenceCount == 0) |
180 | | { |
181 | | m_p = r.clone(); |
182 | | m_p->m_referenceCount = 1; |
183 | | } |
184 | | else |
185 | | { |
186 | | m_p = const_cast<T *>(&r); |
187 | | m_p->m_referenceCount++; |
188 | | } |
189 | | } |
190 | | |
191 | | template <class T> T* counted_ptr<T>::get() |
192 | | { |
193 | | if (m_p && m_p->m_referenceCount > 1) |
194 | | { |
195 | | T *temp = m_p->clone(); |
196 | | m_p->m_referenceCount--; |
197 | | m_p = temp; |
198 | | m_p->m_referenceCount = 1; |
199 | | } |
200 | | return m_p; |
201 | | } |
202 | | |
203 | | template <class T> counted_ptr<T> & counted_ptr<T>::operator=(const counted_ptr<T>& rhs) |
204 | | { |
205 | | if (m_p != rhs.m_p) |
206 | | { |
207 | | if (m_p && --m_p->m_referenceCount == 0) |
208 | | delete m_p; |
209 | | m_p = rhs.m_p; |
210 | | if (m_p) |
211 | | m_p->m_referenceCount++; |
212 | | } |
213 | | return *this; |
214 | | } |
215 | | |
216 | | // ******************************************************** |
217 | | |
218 | | /// \brief Manages resources for an array of objects |
219 | | /// \tparam T class or type |
220 | | template <class T> class vector_member_ptrs |
221 | | { |
222 | | public: |
223 | | /// Construct an array of \p T |
224 | | /// \param size the size of the array, in elements |
225 | | /// \details If \p T is a Plain Old Dataype (POD), then the array is uninitialized. |
226 | | vector_member_ptrs(size_t size=0) |
227 | | : m_size(size), m_ptr(new member_ptr<T>[size]) {} |
228 | | ~vector_member_ptrs() |
229 | | {delete [] this->m_ptr;} |
230 | | |
231 | | member_ptr<T>& operator[](size_t index) |
232 | | {CRYPTOPP_ASSERT(index<this->m_size); return this->m_ptr[index];} |
233 | | const member_ptr<T>& operator[](size_t index) const |
234 | | {CRYPTOPP_ASSERT(index<this->m_size); return this->m_ptr[index];} |
235 | | |
236 | | size_t size() const {return this->m_size;} |
237 | | void resize(size_t newSize) |
238 | | { |
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; |
245 | | } |
246 | | |
247 | | private: |
248 | | vector_member_ptrs(const vector_member_ptrs<T> &c); // copy not allowed |
249 | | void operator=(const vector_member_ptrs<T> &x); // assignment not allowed |
250 | | |
251 | | size_t m_size; |
252 | | member_ptr<T> *m_ptr; |
253 | | }; |
254 | | |
255 | | NAMESPACE_END |
256 | | |
257 | | #endif |