diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-17 18:14:47 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-17 18:14:47 +0000 |
commit | 5b6c1a80d09f250f66070dba8dd8a05d38e74db2 (patch) | |
tree | 8bff607411dc0400581dd304c911b59ff80737df /base/task.h | |
parent | 04edc039a2f882ddc551265e51447cbd49e91211 (diff) | |
download | chromium_src-5b6c1a80d09f250f66070dba8dd8a05d38e74db2.zip chromium_src-5b6c1a80d09f250f66070dba8dd8a05d38e74db2.tar.gz chromium_src-5b6c1a80d09f250f66070dba8dd8a05d38e74db2.tar.bz2 |
Add a CallbackWithReturnValue as a convenient method of calling callback functions with no arguments and a return value. This is useful in calling all of the getters we have in the code, instead of creating wrapper functions that take a pointer argument.
Review URL: http://codereview.chromium.org/155630
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20975 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/task.h')
-rw-r--r-- | base/task.h | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/base/task.h b/base/task.h index 36bd43f..8b9ed07 100644 --- a/base/task.h +++ b/base/task.h @@ -503,6 +503,13 @@ inline CancelableTask* NewRunnableFunction(Function function, // CallbackRunner<Tuple2<int, string> >* callback = // NewCallback(obj, &Object::DoStuff); // callback->RunWithParams(MakeTuple(5, string("hello"))); +// +// There is also a 0-args version that returns a value. Example: +// int Object::GetNextInt(); +// CallbackWithReturnValue<int>::Type* callback = +// NewCallbackWithReturnValue(obj, &Object::GetNextInt); +// int next_int = callback->Run(); +// delete callback; // Base for all Callbacks that handles storage of the pointers. template <class T, typename Method> @@ -666,4 +673,34 @@ class UnboundMethod { Params p_; }; +// Return value implementation with no args. +template <typename ReturnValue> +struct CallbackWithReturnValue { + class Type { + public: + virtual ReturnValue Run() = 0; + }; +}; + +template <class T, typename Method, typename ReturnValue> +class CallbackWithReturnValueImpl + : public CallbackStorage<T, Method>, + public CallbackWithReturnValue<ReturnValue>::Type { + public: + CallbackWithReturnValueImpl(T* obj, Method meth) + : CallbackStorage<T, Method>(obj, meth) { } + + virtual ReturnValue Run() { + return (this->obj_->*(this->meth_))(); + } +}; + +template <class T, typename ReturnValue> +typename CallbackWithReturnValue<ReturnValue>::Type* +NewCallbackWithReturnValue(T* object, ReturnValue (T::*method)()) { + return new CallbackWithReturnValueImpl<T, ReturnValue (T::*)(), ReturnValue>( + object, method); +} + + #endif // BASE_TASK_H_ |