OWLNext
7.0
Borland's Object Windows Library for the modern age
Toggle main menu visibility
Loading...
Searching...
No Matches
pointer.h
Go to the documentation of this file.
1
//----------------------------------------------------------------------------
2
// Borland Class Library
3
// Copyright (c) 1992, 1996 by Borland International, All Rights Reserved
4
//
5
/// \file
6
/// Various types of smart pointer templatized classes
7
//----------------------------------------------------------------------------
8
9
#if !defined(OWL_POINTER_H)
10
#define OWL_POINTER_H
11
12
#include <
owl/private/defs.h
>
13
#if defined(BI_HAS_PRAGMA_ONCE)
14
# pragma once
15
#endif
16
17
#include <new>
18
19
namespace
owl
{
20
21
#include <
owl/preclass.h
>
22
23
//
24
// A pair of smart pointer template classes. Provides basic conversion
25
// operator to T*, as well as dereferencing (*), and 0-checking (!).
26
// These classes assume that they alone are responsible for deleting the
27
// object or array unless Relinquish() is called.
28
//
29
30
/// \addtogroup utility
31
/// @{
32
33
//
34
/// \class TPointerBase
35
// ~~~~~ ~~~~~~~~~~~~
36
/// Smart pointer base class. Provides basic conversion operator to T*, as well as
37
/// dereferencing (*), and 0-checking (!). This and derived classes assume that they alone are
38
/// responsible for deleting the object or array unless Relinquish() is called.
39
//
40
template
<
class
T>
class
TPointerBase
{
41
public
:
42
T&
operator *
() {
return
*
P
;}
43
operator
T*() {
return
P
;}
44
int
operator !
()
const
{
return
P
==
nullptr
;}
45
T*
Relinquish
() {T* p =
P
;
P
=
nullptr
;
return
p;}
46
47
protected
:
48
TPointerBase
(T* pointer) :
P
(pointer) {}
49
TPointerBase
() :
P
(nullptr) {}
50
51
T*
P
;
52
53
private
:
54
void
*
operator
new
(size_t)
noexcept
{
return
nullptr
;}
// prohibit use of new
55
#if !defined(BI_COMP_GNUC)
56
void
operator
delete
(
void
* p) {(
static_cast<
TPointerBase<T>
*
>
(p))->
P
=0;}
57
#endif
58
59
60
#if !defined(OWL5_COMPAT)
61
// Prohibit copying.
62
//
63
TPointerBase
(
const
TPointerBase
&);
64
TPointerBase
& operator=(
const
TPointerBase
&);
65
#endif
66
};
67
68
//
69
/// \class TPointer
70
// ~~~~~ ~~~~~~~~
71
/// Smart pointer to a single object. Provides member access operator ->
72
//
73
template
<
class
T>
class
TPointer
:
public
TPointerBase
<T> {
74
public
:
75
TPointer
() :
TPointerBase
<T>() {}
76
77
#if !defined(OWL5_COMPAT)
78
explicit
79
#endif
80
TPointer
(T* pointer) :
TPointerBase
<T>(pointer) {}
81
82
~TPointer
() {
delete
this->
P
;}
83
84
TPointer<T>
&
operator =
(T* src)
85
{
86
if
(src == this->
P
)
return
*
this
;
// same-pointer assignment
87
88
delete
this->
P
;
89
this->
P
= src;
90
return
*
this
;
91
}
92
93
T*
operator->
() {
return
this->
P
;}
// Could throw exception if P==0
94
95
};
96
97
//
98
/// \class TAPointer
99
// ~~~~~ ~~~~~~~~~
100
/// Pointer to an array of type T. Provides an array subscript operator and uses
101
/// array delete[]
102
//
103
template
<
class
T>
class
TAPointer
:
public
TPointerBase
<T> {
104
public
:
105
TAPointer
() :
TPointerBase
<T>() {}
106
107
#if !defined(OWL5_COMPAT)
108
explicit
109
#endif
110
TAPointer
(T array[]) :
TPointerBase
<T>(array) {}
111
112
~TAPointer
() {
delete
[] this->
P
;}
113
114
TAPointer<T>
&
operator =
(T* src)
115
{
116
if
(src == this->
P
)
return
*
this
;
// same-pointer assignment
117
118
delete
[] this->
P
;
119
this->
P
= src;
120
return
*
this
;
121
}
122
123
T&
operator[]
(
int
i) {
return
this->
P
[i];}
// Could throw exception if P==0
124
T&
operator[]
(
size_t
i) {
return
this->
P
[i];}
// Could throw exception if P==0
125
126
};
127
128
//----------------------------------------------------------------------------
129
130
//
131
/// \class TEnvelope
132
// ~~~~~ ~~~~~~~~~
133
/// Envelope-letter type of smart pointers. In this implementation the envelope
134
/// acts as a smart pointer to a reference-counted internal letter. This allows
135
/// a lot of flexibility & safety in working with a single object (associated
136
/// with the letter) being assigned to numerous envelopes in many scopes. An 'A'
137
/// version is provided for use with arrays.
138
///
139
/// Use like:
140
/// \code
141
/// TEnvelope<T> e1 = new T(x,y,x); // e1 now owns a T in a letter
142
/// e1->Func(); // invokes Func() on the new T
143
/// Func(*e1); // passing a T& or a T this way
144
/// TEnvelope<T> e2 = e1; // e2 safely shares the letter with e1
145
///
146
/// TAEnvelope<T> e1 = new T[99]; // e1 now owns T[] in a letter
147
/// e1[i].Func(); // invokes Func() on a T element
148
/// Func(e1[i]); // passing a T& or a T this way
149
/// TAEnvelope<T> e2 = e1; // e2 safely shares the letter with e1
150
/// \endcode
151
152
//
153
template
<
class
T>
class
TEnvelope
{
154
public
:
155
TEnvelope
(T*
object
) : Letter(new TLetter(object)) {}
156
TEnvelope
(
const
TEnvelope
& src) : Letter(src.Letter) {Letter->AddRef();}
157
~TEnvelope
() {Letter->Release();}
158
159
TEnvelope
&
operator =
(
const
TEnvelope
& src);
160
TEnvelope
&
operator =
(T*
object
);
161
162
T*
operator->
() {
return
Letter->Object; }
163
T&
operator *
() {
return
*Letter->Object; }
164
165
private
:
166
struct
TLetter {
167
TLetter(T*
object
) : Object(object), RefCount(1) {}
168
~TLetter() {
delete
Object; }
169
170
void
AddRef() { RefCount++; }
171
void
Release() {
if
(--RefCount == 0)
delete
this
; }
172
173
T* Object;
174
int
RefCount;
175
};
176
TLetter* Letter;
177
};
178
179
//
180
//
181
//
182
class
TVoidPointer
{
183
public
:
184
TVoidPointer
(
const
void
*p =
nullptr
) : Ptr(p) {}
185
TVoidPointer
(
const
TVoidPointer
& rp ) : Ptr(rp.Ptr) {}
186
187
const
TVoidPointer
&
operator =
(
const
TVoidPointer
& vp )
188
{ Ptr = vp.Ptr;
return
*
this
; }
189
const
TVoidPointer
&
operator =
(
const
void
*p )
190
{ Ptr = p;
return
*
this
; }
191
operator
void
*()
const
{
return
CONST_CAST
(
void
*,Ptr); }
192
193
private
:
194
const
void
*Ptr;
195
};
196
197
198
//
199
/// \class TComRefBase
200
// ~~~~~ ~~~~~~~~~~~
201
/// Encapsulation of OLE interface pointers
202
//
203
template
<
class
T>
class
TComRefBase
{
204
public
:
205
operator
T*() {
return
I
;}
206
operator
T**() {
Clear
();
return
&
I
;}
207
int
operator !
()
const
{
return
I
==
nullptr
;}
208
void
operator
delete
(
void
* p) {(
static_cast<
TComRefBase<T>
*
>
(p))->
I
=0;}
209
protected
:
210
TComRefBase
(
const
TComRefBase<T>
& i) :
I
(i.
I
) {
if
(
I
)
I
->AddRef();}
211
TComRefBase
(T* i) :
I
(i) {}
212
TComRefBase
() :
I
(nullptr) {}
213
~TComRefBase
() {
Clear
();}
214
215
void
Clear
() {
if
(
I
){
I
->Release();
I
=
nullptr
;}}
216
T*
I
;
217
private
:
218
219
// Prohibit use of operator new
220
//
221
void
*
operator
new
(size_t)
noexcept
{
return
nullptr
;}
222
};
223
224
template
<
class
T>
class
TComRef
:
public
TComRefBase
<T> {
225
public
:
226
TComRef
() :
TComRefBase
<T>() {}
227
TComRef
(T* iface) :
TComRefBase
<T>(iface) {}
228
TComRef
(
const
TComRef<T>
& i) :
TComRefBase
<T>(i) {}
229
230
TComRef<T>
&
operator =
(T* iface)
231
{
232
if
(iface == this->
I
)
return
*
this
;
// same-interface assignment
233
234
this->
Clear
();
235
this->
I
= iface;
236
return
*
this
;
237
}
238
239
TComRef<T>
&
operator =
(
const
TComRef<T>
& i)
240
{
241
if
(&i ==
this
)
return
*
this
;
// self-assignment
242
243
this->
Clear
();
244
if
(i.
I
)
245
{
246
this->
I
= i.
I
;
247
this->
I
->AddRef();
248
}
249
return
*
this
;
250
}
251
252
T*
operator->
() {
return
this->
I
;}
// Could throw exception if I==0
253
T*
operator->
()
const
{
return
this->
I
;}
// Could throw exception if I==0
254
//void** operator&() {this->Clear(); return (void**)&I;}
255
};
256
257
/// @}
258
259
#include <
owl/posclass.h
>
260
261
template
<
class
T>
262
TEnvelope<T>
&
TEnvelope<T>::operator =
(
const
TEnvelope<T>
& src)
263
{
264
if
(&src ==
this
)
return
*
this
;
// self-assignment
265
266
Letter->Release();
267
Letter = src.Letter;
268
Letter->AddRef();
269
return
*
this
;
270
}
271
272
template
<
class
T>
273
TEnvelope<T>
&
TEnvelope<T>::operator =
(T*
object
)
274
{
275
if
(
object
== Letter->Object)
return
*
this
;
// same-pointer assignment
276
277
Letter->Release();
278
Letter =
new
TLetter(
object
);
// Assumes non-null! Use with new
279
return
*
this
;
280
}
281
282
//
283
/// \class TAEnvelope
284
// ~~~~~ ~~~~~~~~~~
285
/// Envelope-letter type of smart pointer array. In this implementation the envelope
286
/// acts as a smart pointer to a reference-counted internal letter. This allows a
287
/// lot of flexibility & safety in working with a single object (associated with the
288
/// letter) being assigned to numerous envelopes in many scopes.
289
///
290
/// Use:
291
/// \code
292
/// TAEnvelope<T> e1 = new T[99]; // e1 now owns T[] in a letter
293
/// e1[i].Func(); // invokes Func() on a T element
294
/// Func(e1[i]); // passing a T& or a T this way
295
/// TAEnvelope<T> e2 = e1; // e2 safely shares the letter with e1
296
/// \endcode
297
template
<
class
T>
class
TAEnvelope
{
298
public
:
299
TAEnvelope
(T array[]) : Letter(new TLetter(array)) {}
300
TAEnvelope
(
const
TAEnvelope
& src) : Letter(src.Letter) {Letter->AddRef();}
301
~TAEnvelope
() { Letter->Release(); }
302
303
TAEnvelope
&
operator =
(
const
TAEnvelope
& src);
304
TAEnvelope
&
operator =
(T array[]);
305
306
T&
operator[]
(
int
i) {
return
Letter->Array[i]; }
307
T*
operator *
() {
return
Letter->Array; }
308
309
private
:
310
struct
TLetter {
311
TLetter(T array[]) : Array(array), RefCount(1) {}
312
~TLetter() {
delete
[] Array; }
313
314
void
AddRef() { RefCount++; }
315
void
Release() {
if
(--RefCount == 0)
delete
this
; }
316
317
T* Array;
318
int
RefCount;
319
};
320
TLetter* Letter;
321
};
322
323
template
<
class
T>
324
TAEnvelope<T>
&
TAEnvelope<T>::operator =
(
const
TAEnvelope<T>
& src)
325
{
326
if
(&src ==
this
)
return
*
this
;
// self-assignment
327
328
Letter->Release();
329
Letter = src.Letter;
330
Letter->AddRef();
331
return
*
this
;
332
}
333
334
template
<
class
T>
335
TAEnvelope<T>
&
TAEnvelope<T>::operator =
(T array[])
336
{
337
if
(array == Letter->Array)
return
*
this
;
// same-pointer assignment
338
339
Letter->Release();
340
Letter =
new
TLetter(array);
// Assumes non-null! Use with new
341
return
*
this
;
342
}
343
344
}
// OWL namespace
345
346
#endif
// OWL_POINTER_H
owl::TAEnvelope
Envelope-letter type of smart pointer array.
Definition
pointer.h:297
owl::TAEnvelope::TAEnvelope
TAEnvelope(T array[])
Definition
pointer.h:299
owl::TAEnvelope::operator[]
T & operator[](int i)
Definition
pointer.h:306
owl::TAEnvelope::operator=
TAEnvelope & operator=(const TAEnvelope &src)
Definition
pointer.h:324
owl::TAEnvelope::TAEnvelope
TAEnvelope(const TAEnvelope &src)
Definition
pointer.h:300
owl::TAEnvelope::operator*
T * operator*()
Definition
pointer.h:307
owl::TAEnvelope::~TAEnvelope
~TAEnvelope()
Definition
pointer.h:301
owl::TAPointer::TAPointer
TAPointer()
Definition
pointer.h:105
owl::TAPointer::operator[]
T & operator[](size_t i)
Definition
pointer.h:124
owl::TAPointer::TAPointer
TAPointer(T array[])
Definition
pointer.h:110
owl::TAPointer::operator=
TAPointer< T > & operator=(T *src)
Definition
pointer.h:114
owl::TAPointer::operator[]
T & operator[](int i)
Definition
pointer.h:123
owl::TAPointer::~TAPointer
~TAPointer()
Definition
pointer.h:112
owl::TComRefBase::~TComRefBase
~TComRefBase()
Definition
pointer.h:213
owl::TComRefBase::TComRefBase
TComRefBase()
Definition
pointer.h:212
owl::TComRefBase::operator!
int operator!() const
Definition
pointer.h:207
owl::TComRefBase::TComRefBase
TComRefBase(T *i)
Definition
pointer.h:211
owl::TComRefBase< IContextMenu >::Clear
void Clear()
Definition
pointer.h:215
owl::TComRefBase< IContextMenu >::I
IContextMenu * I
Definition
pointer.h:216
owl::TComRefBase::TComRefBase
TComRefBase(const TComRefBase< T > &i)
Definition
pointer.h:210
owl::TComRef::TComRef
TComRef(T *iface)
Definition
pointer.h:227
owl::TComRef::operator->
T * operator->() const
Definition
pointer.h:253
owl::TComRef::operator=
TComRef< T > & operator=(T *iface)
Definition
pointer.h:230
owl::TComRef::TComRef
TComRef()
Definition
pointer.h:226
owl::TComRef::operator->
T * operator->()
Definition
pointer.h:252
owl::TComRef::TComRef
TComRef(const TComRef< T > &i)
Definition
pointer.h:228
owl::TEnvelope
Envelope-letter type of smart pointers.
Definition
pointer.h:153
owl::TEnvelope::operator=
TEnvelope & operator=(const TEnvelope &src)
Definition
pointer.h:262
owl::TEnvelope::operator*
T & operator*()
Definition
pointer.h:163
owl::TEnvelope::~TEnvelope
~TEnvelope()
Definition
pointer.h:157
owl::TEnvelope::TEnvelope
TEnvelope(const TEnvelope &src)
Definition
pointer.h:156
owl::TEnvelope::operator->
T * operator->()
Definition
pointer.h:162
owl::TEnvelope::TEnvelope
TEnvelope(T *object)
Definition
pointer.h:155
owl::TPointerBase
Smart pointer base class.
Definition
pointer.h:40
owl::TPointerBase::TPointerBase
TPointerBase(T *pointer)
Definition
pointer.h:48
owl::TPointerBase::Relinquish
T * Relinquish()
Definition
pointer.h:45
owl::TPointerBase::operator*
T & operator*()
Definition
pointer.h:42
owl::TPointerBase::operator!
int operator!() const
Definition
pointer.h:44
owl::TPointerBase::P
T * P
Definition
pointer.h:51
owl::TPointerBase::TPointerBase
TPointerBase()
Definition
pointer.h:49
owl::TPointer::operator->
T * operator->()
Definition
pointer.h:93
owl::TPointer::TPointer
TPointer()
Definition
pointer.h:75
owl::TPointer::TPointer
TPointer(T *pointer)
Definition
pointer.h:80
owl::TPointer::~TPointer
~TPointer()
Definition
pointer.h:82
owl::TPointer::operator=
TPointer< T > & operator=(T *src)
Definition
pointer.h:84
owl::TVoidPointer::operator=
const TVoidPointer & operator=(const TVoidPointer &vp)
Definition
pointer.h:187
owl::TVoidPointer::TVoidPointer
TVoidPointer(const TVoidPointer &rp)
Definition
pointer.h:185
owl::TVoidPointer::TVoidPointer
TVoidPointer(const void *p=nullptr)
Definition
pointer.h:184
owl
Object Windows Library (OWLNext Core).
Definition
animctrl.h:22
defs.h
CONST_CAST
#define CONST_CAST(targetType, object)
Definition
defs.h:273
posclass.h
preclass.h
include
owl
pointer.h
Generated by
1.18.0