| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 2005, 2006, 2008 Apple Inc. All rights reserved. | |
| 3 * | |
| 4 * This library is free software; you can redistribute it and/or | |
| 5 * modify it under the terms of the GNU Library General Public | |
| 6 * License as published by the Free Software Foundation; either | |
| 7 * version 2 of the License, or (at your option) any later version. | |
| 8 * | |
| 9 * This library is distributed in the hope that it will be useful, | |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 12 * Library General Public License for more details. | |
| 13 * | |
| 14 * You should have received a copy of the GNU Library General Public License | |
| 15 * along with this library; see the file COPYING.LIB. If not, write to | |
| 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
| 17 * Boston, MA 02110-1301, USA. | |
| 18 * | |
| 19 */ | |
| 20 | |
| 21 #ifndef WTF_ListRefPtr_h | |
| 22 #define WTF_ListRefPtr_h | |
| 23 | |
| 24 #include <wtf/RefPtr.h> | |
| 25 | |
| 26 namespace WTF { | |
| 27 | |
| 28 // Specialized version of RefPtr desgined for use in singly-linked lists. | |
| 29 // Derefs the list iteratively to avoid recursive derefing that can overflow
the stack. | |
| 30 template <typename T> class ListRefPtr : public RefPtr<T> { | |
| 31 public: | |
| 32 ListRefPtr() : RefPtr<T>() {} | |
| 33 ListRefPtr(T* ptr) : RefPtr<T>(ptr) {} | |
| 34 ListRefPtr(const RefPtr<T>& o) : RefPtr<T>(o) {} | |
| 35 // see comment in PassRefPtr.h for why this takes const reference | |
| 36 template <typename U> ListRefPtr(const PassRefPtr<U>& o) : RefPtr<T>(o)
{} | |
| 37 | |
| 38 ~ListRefPtr() | |
| 39 { | |
| 40 RefPtr<T> reaper = this->release(); | |
| 41 while (reaper && reaper->hasOneRef()) | |
| 42 reaper = reaper->releaseNext(); // implicitly protects reaper->n
ext, then derefs reaper | |
| 43 } | |
| 44 | |
| 45 ListRefPtr& operator=(T* optr) { RefPtr<T>::operator=(optr); return *thi
s; } | |
| 46 ListRefPtr& operator=(const RefPtr<T>& o) { RefPtr<T>::operator=(o); ret
urn *this; } | |
| 47 ListRefPtr& operator=(const PassRefPtr<T>& o) { RefPtr<T>::operator=(o);
return *this; } | |
| 48 template <typename U> ListRefPtr& operator=(const RefPtr<U>& o) { RefPtr
<T>::operator=(o); return *this; } | |
| 49 template <typename U> ListRefPtr& operator=(const PassRefPtr<U>& o) { Re
fPtr<T>::operator=(o); return *this; } | |
| 50 }; | |
| 51 | |
| 52 template <typename T> inline T* getPtr(const ListRefPtr<T>& p) | |
| 53 { | |
| 54 return p.get(); | |
| 55 } | |
| 56 | |
| 57 } // namespace WTF | |
| 58 | |
| 59 using WTF::ListRefPtr; | |
| 60 | |
| 61 #endif // WTF_ListRefPtr_h | |
| OLD | NEW |