14 #ifndef T3_WIDGET_PTR_H
15 #define T3_WIDGET_PTR_H
23 void operator()(T* p) {
delete p; }
28 void operator()(T* p) {
delete [] p; }
31 template <
typename T =
void,
void (*f)(T *) = free>
33 void operator()(T *p) { f((T *) p); }
36 template <
typename T,
typename U, U (*f)(T *)>
38 void operator()(T *p) { f((T *) p); }
44 T* operator-> (
void)
const {
return p_; }
45 T& operator* (
void)
const {
return *p_; }
46 T* operator() (
void)
const {
return p_; }
47 operator T* (void) {
return p_; }
48 T*
get(void) {
return p_; }
62 #define _T3_WIDGET_TYPEDEF(name, ...) \
63 class T3_WIDGET_API name { \
65 typedef __VA_ARGS__ t; \
79 #define _T3_WIDGET_DEFINE_CLEANUP_PTR \
81 ~cleanup_ptr_base(void) { if (smartptr_base<T>::p_ != NULL) { D d; d(smartptr_base<T>::p_); } } \
82 cleanup_ptr_base(void) {} \
83 cleanup_ptr_base(T *p) { smartptr_base<T>::p_ = p; } \
84 T** operator& (void) { return &smartptr_base<T>::p_; } \
85 T* operator= (T *p) { \
86 if (smartptr_base<T>::p_ == p) \
88 if (smartptr_base<T>::p_ != NULL) { \
90 d(smartptr_base<T>::p_); \
92 return smartptr_base<T>::p_ = p; \
94 T *release(void) { T *p = smartptr_base<T>::p_; smartptr_base<T>::p_ = NULL; return p; } \
96 cleanup_ptr_base& operator= (const cleanup_ptr_base &p) { (void) p; return *this; } \
97 cleanup_ptr_base(const cleanup_ptr_base &p) { (void) p; }
99 template <
typename T,
typename D>
101 _T3_WIDGET_DEFINE_CLEANUP_PTR
104 template <
typename T,
typename D>
106 _T3_WIDGET_DEFINE_CLEANUP_PTR
108 #undef _T3_WIDGET_DEFINE_CLEANUP_PTR
112 template <
typename T,
typename D = delete_functor<T> > _T3_WIDGET_TYPEDEF(cleanup_ptr,
cleanup_ptr_base<T, D>);
127 #define _T3_WIDGET_DEFINE_LINKED_PTR \
129 linked_ptr_base(void) : next(this), prev(this) {} \
130 linked_ptr_base(T *p) { set_p(p); } \
131 linked_ptr_base(const linked_ptr_base &other) { link_p(other); } \
132 ~linked_ptr_base(void) { set_p(NULL); } \
133 linked_ptr_base& operator= (const linked_ptr_base &other) { link_p(other); return *this; } \
134 T* operator= (T *p) { set_p(p); return smartptr_base<T>::p_; } \
137 if (smartptr_base<T>::p_ == p) \
139 if (smartptr_base<T>::p_ != NULL) { \
140 if (next == this && prev == this) { \
142 d(smartptr_base<T>::p_); \
148 smartptr_base<T>::p_ = p; \
152 void link_p(const linked_ptr_base &other) { \
154 next = other.next->prev; \
159 linked_ptr_base *next, *prev; \
161 template <
typename T,
typename D>
163 _T3_WIDGET_DEFINE_LINKED_PTR
166 template <
typename T,
typename D>
168 _T3_WIDGET_DEFINE_LINKED_PTR
173 template <
typename T,
typename D = delete_functor<T> > _T3_WIDGET_TYPEDEF(linked_ptr,
linked_ptr_base<T, D>);
179 template <
typename T>
192 #undef _T3_WIDGET_TYPEDEF