18 #ifndef _DECAF_LANG_POINTER_H_
19 #define _DECAF_LANG_POINTER_H_
52 template<
typename T,
typename REFCOUNTER = decaf::util::concurrent::atomic::AtomicRefCounter>
56 typedef void (*deletionFuncPtr)(T* p);
63 deletionFuncPtr onDelete;
79 Pointer() : REFCOUNTER(), value(
NULL), onDelete(onDeleteFunc) {}
88 explicit Pointer(
const PointerType value) : REFCOUNTER(), value(value), onDelete(onDeleteFunc) {}
97 Pointer(
const Pointer& value) : REFCOUNTER(value), value(value.value), onDelete(onDeleteFunc) {}
106 template<
typename T1,
typename R1>
117 template<
typename T1,
typename R1>
119 REFCOUNTER(value), value(static_cast<T*> (value.
get())), onDelete(onDeleteFunc) {}
132 template<
typename T1,
typename R1>
134 REFCOUNTER(value), value(dynamic_cast<T*> (value.
get())), onDelete(onDeleteFunc) {
136 if (this->value ==
NULL) {
141 __FILE__, __LINE__,
"Failed to cast source pointer of type %s to this type: %s.",
142 typeid(T1).name(),
typeid(T).name());
147 if (REFCOUNTER::release() ==
true) {
148 onDelete(this->value);
175 T* temp = this->value;
208 if (
this == (
void*) &right) {
216 template<
typename T1,
typename R1>
218 if (
this == (
void*) &right) {
235 if (this->value ==
NULL) {
237 __FILE__, __LINE__,
"Pointer operator& - Pointee is NULL.");
240 return *(this->value);
243 if (this->value ==
NULL) {
245 __FILE__, __LINE__,
"Pointer operator& - Pointee is NULL.");
248 return *(this->value);
259 if (this->value ==
NULL) {
261 __FILE__, __LINE__,
"Pointer operator-> - Pointee is NULL.");
266 if (this->value ==
NULL) {
268 __FILE__, __LINE__,
"Pointer operator-> - Pointee is NULL.");
274 return this->value ==
NULL;
278 return left.
get() == right;
282 return left == right.
get();
286 return left.
get() != right;
290 return left != right.
get();
293 template<
typename T1,
typename R1>
295 return this->value == right.
get();
298 template<
typename T1,
typename R1>
300 return !(this->value == right.
get());
303 template<
typename T1>
308 template<
typename T1>
316 static void onDeleteFunc(T* value) {
323 template<
typename T,
typename R,
typename U>
325 return left.
get() == right;
329 template<
typename T,
typename R,
typename U>
331 return right.
get() == left;
335 template<
typename T,
typename R,
typename U>
337 return !(left.
get() == right);
341 template<
typename T,
typename R,
typename U>
343 return right.
get() != left;
347 template<
typename T,
typename R>
348 std::ostream& operator<<(std::ostream &out, const Pointer<T, R>& pointer) {
349 out << pointer.get();
365 template<
typename T,
typename R = decaf::util::concurrent::atomic::AtomicRefCounter>
374 return *left < *right;
379 return *left < *right ? -1 : *right < *left ? 1 : 0;
394 struct less<decaf::lang::Pointer<T> > {
401 return less<T*> ()(left.
get(), right.
get());