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 {