| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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_BIND_INTERNAL_H_ | 5 #ifndef BASE_BIND_INTERNAL_H_ |
| 6 #define BASE_BIND_INTERNAL_H_ | 6 #define BASE_BIND_INTERNAL_H_ |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 | 9 |
| 10 #include <type_traits> | 10 #include <type_traits> |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 // Invoker<> -- Unwraps the curried parameters and executes the Runnable. | 61 // Invoker<> -- Unwraps the curried parameters and executes the Runnable. |
| 62 // BindState<> -- Stores the curried parameters, and is the main entry point | 62 // BindState<> -- Stores the curried parameters, and is the main entry point |
| 63 // into the Bind() system, doing most of the type resolution. | 63 // into the Bind() system, doing most of the type resolution. |
| 64 // There are ARITY BindState types. | 64 // There are ARITY BindState types. |
| 65 | 65 |
| 66 // HasNonConstReferenceParam selects true_type when any of the parameters in | 66 // HasNonConstReferenceParam selects true_type when any of the parameters in |
| 67 // |Sig| is a non-const reference. | 67 // |Sig| is a non-const reference. |
| 68 // Implementation note: This non-specialized case handles zero-arity case only. | 68 // Implementation note: This non-specialized case handles zero-arity case only. |
| 69 // Non-zero-arity cases should be handled by the specialization below. | 69 // Non-zero-arity cases should be handled by the specialization below. |
| 70 template <typename List> | 70 template <typename List> |
| 71 struct HasNonConstReferenceItem : false_type {}; | 71 struct HasNonConstReferenceItem : std::false_type {}; |
| 72 | 72 |
| 73 // Implementation note: Select true_type if the first parameter is a non-const | 73 // Implementation note: Select true_type if the first parameter is a non-const |
| 74 // reference. Otherwise, skip the first parameter and check rest of parameters | 74 // reference. Otherwise, skip the first parameter and check rest of parameters |
| 75 // recursively. | 75 // recursively. |
| 76 template <typename T, typename... Args> | 76 template <typename T, typename... Args> |
| 77 struct HasNonConstReferenceItem<TypeList<T, Args...>> | 77 struct HasNonConstReferenceItem<TypeList<T, Args...>> |
| 78 : std::conditional<is_non_const_reference<T>::value, | 78 : std::conditional<is_non_const_reference<T>::value, |
| 79 true_type, | 79 std::true_type, |
| 80 HasNonConstReferenceItem<TypeList<Args...>>>::type {}; | 80 HasNonConstReferenceItem<TypeList<Args...>>>::type {}; |
| 81 | 81 |
| 82 // HasRefCountedTypeAsRawPtr selects true_type when any of the |Args| is a raw | 82 // HasRefCountedTypeAsRawPtr selects true_type when any of the |Args| is a raw |
| 83 // pointer to a RefCounted type. | 83 // pointer to a RefCounted type. |
| 84 // Implementation note: This non-specialized case handles zero-arity case only. | 84 // Implementation note: This non-specialized case handles zero-arity case only. |
| 85 // Non-zero-arity cases should be handled by the specialization below. | 85 // Non-zero-arity cases should be handled by the specialization below. |
| 86 template <typename... Args> | 86 template <typename... Args> |
| 87 struct HasRefCountedTypeAsRawPtr : false_type {}; | 87 struct HasRefCountedTypeAsRawPtr : std::false_type {}; |
| 88 | 88 |
| 89 // Implementation note: Select true_type if the first parameter is a raw pointer | 89 // Implementation note: Select true_type if the first parameter is a raw pointer |
| 90 // to a RefCounted type. Otherwise, skip the first parameter and check rest of | 90 // to a RefCounted type. Otherwise, skip the first parameter and check rest of |
| 91 // parameters recursively. | 91 // parameters recursively. |
| 92 template <typename T, typename... Args> | 92 template <typename T, typename... Args> |
| 93 struct HasRefCountedTypeAsRawPtr<T, Args...> | 93 struct HasRefCountedTypeAsRawPtr<T, Args...> |
| 94 : std::conditional<NeedsScopedRefptrButGetsRawPtr<T>::value, | 94 : std::conditional<NeedsScopedRefptrButGetsRawPtr<T>::value, |
| 95 true_type, | 95 std::true_type, |
| 96 HasRefCountedTypeAsRawPtr<Args...>>::type {}; | 96 HasRefCountedTypeAsRawPtr<Args...>>::type {}; |
| 97 | 97 |
| 98 // BindsArrayToFirstArg selects true_type when |is_method| is true and the first | 98 // BindsArrayToFirstArg selects true_type when |is_method| is true and the first |
| 99 // item of |Args| is an array type. | 99 // item of |Args| is an array type. |
| 100 // Implementation note: This non-specialized case handles !is_method case and | 100 // Implementation note: This non-specialized case handles !is_method case and |
| 101 // zero-arity case only. Other cases should be handled by the specialization | 101 // zero-arity case only. Other cases should be handled by the specialization |
| 102 // below. | 102 // below. |
| 103 template <bool is_method, typename... Args> | 103 template <bool is_method, typename... Args> |
| 104 struct BindsArrayToFirstArg : false_type {}; | 104 struct BindsArrayToFirstArg : std::false_type {}; |
| 105 | 105 |
| 106 template <typename T, typename... Args> | 106 template <typename T, typename... Args> |
| 107 struct BindsArrayToFirstArg<true, T, Args...> | 107 struct BindsArrayToFirstArg<true, T, Args...> |
| 108 : is_array<typename std::remove_reference<T>::type> {}; | 108 : std::is_array<typename std::remove_reference<T>::type> {}; |
| 109 | 109 |
| 110 // HasRefCountedParamAsRawPtr is the same to HasRefCountedTypeAsRawPtr except | 110 // HasRefCountedParamAsRawPtr is the same to HasRefCountedTypeAsRawPtr except |
| 111 // when |is_method| is true HasRefCountedParamAsRawPtr skips the first argument. | 111 // when |is_method| is true HasRefCountedParamAsRawPtr skips the first argument. |
| 112 // Implementation note: This non-specialized case handles !is_method case and | 112 // Implementation note: This non-specialized case handles !is_method case and |
| 113 // zero-arity case only. Other cases should be handled by the specialization | 113 // zero-arity case only. Other cases should be handled by the specialization |
| 114 // below. | 114 // below. |
| 115 template <bool is_method, typename... Args> | 115 template <bool is_method, typename... Args> |
| 116 struct HasRefCountedParamAsRawPtr : HasRefCountedTypeAsRawPtr<Args...> {}; | 116 struct HasRefCountedParamAsRawPtr : HasRefCountedTypeAsRawPtr<Args...> {}; |
| 117 | 117 |
| 118 template <typename T, typename... Args> | 118 template <typename T, typename... Args> |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 R (*function_)(Args...); | 163 R (*function_)(Args...); |
| 164 }; | 164 }; |
| 165 | 165 |
| 166 // Method. | 166 // Method. |
| 167 template <typename R, typename T, typename... Args> | 167 template <typename R, typename T, typename... Args> |
| 168 class RunnableAdapter<R(T::*)(Args...)> { | 168 class RunnableAdapter<R(T::*)(Args...)> { |
| 169 public: | 169 public: |
| 170 // MSVC 2013 doesn't support Type Alias of function types. | 170 // MSVC 2013 doesn't support Type Alias of function types. |
| 171 // Revisit this after we update it to newer version. | 171 // Revisit this after we update it to newer version. |
| 172 typedef R RunType(T*, Args...); | 172 typedef R RunType(T*, Args...); |
| 173 using IsMethod = true_type; | 173 using IsMethod = std::true_type; |
| 174 | 174 |
| 175 explicit RunnableAdapter(R(T::*method)(Args...)) | 175 explicit RunnableAdapter(R(T::*method)(Args...)) |
| 176 : method_(method) { | 176 : method_(method) { |
| 177 } | 177 } |
| 178 | 178 |
| 179 template <typename... RunArgs> | 179 template <typename... RunArgs> |
| 180 R Run(T* object, RunArgs&&... args) { | 180 R Run(T* object, RunArgs&&... args) { |
| 181 return (object->*method_)(std::forward<RunArgs>(args)...); | 181 return (object->*method_)(std::forward<RunArgs>(args)...); |
| 182 } | 182 } |
| 183 | 183 |
| 184 private: | 184 private: |
| 185 R (T::*method_)(Args...); | 185 R (T::*method_)(Args...); |
| 186 }; | 186 }; |
| 187 | 187 |
| 188 // Const Method. | 188 // Const Method. |
| 189 template <typename R, typename T, typename... Args> | 189 template <typename R, typename T, typename... Args> |
| 190 class RunnableAdapter<R(T::*)(Args...) const> { | 190 class RunnableAdapter<R(T::*)(Args...) const> { |
| 191 public: | 191 public: |
| 192 using RunType = R(const T*, Args...); | 192 using RunType = R(const T*, Args...); |
| 193 using IsMethod = true_type; | 193 using IsMethod = std::true_type; |
| 194 | 194 |
| 195 explicit RunnableAdapter(R(T::*method)(Args...) const) | 195 explicit RunnableAdapter(R(T::*method)(Args...) const) |
| 196 : method_(method) { | 196 : method_(method) { |
| 197 } | 197 } |
| 198 | 198 |
| 199 template <typename... RunArgs> | 199 template <typename... RunArgs> |
| 200 R Run(const T* object, RunArgs&&... args) { | 200 R Run(const T* object, RunArgs&&... args) { |
| 201 return (object->*method_)(std::forward<RunArgs>(args)...); | 201 return (object->*method_)(std::forward<RunArgs>(args)...); |
| 202 } | 202 } |
| 203 | 203 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 } | 315 } |
| 316 }; | 316 }; |
| 317 | 317 |
| 318 #if !defined(_MSC_VER) | 318 #if !defined(_MSC_VER) |
| 319 | 319 |
| 320 template <typename ReturnType, typename Runnable> | 320 template <typename ReturnType, typename Runnable> |
| 321 struct InvokeHelper<true, ReturnType, Runnable> { | 321 struct InvokeHelper<true, ReturnType, Runnable> { |
| 322 // WeakCalls are only supported for functions with a void return type. | 322 // WeakCalls are only supported for functions with a void return type. |
| 323 // Otherwise, the function result would be undefined if the the WeakPtr<> | 323 // Otherwise, the function result would be undefined if the the WeakPtr<> |
| 324 // is invalidated. | 324 // is invalidated. |
| 325 static_assert(is_void<ReturnType>::value, | 325 static_assert(std::is_void<ReturnType>::value, |
| 326 "weak_ptrs can only bind to methods without return values"); | 326 "weak_ptrs can only bind to methods without return values"); |
| 327 }; | 327 }; |
| 328 | 328 |
| 329 #endif | 329 #endif |
| 330 | 330 |
| 331 // Invoker<> | 331 // Invoker<> |
| 332 // | 332 // |
| 333 // See description at the top of the file. | 333 // See description at the top of the file. |
| 334 template <typename BoundIndices, typename StorageType, | 334 template <typename BoundIndices, typename StorageType, |
| 335 typename InvokeHelperType, typename UnboundForwardRunType> | 335 typename InvokeHelperType, typename UnboundForwardRunType> |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 | 433 |
| 434 static void Destroy(BindStateBase* self) { | 434 static void Destroy(BindStateBase* self) { |
| 435 delete static_cast<BindState*>(self); | 435 delete static_cast<BindState*>(self); |
| 436 } | 436 } |
| 437 }; | 437 }; |
| 438 | 438 |
| 439 } // namespace internal | 439 } // namespace internal |
| 440 } // namespace base | 440 } // namespace base |
| 441 | 441 |
| 442 #endif // BASE_BIND_INTERNAL_H_ | 442 #endif // BASE_BIND_INTERNAL_H_ |
| OLD | NEW |