KJB
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
RCIPtr.h
Go to the documentation of this file.
1 #ifndef RCIPTR_H_
2 #define RCIPTR_H_
3 
19 namespace spear {
20 
24 class RCObject
25 {
26  public:
27  void addReference();
28  void removeReference();
29 
30  protected:
31  RCObject();
32  RCObject(const RCObject& rhs);
33  RCObject& operator=(const RCObject& rhs);
34  virtual ~RCObject() = 0;
35 
36  public:
37  unsigned short refCount;
38 };
39 
41  : refCount(0){} // std::cout << "RCObject constr\n"; }
42 
44  : refCount(0){} // std::cout << "RCObject copy constr\n"; }
45 
47 {
48  return *this;
49 }
50 
52 
53 inline void RCObject::addReference()
54 {
55  ++refCount;
56 }
57 
59 {
60  if (--refCount == 0) delete this;
61 }
62 
66 template<class T>
67 class RCIPtr
68 {
69  public:
70  explicit RCIPtr(T* realPtr = 0);
71  RCIPtr(const RCIPtr& rhs);
72  ~RCIPtr();
73  RCIPtr& operator=(const RCIPtr& rhs);
74 
75  T* operator->() const;
76  T& operator*() const;
77 
78  void clear() {
79  *this = RCIPtr<T>(0);
80  };
81 
82 private:
83  T *pointee;
84  void init() {
85  if(pointee != 0) pointee->addReference();
86  }
87 };
88 
89 template<typename T>
90 inline bool operator== (const RCIPtr<T> & pointer, const RCIPtr<T> & other)
91 {
92  return pointer.operator->() == other.operator->();
93 }
94 
95 template<typename T>
96 inline bool operator!= (const RCIPtr<T> & pointer, const RCIPtr<T> & other)
97 {
98  return pointer.operator->() != other.operator->();
99 }
100 
101 template<typename T>
102 inline bool operator== (const RCIPtr<T> & pointer, const T * other)
103 {
104  return pointer.operator->() == other;
105 }
106 
107 template<typename T>
108 inline bool operator== (const T * other, const RCIPtr<T> & pointer)
109 {
110  return pointer.operator->() == other;
111 }
112 
113 template<typename T>
114 inline bool operator!= (const RCIPtr<T> & pointer, const T * other)
115 {
116  return pointer.operator->() != other;
117 }
118 
119 template<typename T>
120 inline bool operator!= (const T * other, const RCIPtr<T> & pointer)
121 {
122  return pointer.operator->() != other;
123 }
124 
125 template<class T>
126 RCIPtr<T>::RCIPtr(T* realPtr)
127  : pointee(realPtr)
128 {
129  init();
130 }
131 
132 template<class T>
134  : pointee(rhs.pointee)
135 {
136  init();
137 }
138 
139 template<class T>
141 {
142  if(pointee != 0) pointee->removeReference();
143 }
144 
145 template<class T>
147 {
148  if (pointee != rhs.pointee) {
149  if(pointee != 0) pointee->removeReference();
150  pointee = rhs.pointee;
151  init();
152  }
153  return *this;
154 }
155 
156 template<class T>
158 { return pointee; }
159 
160 template<class T>
162 { return *(pointee); }
163 
164 } // end namespace spear
165 
166 #endif /* RCI_PTR_H */
167 
RCIPtr & operator=(const RCIPtr &rhs)
Definition: RCIPtr.h:146
RCObject & operator=(const RCObject &rhs)
Definition: RCIPtr.h:46
void addReference()
Definition: RCIPtr.h:53
Definition: RCIPtr.h:67
virtual ~RCObject()=0
Definition: RCIPtr.h:51
unsigned short refCount
Definition: RCIPtr.h:37
RCIPtr(T *realPtr=0)
Definition: RCIPtr.h:126
T * operator->() const
Definition: RCIPtr.h:157
void removeReference()
Definition: RCIPtr.h:58
RCObject()
Definition: RCIPtr.h:40
Definition: RCIPtr.h:24
bool operator!=(const RCIPtr< T > &pointer, const RCIPtr< T > &other)
Definition: RCIPtr.h:96
T & operator*() const
Definition: RCIPtr.h:161
~RCIPtr()
Definition: RCIPtr.h:140
void clear()
Definition: RCIPtr.h:78
bool operator==(const RCIPtr< T > &pointer, const RCIPtr< T > &other)
Definition: RCIPtr.h:90