Libical API Documentation
4.0
Loading...
Searching...
No Matches
src
libical
icptrholder_cxx.h
Go to the documentation of this file.
1
33
34
#ifndef ICPTRHOLDER_CXX_H
35
#define ICPTRHOLDER_CXX_H
36
37
#include <cassert>
38
39
template
<
class
T>
40
class
ICPointerHolder
41
{
42
public
:
43
ICPointerHolder()
44
: ptr(0)
45
{
46
}
47
48
ICPointerHolder(T *p)
49
: ptr(p)
50
{
51
}
52
53
// copy constructor to support assignment
54
ICPointerHolder(
const
ICPointerHolder &ip)
55
: ptr(ip.ptr)
56
{
57
// We need to transfer ownership of ptr to this object by setting
58
// ip's ptr to null. Otherwise, ptr will de deleted twice.
59
// const ugliness requires us to do the const_cast.
60
ICPointerHolder *ipp =
const_cast<
ICPointerHolder *
>
(&ip);
61
62
ipp->ptr = 0;
63
};
64
65
~ICPointerHolder()
66
{
67
release();
68
}
69
70
ICPointerHolder &operator=(T *p)
71
{
72
this->release();
73
ptr = p;
74
return
*
this
;
75
}
76
77
ICPointerHolder &operator=(ICPointerHolder &p)
78
{
79
this->release();
80
ptr = p.ptr;
// this transfer ownership of the pointer
81
p.ptr = 0;
// set it to null so the pointer won't get delete twice.
82
return
*
this
;
83
}
84
85
bool
operator!=(T *p)
86
{
87
return
(ptr != p);
88
}
89
90
bool
operator==(T *p)
91
{
92
return
(ptr == p);
93
}
94
95
operator
T *()
const
96
{
97
return
ptr;
98
}
99
100
T *operator->()
const
101
{
102
icalassert(ptr);
103
return
ptr;
104
}
105
106
T &operator*()
107
{
108
icalassert(ptr);
109
return
*ptr;
110
}
111
112
private
:
113
void
release()
114
{
115
if
(ptr != 0) {
116
ptr->detach();
117
delete
ptr;
118
119
ptr = 0;
120
}
121
}
122
123
T *ptr;
124
};
125
126
#endif
Generated on Fri May 30 2025 11:51:05 for Libical API Documentation by
1.13.2