10 #if FE_CODEGEN<=FE_DEBUG 11 #define FE_PTR_NULL_CHECK TRUE 13 #define FE_PTR_NULL_CHECK FALSE 16 #define FE_PTR_STACK_CHECK FE_CHECK_HEAP 18 #if FE_CODEGEN<FE_DEBUG 19 #define FE_PTR_TRACK TRUE 21 #define FE_PTR_TRACK FALSE 24 #define FE_PTR_DEBUG FALSE 29 template<
typename T>
class hp;
56 sp(
void): m_tPtr(NULL) {}
58 explicit sp(T* pT): m_tPtr(pT)
60 #if FE_PTR_STACK_CHECK 61 if(pT && !Memory::isHeapOrCannotTell(pT))
62 feX((
"fe::sp< "+FE_TYPESTRING(T)+
" >::sp").c_str(),
63 "attempt to reference stack value");
73 rspT.m_tPtr->acquire();
79 sp(
const sp<X>& rspX): m_tPtr(NULL)
83 sp(
const hp<X>& rhpX): m_tPtr(NULL)
84 { operator=(rhpX.
object()); }
97 sp<T> &operator=(T* pT)
101 #if FE_PTR_STACK_CHECK 102 if(pT && !Memory::isHeapOrCannotTell(pT))
104 feX((
"fe::sp< "+FE_TYPESTRING(T)+
105 " >::operator=").c_str(),
106 "attempt to reference stack value");
122 if(rspT.raw() != raw())
125 rspT.m_tPtr->acquire();
129 m_tPtr = rspT.m_tPtr;
139 T* pT=fe_cast<T>(rspX.raw());
141 if(!pT && rspX.raw())
143 feLog(
"[33m>> sp<%s> could not convert %p" 144 " from \"%s\" [0m\n",
145 FE_TYPESTRING(T).c_str(),
147 FE_TYPESTRING(X).c_str());
150 return operator=(pT);
152 return operator=(fe_cast<T>(rspX.raw()));
159 return (fe_cast<X>(raw()) != NULL);
175 #if FE_PTR_NULL_CHECK 177 feX((
"fe::sp< "+FE_TYPESTRING(T)+
178 " >::operator*").c_str(),
179 "attempt to dereference invalid sp<>");
185 const T& operator*(
void)
const 187 #if FE_PTR_NULL_CHECK 189 feX((
"fe::sp< "+FE_TYPESTRING(T)+
190 " >::operator*").c_str(),
191 "attempt to dereference invalid sp<>");
197 T* operator->(
void)
const 199 #if FE_PTR_NULL_CHECK 201 feX((
"fe::sp< "+FE_TYPESTRING(T)+
202 " >::operator->").c_str(),
203 (
"attempt to use invalid sp<"+
204 FE_TYPESTRING(T)+
">").c_str());
211 #if FE_PTR_NULL_CHECK 213 feX((
"fe::sp< "+FE_TYPESTRING(T)+
214 " >::abandon").c_str(),
215 (
"attempt to use invalid sp<"+
216 FE_TYPESTRING(T)+
">").c_str());
225 T* raw(
void)
const {
return m_tPtr; }
226 BWORD isValid(
void)
const {
return m_tPtr != NULL; }
227 BWORD isNull(
void)
const {
return m_tPtr == NULL; }
232 virtual void track(
void)
236 m_tPtr->trackReference(
this,
"sp<> "+m_tPtr->name());
243 m_tPtr->untrackReference(
this);
248 void untrack(
void) {}
254 template <
class T,
class X>
257 return (rspLeft.raw() ==
sp<T>(rspRight).raw());
261 template <
class T,
class X>
264 return (rspLeft.raw() !=
sp<T>(rspRight).raw());
269 template <
class T,
class X>
270 inline BWORD operator<(const sp<T>& rspLeft,
const sp<X>& rspRight)
272 return (FE_UWORD)(rspLeft.raw()) < (FE_UWORD)(
sp<T>(rspRight).raw());
278 FE_UWORD operator()(
const sp<T>& rspT)
const 279 {
return reinterpret_cast<FE_UWORD
>(rspT.raw()); }
285 bool operator()(
const sp<T>& rspT1,
const sp<T>& rspT2)
const 286 {
return rspT1 == rspT2; }
289 template<
typename T,
typename U>
290 class AutoHashMap< sp<T>, U >:
291 public HashMap< sp<T>, U, hash_sp<T>, eq_sp<T> > {};
BWORD operator!=(const sp< T > &rspLeft, const sp< X > &rspRight)
Definition: ptr.h:262
kernel
Definition: namespace.dox:3
BWORD operator==(const sp< T > &rspLeft, const sp< X > &rspRight)
Definition: ptr.h:255
sp< T > object(void) const
Returns a smart pointer of the same templated type.
Definition: Handled.h:176
Safe handle for shared pointer.
Definition: Handled.h:61
Intrusive Smart Pointer.
Definition: ptr.h:53