|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
|
2 // Use of this source code is governed by a BSD-style license that can be |
|
3 // found in the LICENSE file. |
|
4 |
|
5 #ifndef BASE_REFCOUNTED_H_ |
|
6 #define BASE_REFCOUNTED_H_ |
|
7 |
|
8 namespace base { |
|
9 |
|
10 template <typename T> |
|
11 class RefCounted { |
|
12 public: |
|
13 RefCounted() {} |
|
14 ~RefCounted() {} |
|
15 }; |
|
16 |
|
17 template <typename T> |
|
18 class RefCountedThreadSafe { |
|
19 public: |
|
20 RefCountedThreadSafe() {} |
|
21 ~RefCountedThreadSafe() {} |
|
22 }; |
|
23 |
|
24 } // namespace base |
|
25 |
|
26 // Ignore classes whose inheritance tree ends in WebKit's RefCounted base |
|
27 // class. Though prone to error, this pattern is very prevalent in WebKit |
|
28 // code, so do not issue any warnings. |
|
29 namespace WebKit { |
|
30 |
|
31 template <typename T> |
|
32 class RefCounted { |
|
33 public: |
|
34 RefCounted() {} |
|
35 ~RefCounted() {} |
|
36 }; |
|
37 |
|
38 } // namespace WebKit |
|
39 |
|
40 // Unsafe; should error. |
|
41 class PublicRefCountedDtorInHeader |
|
42 : public base::RefCounted<PublicRefCountedDtorInHeader> { |
|
43 public: |
|
44 PublicRefCountedDtorInHeader() {} |
|
45 ~PublicRefCountedDtorInHeader() {} |
|
46 |
|
47 private: |
|
48 friend class base::RefCounted<PublicRefCountedDtorInHeader>; |
|
49 }; |
|
50 |
|
51 // Unsafe; should error. |
|
52 class PublicRefCountedThreadSafeDtorInHeader |
|
53 : public base::RefCountedThreadSafe< |
|
54 PublicRefCountedThreadSafeDtorInHeader> { |
|
55 public: |
|
56 PublicRefCountedThreadSafeDtorInHeader() {} |
|
57 ~PublicRefCountedThreadSafeDtorInHeader() {} |
|
58 |
|
59 private: |
|
60 friend class base::RefCountedThreadSafe< |
|
61 PublicRefCountedThreadSafeDtorInHeader>; |
|
62 }; |
|
63 |
|
64 // Safe; should not have errors. |
|
65 class ProtectedRefCountedDtorInHeader |
|
66 : public base::RefCounted<ProtectedRefCountedDtorInHeader> { |
|
67 public: |
|
68 ProtectedRefCountedDtorInHeader() {} |
|
69 |
|
70 protected: |
|
71 ~ProtectedRefCountedDtorInHeader() {} |
|
72 |
|
73 private: |
|
74 friend class base::RefCounted<ProtectedRefCountedDtorInHeader>; |
|
75 }; |
|
76 |
|
77 // Safe; should not have errors. |
|
78 class PrivateRefCountedDtorInHeader |
|
79 : public base::RefCounted<PrivateRefCountedDtorInHeader> { |
|
80 public: |
|
81 PrivateRefCountedDtorInHeader() {} |
|
82 |
|
83 private: |
|
84 ~PrivateRefCountedDtorInHeader() {} |
|
85 friend class base::RefCounted<PrivateRefCountedDtorInHeader>; |
|
86 }; |
|
87 |
|
88 // Unsafe; A grandchild class ends up exposing their parent and grandparent's |
|
89 // destructors. |
|
90 class DerivedProtectedToPublicInHeader |
|
91 : public ProtectedRefCountedDtorInHeader { |
|
92 public: |
|
93 DerivedProtectedToPublicInHeader() {} |
|
94 ~DerivedProtectedToPublicInHeader() {} |
|
95 }; |
|
96 |
|
97 // Unsafe; A grandchild ends up implicitly exposing their parent and |
|
98 // grantparent's destructors. |
|
99 class ImplicitDerivedProtectedToPublicInHeader |
|
100 : public ProtectedRefCountedDtorInHeader { |
|
101 public: |
|
102 ImplicitDerivedProtectedToPublicInHeader() {} |
|
103 }; |
|
104 |
|
105 // Unsafe-but-ignored; should not have errors. |
|
106 class WebKitPublicDtorInHeader |
|
107 : public WebKit::RefCounted<WebKitPublicDtorInHeader> { |
|
108 public: |
|
109 WebKitPublicDtorInHeader() {} |
|
110 ~WebKitPublicDtorInHeader() {} |
|
111 }; |
|
112 |
|
113 // Unsafe-but-ignored; should not have errors. |
|
114 class WebKitDerivedPublicDtorInHeader |
|
115 : public WebKitPublicDtorInHeader { |
|
116 public: |
|
117 WebKitDerivedPublicDtorInHeader() {} |
|
118 ~WebKitDerivedPublicDtorInHeader() {} |
|
119 }; |
|
120 |
|
121 #endif // BASE_REFCOUNTED_H_ |