Coverage Report

Created: 2024-11-21 07:03

/src/cryptopp/smartptr.h
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