Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2011 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 33 #include "wtf/PassRefPtr.h" | 33 #include "wtf/PassRefPtr.h" |
| 34 #include "wtf/PtrUtil.h" | 34 #include "wtf/PtrUtil.h" |
| 35 #include "wtf/RefPtr.h" | 35 #include "wtf/RefPtr.h" |
| 36 #include "wtf/ThreadSafeRefCounted.h" | 36 #include "wtf/ThreadSafeRefCounted.h" |
| 37 #include "wtf/TypeTraits.h" | 37 #include "wtf/TypeTraits.h" |
| 38 #include "wtf/WeakPtr.h" | 38 #include "wtf/WeakPtr.h" |
| 39 #include <tuple> | 39 #include <tuple> |
| 40 #include <utility> | 40 #include <utility> |
| 41 | 41 |
| 42 namespace blink { | 42 namespace blink { |
| 43 template<typename T> class CrossThreadPersistent; | 43 template <typename T> class Member; |
| 44 } | 44 } |
| 45 | 45 |
| 46 namespace base { | 46 namespace base { |
| 47 | 47 |
| 48 template <typename T> | 48 template <typename T> |
| 49 struct IsWeakReceiver<WTF::WeakPtr<T>> : std::true_type {}; | 49 struct IsWeakReceiver<WTF::WeakPtr<T>> : std::true_type {}; |
| 50 | 50 |
| 51 } | 51 } |
| 52 | 52 |
| 53 namespace WTF { | 53 namespace WTF { |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 209 } | 209 } |
| 210 | 210 |
| 211 private: | 211 private: |
| 212 R(C::*m_function)(Parameters...); | 212 R(C::*m_function)(Parameters...); |
| 213 }; | 213 }; |
| 214 | 214 |
| 215 template <typename T> | 215 template <typename T> |
| 216 struct ParamStorageTraits { | 216 struct ParamStorageTraits { |
| 217 typedef T StorageType; | 217 typedef T StorageType; |
| 218 | 218 |
| 219 static_assert(!std::is_pointer<T>::value, "Raw pointer is not allowed to bin d into WTF::Function. Wrap it with either Persistent, WeakPersistent, CrossThrea dPersistent, CrossThreadWeakPersistent, RefPtr or unretained."); | |
|
sof
2016/06/24 11:37:19
Shouldn't the error message be mentioning wrapPers
tzik
2016/06/24 13:13:33
OK, replaced them to wrap*.
| |
| 220 static_assert(!IsSubclassOfTemplate<T, blink::Member>::value, "Member is not allowed to bind into WTF::Function. Wrap it with either Persistent, WeakPersist ent, CrossThreadPersistent or CrossThreadWeakPersistenst."); | |
|
sof
2016/06/24 11:37:19
Add a case for WeakMember<>?
tzik
2016/06/24 13:13:33
Done.
| |
| 221 | |
| 219 static StorageType wrap(const T& value) { return value; } // Copy. | 222 static StorageType wrap(const T& value) { return value; } // Copy. |
| 220 static StorageType wrap(T&& value) { return std::move(value); } | 223 static StorageType wrap(T&& value) { return std::move(value); } |
| 221 | 224 |
| 222 // Don't move out, because the functor may be called multiple times. | 225 // Don't move out, because the functor may be called multiple times. |
| 223 static const T& unwrap(const StorageType& value) { return value; } | 226 static const T& unwrap(const StorageType& value) { return value; } |
| 224 }; | 227 }; |
| 225 | 228 |
| 226 template <typename T> | 229 template <typename T> |
| 227 struct ParamStorageTraits<PassRefPtr<T>> { | 230 struct ParamStorageTraits<PassRefPtr<T>> { |
| 228 typedef RefPtr<T> StorageType; | 231 typedef RefPtr<T> StorageType; |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 258 }; | 261 }; |
| 259 | 262 |
| 260 template <typename T, FunctionThreadAffinity threadAffinity> | 263 template <typename T, FunctionThreadAffinity threadAffinity> |
| 261 struct ParamStorageTraits<UnretainedWrapper<T, threadAffinity>> { | 264 struct ParamStorageTraits<UnretainedWrapper<T, threadAffinity>> { |
| 262 typedef UnretainedWrapper<T, threadAffinity> StorageType; | 265 typedef UnretainedWrapper<T, threadAffinity> StorageType; |
| 263 | 266 |
| 264 static StorageType wrap(const UnretainedWrapper<T, threadAffinity>& value) { return value; } | 267 static StorageType wrap(const UnretainedWrapper<T, threadAffinity>& value) { return value; } |
| 265 static T* unwrap(const StorageType& value) { return value.value(); } | 268 static T* unwrap(const StorageType& value) { return value.value(); } |
| 266 }; | 269 }; |
| 267 | 270 |
| 268 template<typename T, bool isGarbageCollected> struct PointerParamStorageTraits; | |
| 269 | |
| 270 template<typename T> | |
| 271 struct PointerParamStorageTraits<T*, false> { | |
| 272 STATIC_ONLY(PointerParamStorageTraits); | |
| 273 using StorageType = T*; | |
| 274 | |
| 275 static StorageType wrap(T* value) { return value; } | |
| 276 static T* unwrap(const StorageType& value) { return value; } | |
| 277 }; | |
| 278 | |
| 279 template<typename T> | |
| 280 struct PointerParamStorageTraits<T*, true> { | |
| 281 STATIC_ONLY(PointerParamStorageTraits); | |
| 282 using StorageType = blink::CrossThreadPersistent<T>; | |
| 283 | |
| 284 static StorageType wrap(T* value) { return value; } | |
| 285 static T* unwrap(const StorageType& value) { return value.get(); } | |
| 286 }; | |
| 287 | |
| 288 template<typename T> | |
| 289 struct ParamStorageTraits<T*> : public PointerParamStorageTraits<T*, IsGarbageCo llectedType<T>::value> { | |
| 290 STATIC_ONLY(ParamStorageTraits); | |
| 291 }; | |
| 292 | |
| 293 template<typename, FunctionThreadAffinity threadAffinity = SameThreadAffinity> | 271 template<typename, FunctionThreadAffinity threadAffinity = SameThreadAffinity> |
| 294 class Function; | 272 class Function; |
| 295 | 273 |
| 296 template<FunctionThreadAffinity threadAffinity, typename R, typename... Args> | 274 template<FunctionThreadAffinity threadAffinity, typename R, typename... Args> |
| 297 class Function<R(Args...), threadAffinity> { | 275 class Function<R(Args...), threadAffinity> { |
| 298 USING_FAST_MALLOC(Function); | 276 USING_FAST_MALLOC(Function); |
| 299 WTF_MAKE_NONCOPYABLE(Function); | 277 WTF_MAKE_NONCOPYABLE(Function); |
| 300 public: | 278 public: |
| 301 virtual ~Function() { } | 279 virtual ~Function() { } |
| 302 virtual R operator()(Args... args) = 0; | 280 virtual R operator()(Args... args) = 0; |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 406 | 384 |
| 407 using WTF::passed; | 385 using WTF::passed; |
| 408 using WTF::unretained; | 386 using WTF::unretained; |
| 409 using WTF::crossThreadUnretained; | 387 using WTF::crossThreadUnretained; |
| 410 | 388 |
| 411 using WTF::Function; | 389 using WTF::Function; |
| 412 using WTF::SameThreadClosure; | 390 using WTF::SameThreadClosure; |
| 413 using WTF::CrossThreadClosure; | 391 using WTF::CrossThreadClosure; |
| 414 | 392 |
| 415 #endif // WTF_Functional_h | 393 #endif // WTF_Functional_h |
| OLD | NEW |