66 static X* apply(
const X* x) {
return x->clone();}
77 static X* apply(
const X* x) {
return new X(*x); }
81 #ifndef NO_MEMBER_TEMPLATES
83 #define CLONED_PTR_TEMPLATE_MEMBERS(CLONED_PTR_TYPE) \
85 template <class Y> CLONED_PTR_TYPE(const CLONED_PTR_TYPE<Y>& r) \
87 template <class Y> CLONED_PTR_TYPE& operator=(const CLONED_PTR_TYPE<Y>& r) \
98 #define CLONED_PTR_TEMPLATE_MEMBERS(CLONED_PTR_TYPE)
104 #define CLONED_PTR_DECLARE(CLONED_PTR_TYPE,CLONED_PTR_INIT) \
106 template <class X, class Cloner = CLONED_PTR_INIT<X> > class CLONED_PTR_TYPE \
109 typedef X element_type; \
111 explicit CLONED_PTR_TYPE(X* p = 0) : ptr(p) {} \
112 ~CLONED_PTR_TYPE() {delete ptr;} \
113 CLONED_PTR_TYPE(const CLONED_PTR_TYPE& r) {copy(r.ptr);} \
115 CLONED_PTR_TYPE& operator=(const CLONED_PTR_TYPE& r) \
132 CLONED_PTR_TEMPLATE_MEMBERS(CLONED_PTR_TYPE) \
134 const X& operator*() const {return *ptr;} \
135 X& operator*() {return *ptr;} \
137 const X* operator->() const {return ptr;} \
138 X* operator->() {return ptr;} \
140 bool null() const { return ptr == NULL; } \
142 const X* get_ptr() const { return ptr; } \
143 X* get_ptr() { return ptr; } \
148 void copy(X* p) {ptr = (p ? Cloner::apply(p) : 0);} \
162 #endif // CLONED_PTR_H