libweave: Copy bind_lambda into libweave To move dependency on libchromeos. BUG=brillo:1257 TEST=`FEATURES=test emerge-gizmo libweave buffet` Change-Id: If15432e3c40dfd5613df1b0f3c523d8c3f2457c4 Reviewed-on: https://chromium-review.googlesource.com/293612 Reviewed-by: Alex Vakulenko <avakulenko@chromium.org> Commit-Queue: Vitaly Buka <vitalybuka@chromium.org> Tested-by: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/libweave/src/bind_lambda.h b/libweave/src/bind_lambda.h new file mode 100644 index 0000000..bceacc5 --- /dev/null +++ b/libweave/src/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 LIBWEAVE_SRC_BIND_LAMBDA_H_ +#define LIBWEAVE_SRC_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 // LIBWEAVE_SRC_BIND_LAMBDA_H_
diff --git a/libweave/src/commands/command_manager_unittest.cc b/libweave/src/commands/command_manager_unittest.cc index 06e1f6c..5413c30 100644 --- a/libweave/src/commands/command_manager_unittest.cc +++ b/libweave/src/commands/command_manager_unittest.cc
@@ -7,9 +7,9 @@ #include <base/files/file_util.h> #include <base/files/scoped_temp_dir.h> #include <base/json/json_writer.h> -#include <chromeos/bind_lambda.h> #include <gtest/gtest.h> +#include "libweave/src/bind_lambda.h" #include "libweave/src/commands/unittest_utils.h" namespace weave {
diff --git a/libweave/src/device_registration_info.cc b/libweave/src/device_registration_info.cc index 0b155a4..a799c41 100644 --- a/libweave/src/device_registration_info.cc +++ b/libweave/src/device_registration_info.cc
@@ -15,13 +15,13 @@ #include <base/json/json_writer.h> #include <base/strings/string_number_conversions.h> #include <base/values.h> -#include <chromeos/bind_lambda.h> #include <chromeos/key_value_store.h> #include <chromeos/strings/string_utils.h> #include <weave/http_client.h> #include <weave/network.h> #include <weave/task_runner.h> +#include "libweave/src/bind_lambda.h" #include "libweave/src/commands/cloud_command_proxy.h" #include "libweave/src/commands/command_definition.h" #include "libweave/src/commands/command_manager.h"
diff --git a/libweave/src/device_registration_info_unittest.cc b/libweave/src/device_registration_info_unittest.cc index 5e368d3..75c812b 100644 --- a/libweave/src/device_registration_info_unittest.cc +++ b/libweave/src/device_registration_info_unittest.cc
@@ -7,11 +7,11 @@ #include <base/json/json_reader.h> #include <base/json/json_writer.h> #include <base/values.h> -#include <chromeos/bind_lambda.h> #include <chromeos/key_value_store.h> #include <gtest/gtest.h> #include <weave/mock_http_client.h> +#include "libweave/src/bind_lambda.h" #include "libweave/src/commands/command_manager.h" #include "libweave/src/commands/unittest_utils.h" #include "libweave/src/http_constants.h"
diff --git a/libweave/src/notification/xmpp_channel_unittest.cc b/libweave/src/notification/xmpp_channel_unittest.cc index 173600e..5a1b86d 100644 --- a/libweave/src/notification/xmpp_channel_unittest.cc +++ b/libweave/src/notification/xmpp_channel_unittest.cc
@@ -8,10 +8,11 @@ #include <queue> #include <base/test/simple_test_clock.h> -#include <chromeos/bind_lambda.h> #include <gtest/gtest.h> #include <weave/mock_task_runner.h> +#include "libweave/src/bind_lambda.h" + using testing::StrictMock; namespace weave {
diff --git a/libweave/src/notification/xmpp_iq_stanza_handler_unittest.cc b/libweave/src/notification/xmpp_iq_stanza_handler_unittest.cc index 2078a6a..b66fd50 100644 --- a/libweave/src/notification/xmpp_iq_stanza_handler_unittest.cc +++ b/libweave/src/notification/xmpp_iq_stanza_handler_unittest.cc
@@ -7,11 +7,11 @@ #include <map> #include <memory> -#include <chromeos/bind_lambda.h> #include <gmock/gmock.h> #include <gtest/gtest.h> #include <weave/mock_task_runner.h> +#include "libweave/src/bind_lambda.h" #include "libweave/src/notification/xml_node.h" #include "libweave/src/notification/xmpp_channel.h" #include "libweave/src/notification/xmpp_stream_parser.h"
diff --git a/libweave/src/privet/wifi_bootstrap_manager.cc b/libweave/src/privet/wifi_bootstrap_manager.cc index a3d6843..4a32fdc 100644 --- a/libweave/src/privet/wifi_bootstrap_manager.cc +++ b/libweave/src/privet/wifi_bootstrap_manager.cc
@@ -6,12 +6,12 @@ #include <base/logging.h> #include <base/memory/weak_ptr.h> -#include <chromeos/bind_lambda.h> #include <chromeos/key_value_store.h> #include <weave/enum_to_string.h> #include <weave/network.h> #include <weave/task_runner.h> +#include "libweave/src/bind_lambda.h" #include "libweave/src/privet/constants.h" namespace weave {
diff --git a/libweave/src/states/state_change_queue_unittest.cc b/libweave/src/states/state_change_queue_unittest.cc index 7c8d19b..7ebcd06 100644 --- a/libweave/src/states/state_change_queue_unittest.cc +++ b/libweave/src/states/state_change_queue_unittest.cc
@@ -4,9 +4,9 @@ #include "libweave/src/states/state_change_queue.h" -#include <chromeos/bind_lambda.h> #include <gtest/gtest.h> +#include "libweave/src/bind_lambda.h" #include "libweave/src/commands/unittest_utils.h" namespace weave {