diff options
author | ajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-24 02:02:17 +0000 |
---|---|---|
committer | ajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-24 02:02:17 +0000 |
commit | c18b1056be790c55f10e407a1f6a3706bff7df03 (patch) | |
tree | 7ed333791fc8dfeaef29c07307e8efcfa1b44fba /base/bind_helpers.h | |
parent | b2e900f755ea4e66b5f41413716ecb55720e354d (diff) | |
download | chromium_src-c18b1056be790c55f10e407a1f6a3706bff7df03.zip chromium_src-c18b1056be790c55f10e407a1f6a3706bff7df03.tar.gz chromium_src-c18b1056be790c55f10e407a1f6a3706bff7df03.tar.bz2 |
Callback support for unbound reference and array arguments.
Because the callback object uses const An& for the type of the Run() function in argument forwarding, the code breaks for An=T& or An=T[]. This CL adds in code to modify the parameter type to remove duplicate references, and other fun.
BUG=35223
TEST=new unittests
Review URL: http://codereview.chromium.org/6718021
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@79239 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/bind_helpers.h')
-rw-r--r-- | base/bind_helpers.h | 43 |
1 files changed, 5 insertions, 38 deletions
diff --git a/base/bind_helpers.h b/base/bind_helpers.h index c1ca3d7..92194e7 100644 --- a/base/bind_helpers.h +++ b/base/bind_helpers.h @@ -161,7 +161,11 @@ struct UnsafeBindtoRefCountedArgHelper<true, T> }; template <typename T> -struct UnsafeBindtoRefCountedArg +struct UnsafeBindtoRefCountedArg : false_type { +}; + +template <typename T> +struct UnsafeBindtoRefCountedArg<T*> : UnsafeBindtoRefCountedArgHelper<is_class<T>::value, T> { }; @@ -233,43 +237,6 @@ struct MaybeRefcount<base::true_type, const T*> { static void Release(const T* o) { o->Release(); } }; - -// This is a typetraits object that's used to convert an argument type into a -// type suitable for storage. In particular, it strips off references, and -// converts arrays to pointers. -// -// This array type becomes an issue because we are passing bound parameters by -// const reference. In this case, we end up passing an actual array type in the -// initializer list which C++ does not allow. This will break passing of -// C-string literals. -template <typename T> -struct BindType { - typedef T StorageType; -}; - -// This should almost be impossible to trigger unless someone manually -// specifies type of the bind parameters. However, in case they do, -// this will guard against us accidentally storing a reference parameter. -template <typename T> -struct BindType<T&> { - typedef T StorageType; -}; - -// Note that for array types, we implicitly add a const in the conversion. This -// means that it is not possible to bind array arguments to functions that take -// a non-const pointer. Trying to specialize the template based on a "const -// T[n]" does not seem to match correctly, so we are stuck with this -// restriction. -template <typename T, size_t n> -struct BindType<T[n]> { - typedef const T* StorageType; -}; - -template <typename T> -struct BindType<T[]> { - typedef const T* StorageType; -}; - } // namespace internal template <typename T> |