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 |