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