diff options
Diffstat (limited to 'brillo/bind_lambda.h')
-rw-r--r-- | brillo/bind_lambda.h | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/brillo/bind_lambda.h b/brillo/bind_lambda.h new file mode 100644 index 0000000..7ae692d --- /dev/null +++ b/brillo/bind_lambda.h @@ -0,0 +1,63 @@ +// Copyright 2014 The Chromium OS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef LIBCHROMEOS_BRILLO_BIND_LAMBDA_H_ +#define LIBCHROMEOS_BRILLO_BIND_LAMBDA_H_ + +#include <base/bind.h> + +//////////////////////////////////////////////////////////////////////////////// +// This file is an extension to base/bind_internal.h and adds a RunnableAdapter +// class specialization that wraps a functor (including lambda objects), so +// they can be used in base::Callback/base::Bind constructs. +// By including this file you will gain the ability to write expressions like: +// base::Callback<int(int)> callback = base::Bind([](int value) { +// return value * value; +// }); +//////////////////////////////////////////////////////////////////////////////// +namespace base { +namespace internal { + +// LambdaAdapter is a helper class that specializes on different function call +// signatures and provides the RunType and Run() method required by +// RunnableAdapter<> class. +template <typename Lambda, typename Sig> +class LambdaAdapter; + +// R(...) +template <typename Lambda, typename R, typename... Args> +class LambdaAdapter<Lambda, R(Lambda::*)(Args... args)> { + public: + typedef R(RunType)(Args...); + LambdaAdapter(Lambda lambda) : lambda_(lambda) {} + R Run(Args... args) { return lambda_(CallbackForward(args)...); } + + private: + Lambda lambda_; +}; + +// R(...) const +template <typename Lambda, typename R, typename... Args> +class LambdaAdapter<Lambda, R(Lambda::*)(Args... args) const> { + public: + typedef R(RunType)(Args...); + LambdaAdapter(Lambda lambda) : lambda_(lambda) {} + R Run(Args... args) { return lambda_(CallbackForward(args)...); } + + private: + Lambda lambda_; +}; + +template <typename Lambda> +class RunnableAdapter + : public LambdaAdapter<Lambda, decltype(&Lambda::operator())> { + public: + explicit RunnableAdapter(Lambda lambda) + : LambdaAdapter<Lambda, decltype(&Lambda::operator())>(lambda) {} +}; + +} // namespace internal +} // namespace base + +#endif // LIBCHROMEOS_BRILLO_BIND_LAMBDA_H_ |