Libical API Documentation 4.0
Loading...
Searching...
No Matches
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
39template<class T>
40class ICPointerHolder
41{
42public:
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
112private:
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