14 #ifndef T3_WIDGET_PTR_H 15 #define T3_WIDGET_PTR_H 25 void operator()(T* p) {
delete p; }
30 void operator()(T* p) {
delete [] p; }
33 template <
typename T =
void,
void (*f)(T *) = free>
35 void operator()(T *p) { f((T *) p); }
38 template <
typename T,
typename U, U (*f)(T *)>
40 void operator()(T *p) { f((T *) p); }
46 T* operator-> (
void)
const {
return p_; }
47 T& operator* (
void)
const {
return *p_; }
48 T* operator() (
void)
const {
return p_; }
49 operator T* (void) {
return p_; }
50 T*
get(void) {
return p_; }
64 #define _T3_WIDGET_TYPEDEF(name, ...) \ 65 class T3_WIDGET_API name { \ 67 typedef __VA_ARGS__ t; \ 81 #define _T3_WIDGET_DEFINE_CLEANUP_PTR \ 83 ~cleanup_ptr_base(void) { if (smartptr_base<T>::p_ != NULL) { D d; d(smartptr_base<T>::p_); } } \ 84 cleanup_ptr_base(void) {} \ 85 cleanup_ptr_base(T *p) { smartptr_base<T>::p_ = p; } \ 86 T** operator& (void) { return &smartptr_base<T>::p_; } \ 87 T* operator= (T *p) { \ 88 if (smartptr_base<T>::p_ == p) \ 90 if (smartptr_base<T>::p_ != NULL) { \ 92 d(smartptr_base<T>::p_); \ 94 return smartptr_base<T>::p_ = p; \ 96 T *release(void) { T *p = smartptr_base<T>::p_; smartptr_base<T>::p_ = NULL; return p; } \ 98 cleanup_ptr_base& operator= (const cleanup_ptr_base &p) { (void) p; return *this; } \ 99 cleanup_ptr_base(const cleanup_ptr_base &p) { (void) p; } 101 template <
typename T,
typename D>
103 _T3_WIDGET_DEFINE_CLEANUP_PTR
106 template <
typename T,
typename D>
108 _T3_WIDGET_DEFINE_CLEANUP_PTR
110 #undef _T3_WIDGET_DEFINE_CLEANUP_PTR 114 template <
typename T,
typename D = delete_functor<T> > _T3_WIDGET_TYPEDEF(cleanup_ptr,
cleanup_ptr_base<T, D>);
129 #define _T3_WIDGET_DEFINE_LINKED_PTR \ 131 linked_ptr_base(void) : next(this), prev(this) {} \ 132 linked_ptr_base(T *p) { set_p(p); } \ 133 linked_ptr_base(const linked_ptr_base &other) { link_p(other); } \ 134 ~linked_ptr_base(void) { set_p(NULL); } \ 135 linked_ptr_base& operator= (const linked_ptr_base &other) { link_p(other); return *this; } \ 136 T* operator= (T *p) { set_p(p); return smartptr_base<T>::p_; } \ 139 if (smartptr_base<T>::p_ == p) \ 141 if (smartptr_base<T>::p_ != NULL) { \ 142 if (next == this && prev == this) { \ 144 d(smartptr_base<T>::p_); \ 150 smartptr_base<T>::p_ = p; \ 154 void link_p(const linked_ptr_base &other) { \ 156 next = other.next->prev; \ 161 linked_ptr_base *next, *prev; \ 163 template <
typename T,
typename D>
165 _T3_WIDGET_DEFINE_LINKED_PTR
168 template <
typename T,
typename D>
170 _T3_WIDGET_DEFINE_LINKED_PTR
175 template <
typename T,
typename D = delete_functor<T> > _T3_WIDGET_TYPEDEF(linked_ptr,
linked_ptr_base<T, D>);
181 template <
typename T>
194 #undef _T3_WIDGET_TYPEDEF