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 // This file contains utility functions and classes that help the | 5 // This file contains utility functions and classes that help the |
6 // implementation, and management of the Callback objects. | 6 // implementation, and management of the Callback objects. |
7 | 7 |
8 #ifndef BASE_CALLBACK_INTERNAL_H_ | 8 #ifndef BASE_CALLBACK_INTERNAL_H_ |
9 #define BASE_CALLBACK_INTERNAL_H_ | 9 #define BASE_CALLBACK_INTERNAL_H_ |
10 #pragma once | 10 #pragma once |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 | 73 |
74 // Force the destructor to be instaniated inside this translation unit so | 74 // Force the destructor to be instaniated inside this translation unit so |
75 // that our subclasses will not get inlined versions. Avoids more template | 75 // that our subclasses will not get inlined versions. Avoids more template |
76 // bloat. | 76 // bloat. |
77 ~CallbackBase(); | 77 ~CallbackBase(); |
78 | 78 |
79 scoped_refptr<InvokerStorageBase> invoker_storage_; | 79 scoped_refptr<InvokerStorageBase> invoker_storage_; |
80 InvokeFuncStorage polymorphic_invoke_; | 80 InvokeFuncStorage polymorphic_invoke_; |
81 }; | 81 }; |
82 | 82 |
| 83 // This is a typetraits object that's used to take an argument type, and |
| 84 // extract a suitable type for storing and forwarding arguments. |
| 85 // |
| 86 // In particular, it strips off references, and converts arrays to |
| 87 // pointers for storage; and it avoids accidentally trying to create a |
| 88 // "reference of a reference" if the argument is a reference type. |
| 89 // |
| 90 // This array type becomes an issue for storage because we are passing bound |
| 91 // parameters by const reference. In this case, we end up passing an actual |
| 92 // array type in the initializer list which C++ does not allow. This will |
| 93 // break passing of C-string literals. |
| 94 template <typename T> |
| 95 struct ParamTraits { |
| 96 typedef const T& ForwardType; |
| 97 typedef T StorageType; |
| 98 }; |
| 99 |
| 100 // The Storage should almost be impossible to trigger unless someone manually |
| 101 // specifies type of the bind parameters. However, in case they do, |
| 102 // this will guard against us accidentally storing a reference parameter. |
| 103 // |
| 104 // The ForwardType should only be used for unbound arguments. |
| 105 template <typename T> |
| 106 struct ParamTraits<T&> { |
| 107 typedef T& ForwardType; |
| 108 typedef T StorageType; |
| 109 }; |
| 110 |
| 111 // Note that for array types, we implicitly add a const in the conversion. This |
| 112 // means that it is not possible to bind array arguments to functions that take |
| 113 // a non-const pointer. Trying to specialize the template based on a "const |
| 114 // T[n]" does not seem to match correctly, so we are stuck with this |
| 115 // restriction. |
| 116 template <typename T, size_t n> |
| 117 struct ParamTraits<T[n]> { |
| 118 typedef const T* ForwardType; |
| 119 typedef const T* StorageType; |
| 120 }; |
| 121 |
| 122 // See comment for ParamTraits<T[n]>. |
| 123 template <typename T> |
| 124 struct ParamTraits<T[]> { |
| 125 typedef const T* ForwardType; |
| 126 typedef const T* StorageType; |
| 127 }; |
| 128 |
83 } // namespace internal | 129 } // namespace internal |
84 } // namespace base | 130 } // namespace base |
85 | 131 |
86 #endif // BASE_CALLBACK_INTERNAL_H_ | 132 #endif // BASE_CALLBACK_INTERNAL_H_ |
OLD | NEW |