OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef BASE_ANDROID_SCOPED_JAVA_REF_H_ | 5 #ifndef BASE_ANDROID_SCOPED_JAVA_REF_H_ |
6 #define BASE_ANDROID_SCOPED_JAVA_REF_H_ | 6 #define BASE_ANDROID_SCOPED_JAVA_REF_H_ |
7 | 7 |
8 #include <jni.h> | 8 #include <jni.h> |
9 #include <stddef.h> | 9 #include <stddef.h> |
10 | 10 |
11 #include <type_traits> | 11 #include <type_traits> |
| 12 #include <utility> |
12 | 13 |
13 #include "base/base_export.h" | 14 #include "base/base_export.h" |
14 #include "base/logging.h" | 15 #include "base/logging.h" |
15 #include "base/macros.h" | 16 #include "base/macros.h" |
16 | 17 |
17 namespace base { | 18 namespace base { |
18 namespace android { | 19 namespace android { |
19 | 20 |
20 // Creates a new local reference frame, in which at least a given number of | 21 // Creates a new local reference frame, in which at least a given number of |
21 // local references can be created. Note that local references already created | 22 // local references can be created. Note that local references already created |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 // Takes ownership of the |obj| reference passed; requires it to be a local | 64 // Takes ownership of the |obj| reference passed; requires it to be a local |
64 // reference type. | 65 // reference type. |
65 #if DCHECK_IS_ON() | 66 #if DCHECK_IS_ON() |
66 // Implementation contains a DCHECK; implement out-of-line when DCHECK_IS_ON. | 67 // Implementation contains a DCHECK; implement out-of-line when DCHECK_IS_ON. |
67 JavaRef(JNIEnv* env, jobject obj); | 68 JavaRef(JNIEnv* env, jobject obj); |
68 #else | 69 #else |
69 // Don't add anything else here; it's inlined. | 70 // Don't add anything else here; it's inlined. |
70 JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {} | 71 JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {} |
71 #endif | 72 #endif |
72 | 73 |
| 74 void swap(JavaRef& other) { std::swap(obj_, other.obj_); } |
| 75 |
73 // The following are implementation detail convenience methods, for | 76 // The following are implementation detail convenience methods, for |
74 // use by the sub-classes. | 77 // use by the sub-classes. |
75 JNIEnv* SetNewLocalRef(JNIEnv* env, jobject obj); | 78 JNIEnv* SetNewLocalRef(JNIEnv* env, jobject obj); |
76 void SetNewGlobalRef(JNIEnv* env, jobject obj); | 79 void SetNewGlobalRef(JNIEnv* env, jobject obj); |
77 void ResetLocalRef(JNIEnv* env); | 80 void ResetLocalRef(JNIEnv* env); |
78 void ResetGlobalRef(); | 81 void ResetGlobalRef(); |
79 jobject ReleaseInternal(); | 82 jobject ReleaseInternal(); |
80 | 83 |
81 private: | 84 private: |
82 jobject obj_; | 85 jobject obj_; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 public: | 149 public: |
147 ScopedJavaLocalRef() : env_(nullptr) {} | 150 ScopedJavaLocalRef() : env_(nullptr) {} |
148 | 151 |
149 // Non-explicit copy constructor, to allow ScopedJavaLocalRef to be returned | 152 // Non-explicit copy constructor, to allow ScopedJavaLocalRef to be returned |
150 // by value as this is the normal usage pattern. | 153 // by value as this is the normal usage pattern. |
151 ScopedJavaLocalRef(const ScopedJavaLocalRef<T>& other) | 154 ScopedJavaLocalRef(const ScopedJavaLocalRef<T>& other) |
152 : env_(other.env_) { | 155 : env_(other.env_) { |
153 this->SetNewLocalRef(env_, other.obj()); | 156 this->SetNewLocalRef(env_, other.obj()); |
154 } | 157 } |
155 | 158 |
| 159 ScopedJavaLocalRef(ScopedJavaLocalRef<T>&& other) : env_(other.env_) { |
| 160 this->swap(other); |
| 161 } |
| 162 |
156 template <typename U> | 163 template <typename U> |
157 explicit ScopedJavaLocalRef(const U& other) : env_(nullptr) { | 164 explicit ScopedJavaLocalRef(const U& other) : env_(nullptr) { |
158 this->Reset(other); | 165 this->Reset(other); |
159 } | 166 } |
160 | 167 |
161 // Assumes that |obj| is a local reference to a Java object and takes | 168 // Assumes that |obj| is a local reference to a Java object and takes |
162 // ownership of this local reference. | 169 // ownership of this local reference. |
163 ScopedJavaLocalRef(JNIEnv* env, T obj) : JavaRef<T>(env, obj), env_(env) {} | 170 ScopedJavaLocalRef(JNIEnv* env, T obj) : JavaRef<T>(env, obj), env_(env) {} |
164 | 171 |
165 ~ScopedJavaLocalRef() { | 172 ~ScopedJavaLocalRef() { |
166 this->Reset(); | 173 this->Reset(); |
167 } | 174 } |
168 | 175 |
169 // Overloaded assignment operator defined for consistency with the implicit | 176 // Overloaded assignment operator defined for consistency with the implicit |
170 // copy constructor. | 177 // copy constructor. |
171 void operator=(const ScopedJavaLocalRef<T>& other) { | 178 void operator=(const ScopedJavaLocalRef<T>& other) { |
172 this->Reset(other); | 179 this->Reset(other); |
173 } | 180 } |
174 | 181 |
| 182 void operator=(ScopedJavaLocalRef<T>&& other) { |
| 183 env_ = other.env_; |
| 184 this->swap(other); |
| 185 } |
| 186 |
175 void Reset() { | 187 void Reset() { |
176 this->ResetLocalRef(env_); | 188 this->ResetLocalRef(env_); |
177 } | 189 } |
178 | 190 |
179 template<typename U> | 191 template<typename U> |
180 void Reset(const ScopedJavaLocalRef<U>& other) { | 192 void Reset(const ScopedJavaLocalRef<U>& other) { |
181 // We can copy over env_ here as |other| instance must be from the same | 193 // We can copy over env_ here as |other| instance must be from the same |
182 // thread as |this| local ref. (See class comment for multi-threading | 194 // thread as |this| local ref. (See class comment for multi-threading |
183 // limitations, and alternatives). | 195 // limitations, and alternatives). |
184 this->Reset(other.env_, other.obj()); | 196 this->Reset(other.env_, other.obj()); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 // imposed by the underlying Java object that it references). | 236 // imposed by the underlying Java object that it references). |
225 template<typename T> | 237 template<typename T> |
226 class ScopedJavaGlobalRef : public JavaRef<T> { | 238 class ScopedJavaGlobalRef : public JavaRef<T> { |
227 public: | 239 public: |
228 ScopedJavaGlobalRef() {} | 240 ScopedJavaGlobalRef() {} |
229 | 241 |
230 ScopedJavaGlobalRef(const ScopedJavaGlobalRef<T>& other) { | 242 ScopedJavaGlobalRef(const ScopedJavaGlobalRef<T>& other) { |
231 this->Reset(other); | 243 this->Reset(other); |
232 } | 244 } |
233 | 245 |
| 246 ScopedJavaGlobalRef(ScopedJavaGlobalRef<T>&& other) { this->swap(other); } |
| 247 |
234 ScopedJavaGlobalRef(JNIEnv* env, T obj) { this->Reset(env, obj); } | 248 ScopedJavaGlobalRef(JNIEnv* env, T obj) { this->Reset(env, obj); } |
235 | 249 |
236 template<typename U> | 250 template<typename U> |
237 explicit ScopedJavaGlobalRef(const U& other) { | 251 explicit ScopedJavaGlobalRef(const U& other) { |
238 this->Reset(other); | 252 this->Reset(other); |
239 } | 253 } |
240 | 254 |
241 ~ScopedJavaGlobalRef() { | 255 ~ScopedJavaGlobalRef() { |
242 this->Reset(); | 256 this->Reset(); |
243 } | 257 } |
244 | 258 |
245 // Overloaded assignment operator defined for consistency with the implicit | 259 // Overloaded assignment operator defined for consistency with the implicit |
246 // copy constructor. | 260 // copy constructor. |
247 void operator=(const ScopedJavaGlobalRef<T>& other) { | 261 void operator=(const ScopedJavaGlobalRef<T>& other) { |
248 this->Reset(other); | 262 this->Reset(other); |
249 } | 263 } |
250 | 264 |
| 265 void operator=(ScopedJavaGlobalRef<T>&& other) { this->swap(other); } |
| 266 |
251 void Reset() { | 267 void Reset() { |
252 this->ResetGlobalRef(); | 268 this->ResetGlobalRef(); |
253 } | 269 } |
254 | 270 |
255 template<typename U> | 271 template<typename U> |
256 void Reset(const U& other) { | 272 void Reset(const U& other) { |
257 this->Reset(nullptr, other.obj()); | 273 this->Reset(nullptr, other.obj()); |
258 } | 274 } |
259 | 275 |
260 template<typename U> | 276 template<typename U> |
(...skipping 29 matching lines...) Expand all Loading... |
290 private: | 306 private: |
291 T obj_; | 307 T obj_; |
292 | 308 |
293 DISALLOW_COPY_AND_ASSIGN(JavaRefOrBare); | 309 DISALLOW_COPY_AND_ASSIGN(JavaRefOrBare); |
294 }; | 310 }; |
295 | 311 |
296 } // namespace android | 312 } // namespace android |
297 } // namespace base | 313 } // namespace base |
298 | 314 |
299 #endif // BASE_ANDROID_SCOPED_JAVA_REF_H_ | 315 #endif // BASE_ANDROID_SCOPED_JAVA_REF_H_ |
OLD | NEW |