Guiliani  Version 2.5 revision 7293 (documentation build 13)
GUIRefCntPtr.h
1/*
2* Copyright (C) TES Electronic Solutions GmbH,
3* All Rights Reserved.
4* Contact: info@guiliani.de
5*
6* This file is part of the Guiliani HMI framework
7* for the development of graphical user interfaces on embedded systems.
8*/
9
10#if !defined(GUIREFCNTPTR_H__)
11#define GUIREFCNTPTR_H__
12
13#include "RefCounted.h"
14
16namespace NSmartPtr
17{
74template<typename T>
76{
77public:
82 explicit CGUIRefCntPtr(T* p=(T*)0) throw()
83 : m_h(new Holder(p))
84 { m_h->AddRef(); }
85
90 { m_h->Release(); }
91
97 {
98 rkSource.m_h->AddRef();
99 m_h = rkSource.m_h;
100 }
101
106 eC_Int GetNOFReferences() const
107 { return m_h->RefCount(); }
108
113 eC_Bool IsUnique() const
114 { return m_h->Unique(); }
115
124 template<typename T2>
126 {
127 // This cast is a type safety check to avoid casts of this
128 // pointer to unrelated types.
129 if (static_cast<T2*>(m_h->m_ptr) != NULL) { }
130 return CGUIRefCntPtr<T2>(
131 reinterpret_cast<CGUIRefCntPtr<T2>&>(*this));
132 }
133
134#if defined(GUILIANI_USE_RTTI)
147 template<typename T2>
149 {
150 T2* p = dynamic_cast<T2*>(m_h->m_ptr);
151 if (p != NULL)
152 {
153 return CGUIRefCntPtr<T2>(
154 reinterpret_cast<CGUIRefCntPtr<T2>&>(*this));
155 }
156 return CGUIRefCntPtr<T2>(NULL);
157 }
158#endif // GUILIANI_USE_RTTI
159
169 {
170 rkSource.m_h->AddRef();
171 m_h->Release();
172 m_h = rkSource.m_h;
173 return *this;
174 }
175
180 T* operator->() const
181 { return m_h->m_ptr; }
182
187 T& operator*() const
188 { return *m_h->m_ptr; }
189
195 T* Get() const
196 { return m_h->m_ptr; }
197
203 eC_Bool operator==(const CGUIRefCntPtr<T>& rkRight) const
204 { return m_h->m_ptr == rkRight.m_h->m_ptr; }
205
211 template<typename T2>
212 eC_Bool operator==(const CGUIRefCntPtr<T2>& rkRight) const
213 { return m_h->m_ptr == static_cast<T*>(rkRight.m_h->m_ptr); }
214
220 eC_Bool operator==(const T* pRight) const
221 { return m_h->m_ptr == pRight; }
222
228 eC_Bool operator!=(const CGUIRefCntPtr<T>& rkRight) const
229 { return !(operator==(rkRight)); }
230
236 eC_Bool operator<(const CGUIRefCntPtr<T>& rkRight) const
237 { return *m_h->m_ptr < *rkRight.m_h->m_ptr; }
238
244 template<typename T2>
245 eC_Bool operator!=(const CGUIRefCntPtr<T2>& rkRight) const
246 { return !(operator==(static_cast<T*>(rkRight.m_h->m_ptr))); }
247
253 eC_Bool operator!=(const T* pRight) const
254 { return !(operator==(pRight)); }
255
256private:
262 class Holder : public RefCounted
263 {
264 public:
265 Holder(T* ptr)
266 : RefCounted(), m_ptr(ptr)
267 { }
268
269 ~Holder()
270 { if (m_ptr) delete m_ptr; m_ptr = NULL; };
271
272 T* m_ptr;
273 };
274
278 Holder* m_h;
279};
280} // namespace NSmartPtr
281
282#endif // GUIREFCNTPTR_H__
The Guiliani reference counted pointer class.
Definition: GUIRefCntPtr.h:76
eC_Int GetNOFReferences() const
Definition: GUIRefCntPtr.h:106
T * Get() const
Definition: GUIRefCntPtr.h:195
eC_Bool operator!=(const CGUIRefCntPtr< T > &rkRight) const
Definition: GUIRefCntPtr.h:228
eC_Bool operator==(const T *pRight) const
Definition: GUIRefCntPtr.h:220
eC_Bool operator<(const CGUIRefCntPtr< T > &rkRight) const
Definition: GUIRefCntPtr.h:236
CGUIRefCntPtr(const CGUIRefCntPtr< T > &rkSource)
Definition: GUIRefCntPtr.h:96
eC_Bool operator==(const CGUIRefCntPtr< T2 > &rkRight) const
Definition: GUIRefCntPtr.h:212
CGUIRefCntPtr< T > & operator=(const CGUIRefCntPtr< T > &rkSource)
Definition: GUIRefCntPtr.h:168
CGUIRefCntPtr< T2 > StaticCast()
Definition: GUIRefCntPtr.h:125
CGUIRefCntPtr(T *p=(T *) 0)
Definition: GUIRefCntPtr.h:82
T * operator->() const
Definition: GUIRefCntPtr.h:180
~CGUIRefCntPtr()
Definition: GUIRefCntPtr.h:89
CGUIRefCntPtr< T2 > DynamicCast()
Definition: GUIRefCntPtr.h:148
eC_Bool operator!=(const CGUIRefCntPtr< T2 > &rkRight) const
Definition: GUIRefCntPtr.h:245
T & operator*() const
Definition: GUIRefCntPtr.h:187
eC_Bool IsUnique() const
Definition: GUIRefCntPtr.h:113
eC_Bool operator!=(const T *pRight) const
Definition: GUIRefCntPtr.h:253
eC_Bool operator==(const CGUIRefCntPtr< T > &rkRight) const
Definition: GUIRefCntPtr.h:203
The reference counted pointer class used with SharedPtr.
Definition: RefCounted.h:32
Contains pointer class templates.
Definition: GUIRefCntPtr.h:17