Changeset 11763 in webkit for trunk/JavaScriptCore/kxmlcore/PassRefPtr.h
- Timestamp:
- Dec 25, 2005, 1:22:35 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kxmlcore/PassRefPtr.h
r11727 r11763 28 28 template<typename T> class RefPtr; 29 29 template<typename T> class PassRefPtr; 30 31 // PassRefPtr_Ref class is a helper to allow proper passing of PassRefPtr by value but not by const 32 // reference 33 template<typename T> 34 struct PassRefPtr_Ref 35 { 36 T* m_ptr; 37 explicit PassRefPtr_Ref(T* p) : m_ptr(p) {} 38 }; 30 template <typename T> PassRefPtr<T> adoptRef(T *p); 39 31 40 32 template<typename T> … … 44 36 PassRefPtr() : m_ptr(0) {} 45 37 PassRefPtr(T *ptr) : m_ptr(ptr) { if (ptr) ptr->ref(); } 46 PassRefPtr(PassRefPtr& o) : m_ptr(o.release()) {} 47 template <typename U> PassRefPtr(PassRefPtr<U>& o) : m_ptr(o.release()) { } 38 // It somewhat breaks the type system to allow transfer of ownership out of 39 // a const PassRefPtr. However, it makes it much easier to work with PassRefPtr 40 // temporaries, and we don't really have a need to use real const PassRefPtrs 41 // anyway. 42 PassRefPtr(const PassRefPtr& o) : m_ptr(o.release()) {} 43 template <typename U> PassRefPtr(const PassRefPtr<U>& o) : m_ptr(o.release()) { } 48 44 49 45 ~PassRefPtr() { if (T *ptr = m_ptr) ptr->deref(); } … … 54 50 T *get() const { return m_ptr; } 55 51 56 T *release() { T *tmp = m_ptr; m_ptr = 0; return tmp; }52 T *release() const { T *tmp = m_ptr; m_ptr = 0; return tmp; } 57 53 58 template <typename U> static PassRefPtr<T> adopt(U* ptr)59 {60 PassRefPtr result((PassRefPtr_Ref<T>(ptr)));61 return result;62 }63 64 54 T& operator*() const { return *m_ptr; } 65 55 T *operator->() const { return m_ptr; } … … 72 62 73 63 PassRefPtr& operator=(T *); 74 PassRefPtr& operator=( PassRefPtr&);75 template <typename U> PassRefPtr& operator=( PassRefPtr<U>&);64 PassRefPtr& operator=(const PassRefPtr&); 65 template <typename U> PassRefPtr& operator=(const PassRefPtr<U>&); 76 66 template <typename U> PassRefPtr& operator=(const RefPtr<U>&); 77 67 78 PassRefPtr(PassRefPtr_Ref<T> ref) : m_ptr(ref.m_ptr) { } 79 80 PassRefPtr& operator=(PassRefPtr_Ref<T> ref) 81 { 82 if (m_ptr) 83 m_ptr->deref(); 84 m_ptr = ref.m_ptr; 85 return *this; 86 } 87 88 template <typename U> operator PassRefPtr_Ref<U>() { return PassRefPtr_Ref<U>(release()); } 89 template <typename U> operator PassRefPtr<U>() { return PassRefPtr_Ref<U>(release()); } 90 68 friend PassRefPtr adoptRef<T>(T *); 91 69 private: 92 T *m_ptr; 70 // adopting constructor 71 PassRefPtr(T *ptr, bool) : m_ptr(ptr) {} 72 mutable T *m_ptr; 93 73 }; 94 74 … … 114 94 } 115 95 116 template <typename T> inline PassRefPtr<T>& PassRefPtr<T>::operator=( PassRefPtr<T>& ref)96 template <typename T> inline PassRefPtr<T>& PassRefPtr<T>::operator=(const PassRefPtr<T>& ref) 117 97 { 118 98 T *optr = ref.release(); … … 123 103 } 124 104 125 template <typename T> template <typename U> inline PassRefPtr<T>& PassRefPtr<T>::operator=( PassRefPtr<U>& ref)105 template <typename T> template <typename U> inline PassRefPtr<T>& PassRefPtr<T>::operator=(const PassRefPtr<U>& ref) 126 106 { 127 107 T *optr = ref.release(); … … 182 162 } 183 163 164 template <typename T> inline PassRefPtr<T> adoptRef(T *p) 165 { 166 return PassRefPtr<T>(p, true); 167 } 168 184 169 template <typename T, typename U> inline PassRefPtr<T> static_pointer_cast(const PassRefPtr<U>& p) 185 170 { 186 return PassRefPtr<T>::adopt(static_cast<T *>(p.release()));171 return adoptRef(static_cast<T *>(p.release())); 187 172 } 188 173 189 174 template <typename T, typename U> inline PassRefPtr<T> const_pointer_cast(const PassRefPtr<U>& p) 190 175 { 191 return PassRefPtr<T>::adopt(const_cast<T *>(p.release())); 192 } 193 194 template <typename T> inline PassRefPtr<T> pass(T *ptr) 195 { 196 return PassRefPtr<T>(ptr); 197 } 198 199 template <typename T> inline PassRefPtr<T> pass(const RefPtr<T>& ptr) 200 { 201 return PassRefPtr<T>(ptr); 176 return adoptRef(const_cast<T *>(p.release())); 202 177 } 203 178 … … 205 180 206 181 using KXMLCore::PassRefPtr; 182 using KXMLCore::adoptRef; 207 183 using KXMLCore::static_pointer_cast; 208 184 using KXMLCore::const_pointer_cast; 209 using KXMLCore::pass;210 185 211 186 #endif // KXMLCORE_PASS_REF_PTR_H
Note:
See TracChangeset
for help on using the changeset viewer.