Remove Bind and Callback.

Uses std::function instead.

Had to work around being unable to bind unique_ptr once in setup.cc, but
otherwise this was straightforward.

Change-Id: I0a5380412b5eba602d4e26ffc2cc1e5f1c2e525c
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/6100
Reviewed-by: Scott Graham <scottmg@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/base/bind.h b/base/bind.h
deleted file mode 100644
index 71df0fe..0000000
--- a/base/bind.h
+++ /dev/null
@@ -1,457 +0,0 @@
-// Copyright (c) 2011 The Chromium 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 BASE_BIND_H_
-#define BASE_BIND_H_
-
-#include <utility>
-
-#include "base/bind_internal.h"
-
-// -----------------------------------------------------------------------------
-// Usage documentation
-// -----------------------------------------------------------------------------
-//
-// Overview:
-// base::BindOnce() and base::BindRepeating() are helpers for creating
-// base::OnceCallback and base::RepeatingCallback objects respectively.
-//
-// For a runnable object of n-arity, the base::Bind*() family allows partial
-// application of the first m arguments. The remaining n - m arguments must be
-// passed when invoking the callback with Run().
-//
-//   // The first argument is bound at callback creation; the remaining
-//   // two must be passed when calling Run() on the callback object.
-//   base::OnceCallback<void(int, long)> cb = base::BindOnce(
-//       [](short x, int y, long z) { return x * y * z; }, 42);
-//
-// When binding to a method, the receiver object must also be specified at
-// callback creation time. When Run() is invoked, the method will be invoked on
-// the specified receiver object.
-//
-//   class C : public base::RefCounted<C> { void F(); };
-//   auto instance = base::MakeRefCounted<C>();
-//   auto cb = base::BindOnce(&C::F, instance);
-//   cb.Run();  // Identical to instance->F()
-//
-// base::Bind is currently a type alias for base::BindRepeating(). In the
-// future, we expect to flip this to default to base::BindOnce().
-//
-// See //docs/callback.md for the full documentation.
-//
-// -----------------------------------------------------------------------------
-// Implementation notes
-// -----------------------------------------------------------------------------
-//
-// If you're reading the implementation, before proceeding further, you should
-// read the top comment of base/bind_internal.h for a definition of common
-// terms and concepts.
-
-namespace base {
-
-namespace internal {
-
-// IsOnceCallback<T> is a std::true_type if |T| is a OnceCallback.
-template <typename T>
-struct IsOnceCallback : std::false_type {};
-
-template <typename Signature>
-struct IsOnceCallback<OnceCallback<Signature>> : std::true_type {};
-
-// Helper to assert that parameter |i| of type |Arg| can be bound, which means:
-// - |Arg| can be retained internally as |Storage|.
-// - |Arg| can be forwarded as |Unwrapped| to |Param|.
-template <size_t i,
-          typename Arg,
-          typename Storage,
-          typename Unwrapped,
-          typename Param>
-struct AssertConstructible {
- private:
-  static constexpr bool param_is_forwardable =
-      std::is_constructible<Param, Unwrapped>::value;
-  // Unlike the check for binding into storage below, the check for
-  // forwardability drops the const qualifier for repeating callbacks. This is
-  // to try to catch instances where std::move()--which forwards as a const
-  // reference with repeating callbacks--is used instead of base::Passed().
-  static_assert(
-      param_is_forwardable ||
-          !std::is_constructible<Param, std::decay_t<Unwrapped>&&>::value,
-      "Bound argument |i| is move-only but will be forwarded by copy. "
-      "Ensure |Arg| is bound using base::Passed(), not std::move().");
-  static_assert(
-      param_is_forwardable,
-      "Bound argument |i| of type |Arg| cannot be forwarded as "
-      "|Unwrapped| to the bound functor, which declares it as |Param|.");
-
-  static constexpr bool arg_is_storable =
-      std::is_constructible<Storage, Arg>::value;
-  static_assert(arg_is_storable ||
-                    !std::is_constructible<Storage, std::decay_t<Arg>&&>::value,
-                "Bound argument |i| is move-only but will be bound by copy. "
-                "Ensure |Arg| is mutable and bound using std::move().");
-  static_assert(arg_is_storable,
-                "Bound argument |i| of type |Arg| cannot be converted and "
-                "bound as |Storage|.");
-};
-
-// Takes three same-length TypeLists, and applies AssertConstructible for each
-// triples.
-template <typename Index,
-          typename Args,
-          typename UnwrappedTypeList,
-          typename ParamsList>
-struct AssertBindArgsValidity;
-
-template <size_t... Ns,
-          typename... Args,
-          typename... Unwrapped,
-          typename... Params>
-struct AssertBindArgsValidity<std::index_sequence<Ns...>,
-                              TypeList<Args...>,
-                              TypeList<Unwrapped...>,
-                              TypeList<Params...>>
-    : AssertConstructible<Ns, Args, std::decay_t<Args>, Unwrapped, Params>... {
-  static constexpr bool ok = true;
-};
-
-// The implementation of TransformToUnwrappedType below.
-template <bool is_once, typename T>
-struct TransformToUnwrappedTypeImpl;
-
-template <typename T>
-struct TransformToUnwrappedTypeImpl<true, T> {
-  using StoredType = std::decay_t<T>;
-  using ForwardType = StoredType&&;
-  using Unwrapped = decltype(Unwrap(std::declval<ForwardType>()));
-};
-
-template <typename T>
-struct TransformToUnwrappedTypeImpl<false, T> {
-  using StoredType = std::decay_t<T>;
-  using ForwardType = const StoredType&;
-  using Unwrapped = decltype(Unwrap(std::declval<ForwardType>()));
-};
-
-// Transform |T| into `Unwrapped` type, which is passed to the target function.
-// Example:
-//   In is_once == true case,
-//     `int&&` -> `int&&`,
-//     `const int&` -> `int&&`,
-//     `OwnedWrapper<int>&` -> `int*&&`.
-//   In is_once == false case,
-//     `int&&` -> `const int&`,
-//     `const int&` -> `const int&`,
-//     `OwnedWrapper<int>&` -> `int* const &`.
-template <bool is_once, typename T>
-using TransformToUnwrappedType =
-    typename TransformToUnwrappedTypeImpl<is_once, T>::Unwrapped;
-
-// Transforms |Args| into `Unwrapped` types, and packs them into a TypeList.
-// If |is_method| is true, tries to dereference the first argument to support
-// smart pointers.
-template <bool is_once, bool is_method, typename... Args>
-struct MakeUnwrappedTypeListImpl {
-  using Type = TypeList<TransformToUnwrappedType<is_once, Args>...>;
-};
-
-// Performs special handling for this pointers.
-// Example:
-//   int* -> int*,
-//   std::unique_ptr<int> -> int*.
-template <bool is_once, typename Receiver, typename... Args>
-struct MakeUnwrappedTypeListImpl<is_once, true, Receiver, Args...> {
-  using UnwrappedReceiver = TransformToUnwrappedType<is_once, Receiver>;
-  using Type = TypeList<decltype(&*std::declval<UnwrappedReceiver>()),
-                        TransformToUnwrappedType<is_once, Args>...>;
-};
-
-template <bool is_once, bool is_method, typename... Args>
-using MakeUnwrappedTypeList =
-    typename MakeUnwrappedTypeListImpl<is_once, is_method, Args...>::Type;
-
-}  // namespace internal
-
-// Bind as OnceCallback.
-template <typename Functor, typename... Args>
-inline OnceCallback<MakeUnboundRunType<Functor, Args...>> BindOnce(
-    Functor&& functor,
-    Args&&... args) {
-  static_assert(!internal::IsOnceCallback<std::decay_t<Functor>>() ||
-                    (std::is_rvalue_reference<Functor&&>() &&
-                     !std::is_const<std::remove_reference_t<Functor>>()),
-                "BindOnce requires non-const rvalue for OnceCallback binding."
-                " I.e.: base::BindOnce(std::move(callback)).");
-
-  // This block checks if each |args| matches to the corresponding params of the
-  // target function. This check does not affect the behavior of Bind, but its
-  // error message should be more readable.
-  using Helper = internal::BindTypeHelper<Functor, Args...>;
-  using FunctorTraits = typename Helper::FunctorTraits;
-  using BoundArgsList = typename Helper::BoundArgsList;
-  using UnwrappedArgsList =
-      internal::MakeUnwrappedTypeList<true, FunctorTraits::is_method,
-                                      Args&&...>;
-  using BoundParamsList = typename Helper::BoundParamsList;
-  static_assert(internal::AssertBindArgsValidity<
-                    std::make_index_sequence<Helper::num_bounds>, BoundArgsList,
-                    UnwrappedArgsList, BoundParamsList>::ok,
-                "The bound args need to be convertible to the target params.");
-
-  using BindState = internal::MakeBindStateType<Functor, Args...>;
-  using UnboundRunType = MakeUnboundRunType<Functor, Args...>;
-  using Invoker = internal::Invoker<BindState, UnboundRunType>;
-  using CallbackType = OnceCallback<UnboundRunType>;
-
-  // Store the invoke func into PolymorphicInvoke before casting it to
-  // InvokeFuncStorage, so that we can ensure its type matches to
-  // PolymorphicInvoke, to which CallbackType will cast back.
-  using PolymorphicInvoke = typename CallbackType::PolymorphicInvoke;
-  PolymorphicInvoke invoke_func = &Invoker::RunOnce;
-
-  using InvokeFuncStorage = internal::BindStateBase::InvokeFuncStorage;
-  return CallbackType(new BindState(
-      reinterpret_cast<InvokeFuncStorage>(invoke_func),
-      std::forward<Functor>(functor), std::forward<Args>(args)...));
-}
-
-// Bind as RepeatingCallback.
-template <typename Functor, typename... Args>
-inline RepeatingCallback<MakeUnboundRunType<Functor, Args...>> BindRepeating(
-    Functor&& functor,
-    Args&&... args) {
-  static_assert(
-      !internal::IsOnceCallback<std::decay_t<Functor>>(),
-      "BindRepeating cannot bind OnceCallback. Use BindOnce with std::move().");
-
-  // This block checks if each |args| matches to the corresponding params of the
-  // target function. This check does not affect the behavior of Bind, but its
-  // error message should be more readable.
-  using Helper = internal::BindTypeHelper<Functor, Args...>;
-  using FunctorTraits = typename Helper::FunctorTraits;
-  using BoundArgsList = typename Helper::BoundArgsList;
-  using UnwrappedArgsList =
-      internal::MakeUnwrappedTypeList<false, FunctorTraits::is_method,
-                                      Args&&...>;
-  using BoundParamsList = typename Helper::BoundParamsList;
-  static_assert(internal::AssertBindArgsValidity<
-                    std::make_index_sequence<Helper::num_bounds>, BoundArgsList,
-                    UnwrappedArgsList, BoundParamsList>::ok,
-                "The bound args need to be convertible to the target params.");
-
-  using BindState = internal::MakeBindStateType<Functor, Args...>;
-  using UnboundRunType = MakeUnboundRunType<Functor, Args...>;
-  using Invoker = internal::Invoker<BindState, UnboundRunType>;
-  using CallbackType = RepeatingCallback<UnboundRunType>;
-
-  // Store the invoke func into PolymorphicInvoke before casting it to
-  // InvokeFuncStorage, so that we can ensure its type matches to
-  // PolymorphicInvoke, to which CallbackType will cast back.
-  using PolymorphicInvoke = typename CallbackType::PolymorphicInvoke;
-  PolymorphicInvoke invoke_func = &Invoker::Run;
-
-  using InvokeFuncStorage = internal::BindStateBase::InvokeFuncStorage;
-  return CallbackType(new BindState(
-      reinterpret_cast<InvokeFuncStorage>(invoke_func),
-      std::forward<Functor>(functor), std::forward<Args>(args)...));
-}
-
-// Unannotated Bind.
-// TODO(tzik): Deprecate this and migrate to OnceCallback and
-// RepeatingCallback, once they get ready.
-template <typename Functor, typename... Args>
-inline Callback<MakeUnboundRunType<Functor, Args...>> Bind(Functor&& functor,
-                                                           Args&&... args) {
-  return base::BindRepeating(std::forward<Functor>(functor),
-                             std::forward<Args>(args)...);
-}
-
-// Special cases for binding to a base::Callback without extra bound arguments.
-template <typename Signature>
-OnceCallback<Signature> BindOnce(OnceCallback<Signature> closure) {
-  return closure;
-}
-
-template <typename Signature>
-RepeatingCallback<Signature> BindRepeating(
-    RepeatingCallback<Signature> closure) {
-  return closure;
-}
-
-template <typename Signature>
-Callback<Signature> Bind(Callback<Signature> closure) {
-  return closure;
-}
-
-// Unretained() allows Bind() to bind a non-refcounted class, and to disable
-// refcounting on arguments that are refcounted objects.
-//
-// EXAMPLE OF Unretained():
-//
-//   class Foo {
-//    public:
-//     void func() { cout << "Foo:f" << endl; }
-//   };
-//
-//   // In some function somewhere.
-//   Foo foo;
-//   Closure foo_callback =
-//       Bind(&Foo::func, Unretained(&foo));
-//   foo_callback.Run();  // Prints "Foo:f".
-//
-// Without the Unretained() wrapper on |&foo|, the above call would fail
-// to compile because Foo does not support the AddRef() and Release() methods.
-template <typename T>
-static inline internal::UnretainedWrapper<T> Unretained(T* o) {
-  return internal::UnretainedWrapper<T>(o);
-}
-
-// RetainedRef() accepts a ref counted object and retains a reference to it.
-// When the callback is called, the object is passed as a raw pointer.
-//
-// EXAMPLE OF RetainedRef():
-//
-//    void foo(RefCountedBytes* bytes) {}
-//
-//    scoped_refptr<RefCountedBytes> bytes = ...;
-//    Closure callback = Bind(&foo, base::RetainedRef(bytes));
-//    callback.Run();
-//
-// Without RetainedRef, the scoped_refptr would try to implicitly convert to
-// a raw pointer and fail compilation:
-//
-//    Closure callback = Bind(&foo, bytes); // ERROR!
-template <typename T>
-static inline internal::RetainedRefWrapper<T> RetainedRef(T* o) {
-  return internal::RetainedRefWrapper<T>(o);
-}
-template <typename T>
-static inline internal::RetainedRefWrapper<T> RetainedRef(scoped_refptr<T> o) {
-  return internal::RetainedRefWrapper<T>(std::move(o));
-}
-
-// ConstRef() allows binding a constant reference to an argument rather
-// than a copy.
-//
-// EXAMPLE OF ConstRef():
-//
-//   void foo(int arg) { cout << arg << endl }
-//
-//   int n = 1;
-//   Closure no_ref = Bind(&foo, n);
-//   Closure has_ref = Bind(&foo, ConstRef(n));
-//
-//   no_ref.Run();  // Prints "1"
-//   has_ref.Run();  // Prints "1"
-//
-//   n = 2;
-//   no_ref.Run();  // Prints "1"
-//   has_ref.Run();  // Prints "2"
-//
-// Note that because ConstRef() takes a reference on |n|, |n| must outlive all
-// its bound callbacks.
-template <typename T>
-static inline internal::ConstRefWrapper<T> ConstRef(const T& o) {
-  return internal::ConstRefWrapper<T>(o);
-}
-
-// Owned() transfers ownership of an object to the Callback resulting from
-// bind; the object will be deleted when the Callback is deleted.
-//
-// EXAMPLE OF Owned():
-//
-//   void foo(int* arg) { cout << *arg << endl }
-//
-//   int* pn = new int(1);
-//   Closure foo_callback = Bind(&foo, Owned(pn));
-//
-//   foo_callback.Run();  // Prints "1"
-//   foo_callback.Run();  // Prints "1"
-//   *n = 2;
-//   foo_callback.Run();  // Prints "2"
-//
-//   foo_callback.Reset();  // |pn| is deleted.  Also will happen when
-//                          // |foo_callback| goes out of scope.
-//
-// Without Owned(), someone would have to know to delete |pn| when the last
-// reference to the Callback is deleted.
-template <typename T>
-static inline internal::OwnedWrapper<T> Owned(T* o) {
-  return internal::OwnedWrapper<T>(o);
-}
-
-// Passed() is for transferring movable-but-not-copyable types (eg. unique_ptr)
-// through a Callback. Logically, this signifies a destructive transfer of
-// the state of the argument into the target function.  Invoking
-// Callback::Run() twice on a Callback that was created with a Passed()
-// argument will CHECK() because the first invocation would have already
-// transferred ownership to the target function.
-//
-// Note that Passed() is not necessary with BindOnce(), as std::move() does the
-// same thing. Avoid Passed() in favor of std::move() with BindOnce().
-//
-// EXAMPLE OF Passed():
-//
-//   void TakesOwnership(std::unique_ptr<Foo> arg) { }
-//   std::unique_ptr<Foo> CreateFoo() { return std::make_unique<Foo>();
-//   }
-//
-//   auto f = std::make_unique<Foo>();
-//
-//   // |cb| is given ownership of Foo(). |f| is now NULL.
-//   // You can use std::move(f) in place of &f, but it's more verbose.
-//   Closure cb = Bind(&TakesOwnership, Passed(&f));
-//
-//   // Run was never called so |cb| still owns Foo() and deletes
-//   // it on Reset().
-//   cb.Reset();
-//
-//   // |cb| is given a new Foo created by CreateFoo().
-//   cb = Bind(&TakesOwnership, Passed(CreateFoo()));
-//
-//   // |arg| in TakesOwnership() is given ownership of Foo(). |cb|
-//   // no longer owns Foo() and, if reset, would not delete Foo().
-//   cb.Run();  // Foo() is now transferred to |arg| and deleted.
-//   cb.Run();  // This CHECK()s since Foo() already been used once.
-//
-// We offer 2 syntaxes for calling Passed().  The first takes an rvalue and
-// is best suited for use with the return value of a function or other temporary
-// rvalues. The second takes a pointer to the scoper and is just syntactic sugar
-// to avoid having to write Passed(std::move(scoper)).
-//
-// Both versions of Passed() prevent T from being an lvalue reference. The first
-// via use of enable_if, and the second takes a T* which will not bind to T&.
-template <typename T,
-          std::enable_if_t<!std::is_lvalue_reference<T>::value>* = nullptr>
-static inline internal::PassedWrapper<T> Passed(T&& scoper) {
-  return internal::PassedWrapper<T>(std::move(scoper));
-}
-template <typename T>
-static inline internal::PassedWrapper<T> Passed(T* scoper) {
-  return internal::PassedWrapper<T>(std::move(*scoper));
-}
-
-// IgnoreResult() is used to adapt a function or Callback with a return type to
-// one with a void return. This is most useful if you have a function with,
-// say, a pesky ignorable bool return that you want to use with PostTask or
-// something else that expect a Callback with a void return.
-//
-// EXAMPLE OF IgnoreResult():
-//
-//   int DoSomething(int arg) { cout << arg << endl; }
-//
-//   // Assign to a Callback with a void return type.
-//   Callback<void(int)> cb = Bind(IgnoreResult(&DoSomething));
-//   cb->Run(1);  // Prints "1".
-//
-//   // Prints "1" on |ml|.
-//   ml->PostTask(FROM_HERE, Bind(IgnoreResult(&DoSomething), 1);
-template <typename T>
-static inline internal::IgnoreResultHelper<T> IgnoreResult(T data) {
-  return internal::IgnoreResultHelper<T>(std::move(data));
-}
-
-}  // namespace base
-
-#endif  // BASE_BIND_H_
diff --git a/base/bind_internal.h b/base/bind_internal.h
deleted file mode 100644
index 89c1600..0000000
--- a/base/bind_internal.h
+++ /dev/null
@@ -1,913 +0,0 @@
-// Copyright (c) 2011 The Chromium 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 BASE_BIND_INTERNAL_H_
-#define BASE_BIND_INTERNAL_H_
-
-#include <stddef.h>
-
-#include <tuple>
-#include <type_traits>
-#include <utility>
-
-#include "base/callback_internal.h"
-#include "base/memory/raw_scoped_refptr_mismatch_checker.h"
-#include "base/memory/weak_ptr.h"
-#include "base/template_util.h"
-#include "util/build_config.h"
-
-// See base/callback.h for user documentation.
-//
-//
-// CONCEPTS:
-//  Functor -- A movable type representing something that should be called.
-//             All function pointers and Callback<> are functors even if the
-//             invocation syntax differs.
-//  RunType -- A function type (as opposed to function _pointer_ type) for
-//             a Callback<>::Run().  Usually just a convenience typedef.
-//  (Bound)Args -- A set of types that stores the arguments.
-//
-// Types:
-//  ForceVoidReturn<> -- Helper class for translating function signatures to
-//                       equivalent forms with a "void" return type.
-//  FunctorTraits<> -- Type traits used to determine the correct RunType and
-//                     invocation manner for a Functor.  This is where function
-//                     signature adapters are applied.
-//  InvokeHelper<> -- Take a Functor + arguments and actully invokes it.
-//                    Handle the differing syntaxes needed for WeakPtr<>
-//                    support.  This is separate from Invoker to avoid creating
-//                    multiple version of Invoker<>.
-//  Invoker<> -- Unwraps the curried parameters and executes the Functor.
-//  BindState<> -- Stores the curried parameters, and is the main entry point
-//                 into the Bind() system.
-
-namespace base {
-
-template <typename T>
-struct IsWeakReceiver;
-
-template <typename>
-struct BindUnwrapTraits;
-
-template <typename Functor, typename BoundArgsTuple, typename SFINAE = void>
-struct CallbackCancellationTraits;
-
-namespace internal {
-
-template <typename Functor, typename SFINAE = void>
-struct FunctorTraits;
-
-template <typename T>
-class UnretainedWrapper {
- public:
-  explicit UnretainedWrapper(T* o) : ptr_(o) {}
-  T* get() const { return ptr_; }
-
- private:
-  T* ptr_;
-};
-
-template <typename T>
-class ConstRefWrapper {
- public:
-  explicit ConstRefWrapper(const T& o) : ptr_(&o) {}
-  const T& get() const { return *ptr_; }
-
- private:
-  const T* ptr_;
-};
-
-template <typename T>
-class RetainedRefWrapper {
- public:
-  explicit RetainedRefWrapper(T* o) : ptr_(o) {}
-  explicit RetainedRefWrapper(scoped_refptr<T> o) : ptr_(std::move(o)) {}
-  T* get() const { return ptr_.get(); }
-
- private:
-  scoped_refptr<T> ptr_;
-};
-
-template <typename T>
-struct IgnoreResultHelper {
-  explicit IgnoreResultHelper(T functor) : functor_(std::move(functor)) {}
-  explicit operator bool() const { return !!functor_; }
-
-  T functor_;
-};
-
-// An alternate implementation is to avoid the destructive copy, and instead
-// specialize ParamTraits<> for OwnedWrapper<> to change the StorageType to
-// a class that is essentially a std::unique_ptr<>.
-//
-// The current implementation has the benefit though of leaving ParamTraits<>
-// fully in callback_internal.h as well as avoiding type conversions during
-// storage.
-template <typename T>
-class OwnedWrapper {
- public:
-  explicit OwnedWrapper(T* o) : ptr_(o) {}
-  ~OwnedWrapper() { delete ptr_; }
-  T* get() const { return ptr_; }
-  OwnedWrapper(OwnedWrapper&& other) {
-    ptr_ = other.ptr_;
-    other.ptr_ = NULL;
-  }
-
- private:
-  mutable T* ptr_;
-};
-
-// PassedWrapper is a copyable adapter for a scoper that ignores const.
-//
-// It is needed to get around the fact that Bind() takes a const reference to
-// all its arguments.  Because Bind() takes a const reference to avoid
-// unnecessary copies, it is incompatible with movable-but-not-copyable
-// types; doing a destructive "move" of the type into Bind() would violate
-// the const correctness.
-//
-// This conundrum cannot be solved without either C++11 rvalue references or
-// a O(2^n) blowup of Bind() templates to handle each combination of regular
-// types and movable-but-not-copyable types.  Thus we introduce a wrapper type
-// that is copyable to transmit the correct type information down into
-// BindState<>. Ignoring const in this type makes sense because it is only
-// created when we are explicitly trying to do a destructive move.
-//
-// Two notes:
-//  1) PassedWrapper supports any type that has a move constructor, however
-//     the type will need to be specifically whitelisted in order for it to be
-//     bound to a Callback. We guard this explicitly at the call of Passed()
-//     to make for clear errors. Things not given to Passed() will be forwarded
-//     and stored by value which will not work for general move-only types.
-//  2) is_valid_ is distinct from NULL because it is valid to bind a "NULL"
-//     scoper to a Callback and allow the Callback to execute once.
-template <typename T>
-class PassedWrapper {
- public:
-  explicit PassedWrapper(T&& scoper)
-      : is_valid_(true), scoper_(std::move(scoper)) {}
-  PassedWrapper(PassedWrapper&& other)
-      : is_valid_(other.is_valid_), scoper_(std::move(other.scoper_)) {}
-  T Take() const {
-    CHECK(is_valid_);
-    is_valid_ = false;
-    return std::move(scoper_);
-  }
-
- private:
-  mutable bool is_valid_;
-  mutable T scoper_;
-};
-
-template <typename T>
-using Unwrapper = BindUnwrapTraits<std::decay_t<T>>;
-
-template <typename T>
-decltype(auto) Unwrap(T&& o) {
-  return Unwrapper<T>::Unwrap(std::forward<T>(o));
-}
-
-// IsWeakMethod is a helper that determine if we are binding a WeakPtr<> to a
-// method.  It is used internally by Bind() to select the correct
-// InvokeHelper that will no-op itself in the event the WeakPtr<> for
-// the target object is invalidated.
-//
-// The first argument should be the type of the object that will be received by
-// the method.
-template <bool is_method, typename... Args>
-struct IsWeakMethod : std::false_type {};
-
-template <typename T, typename... Args>
-struct IsWeakMethod<true, T, Args...> : IsWeakReceiver<T> {};
-
-// Packs a list of types to hold them in a single type.
-template <typename... Types>
-struct TypeList {};
-
-// Used for DropTypeListItem implementation.
-template <size_t n, typename List>
-struct DropTypeListItemImpl;
-
-// Do not use enable_if and SFINAE here to avoid MSVC2013 compile failure.
-template <size_t n, typename T, typename... List>
-struct DropTypeListItemImpl<n, TypeList<T, List...>>
-    : DropTypeListItemImpl<n - 1, TypeList<List...>> {};
-
-template <typename T, typename... List>
-struct DropTypeListItemImpl<0, TypeList<T, List...>> {
-  using Type = TypeList<T, List...>;
-};
-
-template <>
-struct DropTypeListItemImpl<0, TypeList<>> {
-  using Type = TypeList<>;
-};
-
-// A type-level function that drops |n| list item from given TypeList.
-template <size_t n, typename List>
-using DropTypeListItem = typename DropTypeListItemImpl<n, List>::Type;
-
-// Used for TakeTypeListItem implementation.
-template <size_t n, typename List, typename... Accum>
-struct TakeTypeListItemImpl;
-
-// Do not use enable_if and SFINAE here to avoid MSVC2013 compile failure.
-template <size_t n, typename T, typename... List, typename... Accum>
-struct TakeTypeListItemImpl<n, TypeList<T, List...>, Accum...>
-    : TakeTypeListItemImpl<n - 1, TypeList<List...>, Accum..., T> {};
-
-template <typename T, typename... List, typename... Accum>
-struct TakeTypeListItemImpl<0, TypeList<T, List...>, Accum...> {
-  using Type = TypeList<Accum...>;
-};
-
-template <typename... Accum>
-struct TakeTypeListItemImpl<0, TypeList<>, Accum...> {
-  using Type = TypeList<Accum...>;
-};
-
-// A type-level function that takes first |n| list item from given TypeList.
-// E.g. TakeTypeListItem<3, TypeList<A, B, C, D>> is evaluated to
-// TypeList<A, B, C>.
-template <size_t n, typename List>
-using TakeTypeListItem = typename TakeTypeListItemImpl<n, List>::Type;
-
-// Used for ConcatTypeLists implementation.
-template <typename List1, typename List2>
-struct ConcatTypeListsImpl;
-
-template <typename... Types1, typename... Types2>
-struct ConcatTypeListsImpl<TypeList<Types1...>, TypeList<Types2...>> {
-  using Type = TypeList<Types1..., Types2...>;
-};
-
-// A type-level function that concats two TypeLists.
-template <typename List1, typename List2>
-using ConcatTypeLists = typename ConcatTypeListsImpl<List1, List2>::Type;
-
-// Used for MakeFunctionType implementation.
-template <typename R, typename ArgList>
-struct MakeFunctionTypeImpl;
-
-template <typename R, typename... Args>
-struct MakeFunctionTypeImpl<R, TypeList<Args...>> {
-  // MSVC 2013 doesn't support Type Alias of function types.
-  // Revisit this after we update it to newer version.
-  typedef R Type(Args...);
-};
-
-// A type-level function that constructs a function type that has |R| as its
-// return type and has TypeLists items as its arguments.
-template <typename R, typename ArgList>
-using MakeFunctionType = typename MakeFunctionTypeImpl<R, ArgList>::Type;
-
-// Used for ExtractArgs and ExtractReturnType.
-template <typename Signature>
-struct ExtractArgsImpl;
-
-template <typename R, typename... Args>
-struct ExtractArgsImpl<R(Args...)> {
-  using ReturnType = R;
-  using ArgsList = TypeList<Args...>;
-};
-
-// A type-level function that extracts function arguments into a TypeList.
-// E.g. ExtractArgs<R(A, B, C)> is evaluated to TypeList<A, B, C>.
-template <typename Signature>
-using ExtractArgs = typename ExtractArgsImpl<Signature>::ArgsList;
-
-// A type-level function that extracts the return type of a function.
-// E.g. ExtractReturnType<R(A, B, C)> is evaluated to R.
-template <typename Signature>
-using ExtractReturnType = typename ExtractArgsImpl<Signature>::ReturnType;
-
-template <typename Callable,
-          typename Signature = decltype(&Callable::operator())>
-struct ExtractCallableRunTypeImpl;
-
-template <typename Callable, typename R, typename... Args>
-struct ExtractCallableRunTypeImpl<Callable, R (Callable::*)(Args...)> {
-  using Type = R(Args...);
-};
-
-template <typename Callable, typename R, typename... Args>
-struct ExtractCallableRunTypeImpl<Callable, R (Callable::*)(Args...) const> {
-  using Type = R(Args...);
-};
-
-// Evaluated to RunType of the given callable type.
-// Example:
-//   auto f = [](int, char*) { return 0.1; };
-//   ExtractCallableRunType<decltype(f)>
-//   is evaluated to
-//   double(int, char*);
-template <typename Callable>
-using ExtractCallableRunType =
-    typename ExtractCallableRunTypeImpl<Callable>::Type;
-
-// IsCallableObject<Functor> is std::true_type if |Functor| has operator().
-// Otherwise, it's std::false_type.
-// Example:
-//   IsCallableObject<void(*)()>::value is false.
-//
-//   struct Foo {};
-//   IsCallableObject<void(Foo::*)()>::value is false.
-//
-//   int i = 0;
-//   auto f = [i]() {};
-//   IsCallableObject<decltype(f)>::value is false.
-template <typename Functor, typename SFINAE = void>
-struct IsCallableObject : std::false_type {};
-
-template <typename Callable>
-struct IsCallableObject<Callable, std::void_t<decltype(&Callable::operator())>>
-    : std::true_type {};
-
-// HasRefCountedTypeAsRawPtr selects true_type when any of the |Args| is a raw
-// pointer to a RefCounted type.
-// Implementation note: This non-specialized case handles zero-arity case only.
-// Non-zero-arity cases should be handled by the specialization below.
-template <typename... Args>
-struct HasRefCountedTypeAsRawPtr : std::false_type {};
-
-// Implementation note: Select true_type if the first parameter is a raw pointer
-// to a RefCounted type. Otherwise, skip the first parameter and check rest of
-// parameters recursively.
-template <typename T, typename... Args>
-struct HasRefCountedTypeAsRawPtr<T, Args...>
-    : std::conditional_t<NeedsScopedRefptrButGetsRawPtr<T>::value,
-                         std::true_type,
-                         HasRefCountedTypeAsRawPtr<Args...>> {};
-
-// ForceVoidReturn<>
-//
-// Set of templates that support forcing the function return type to void.
-template <typename Sig>
-struct ForceVoidReturn;
-
-template <typename R, typename... Args>
-struct ForceVoidReturn<R(Args...)> {
-  using RunType = void(Args...);
-};
-
-// FunctorTraits<>
-//
-// See description at top of file.
-template <typename Functor, typename SFINAE>
-struct FunctorTraits;
-
-// For empty callable types.
-// This specialization is intended to allow binding captureless lambdas by
-// base::Bind(), based on the fact that captureless lambdas are empty while
-// capturing lambdas are not. This also allows any functors as far as it's an
-// empty class.
-// Example:
-//
-//   // Captureless lambdas are allowed.
-//   []() {return 42;};
-//
-//   // Capturing lambdas are *not* allowed.
-//   int x;
-//   [x]() {return x;};
-//
-//   // Any empty class with operator() is allowed.
-//   struct Foo {
-//     void operator()() const {}
-//     // No non-static member variable and no virtual functions.
-//   };
-template <typename Functor>
-struct FunctorTraits<Functor,
-                     std::enable_if_t<IsCallableObject<Functor>::value &&
-                                      std::is_empty<Functor>::value>> {
-  using RunType = ExtractCallableRunType<Functor>;
-  static constexpr bool is_method = false;
-  static constexpr bool is_nullable = false;
-
-  template <typename RunFunctor, typename... RunArgs>
-  static ExtractReturnType<RunType> Invoke(RunFunctor&& functor,
-                                           RunArgs&&... args) {
-    return std::forward<RunFunctor>(functor)(std::forward<RunArgs>(args)...);
-  }
-};
-
-// For functions.
-template <typename R, typename... Args>
-struct FunctorTraits<R (*)(Args...)> {
-  using RunType = R(Args...);
-  static constexpr bool is_method = false;
-  static constexpr bool is_nullable = true;
-
-  template <typename Function, typename... RunArgs>
-  static R Invoke(Function&& function, RunArgs&&... args) {
-    return std::forward<Function>(function)(std::forward<RunArgs>(args)...);
-  }
-};
-
-#if defined(OS_WIN) && !defined(ARCH_CPU_X86_64)
-
-// For functions.
-template <typename R, typename... Args>
-struct FunctorTraits<R(__stdcall*)(Args...)> {
-  using RunType = R(Args...);
-  static constexpr bool is_method = false;
-  static constexpr bool is_nullable = true;
-
-  template <typename... RunArgs>
-  static R Invoke(R(__stdcall* function)(Args...), RunArgs&&... args) {
-    return function(std::forward<RunArgs>(args)...);
-  }
-};
-
-// For functions.
-template <typename R, typename... Args>
-struct FunctorTraits<R(__fastcall*)(Args...)> {
-  using RunType = R(Args...);
-  static constexpr bool is_method = false;
-  static constexpr bool is_nullable = true;
-
-  template <typename... RunArgs>
-  static R Invoke(R(__fastcall* function)(Args...), RunArgs&&... args) {
-    return function(std::forward<RunArgs>(args)...);
-  }
-};
-
-#endif  // defined(OS_WIN) && !defined(ARCH_CPU_X86_64)
-
-// For methods.
-template <typename R, typename Receiver, typename... Args>
-struct FunctorTraits<R (Receiver::*)(Args...)> {
-  using RunType = R(Receiver*, Args...);
-  static constexpr bool is_method = true;
-  static constexpr bool is_nullable = true;
-
-  template <typename Method, typename ReceiverPtr, typename... RunArgs>
-  static R Invoke(Method method,
-                  ReceiverPtr&& receiver_ptr,
-                  RunArgs&&... args) {
-    return ((*receiver_ptr).*method)(std::forward<RunArgs>(args)...);
-  }
-};
-
-// For const methods.
-template <typename R, typename Receiver, typename... Args>
-struct FunctorTraits<R (Receiver::*)(Args...) const> {
-  using RunType = R(const Receiver*, Args...);
-  static constexpr bool is_method = true;
-  static constexpr bool is_nullable = true;
-
-  template <typename Method, typename ReceiverPtr, typename... RunArgs>
-  static R Invoke(Method method,
-                  ReceiverPtr&& receiver_ptr,
-                  RunArgs&&... args) {
-    return ((*receiver_ptr).*method)(std::forward<RunArgs>(args)...);
-  }
-};
-
-#ifdef __cpp_noexcept_function_type
-// noexcept makes a distinct function type in C++17.
-// I.e. `void(*)()` and `void(*)() noexcept` are same in pre-C++17, and
-// different in C++17.
-template <typename R, typename... Args>
-struct FunctorTraits<R (*)(Args...) noexcept> : FunctorTraits<R (*)(Args...)> {
-};
-
-template <typename R, typename Receiver, typename... Args>
-struct FunctorTraits<R (Receiver::*)(Args...) noexcept>
-    : FunctorTraits<R (Receiver::*)(Args...)> {};
-
-template <typename R, typename Receiver, typename... Args>
-struct FunctorTraits<R (Receiver::*)(Args...) const noexcept>
-    : FunctorTraits<R (Receiver::*)(Args...) const> {};
-#endif
-
-// For IgnoreResults.
-template <typename T>
-struct FunctorTraits<IgnoreResultHelper<T>> : FunctorTraits<T> {
-  using RunType =
-      typename ForceVoidReturn<typename FunctorTraits<T>::RunType>::RunType;
-
-  template <typename IgnoreResultType, typename... RunArgs>
-  static void Invoke(IgnoreResultType&& ignore_result_helper,
-                     RunArgs&&... args) {
-    FunctorTraits<T>::Invoke(
-        std::forward<IgnoreResultType>(ignore_result_helper).functor_,
-        std::forward<RunArgs>(args)...);
-  }
-};
-
-// For OnceCallbacks.
-template <typename R, typename... Args>
-struct FunctorTraits<OnceCallback<R(Args...)>> {
-  using RunType = R(Args...);
-  static constexpr bool is_method = false;
-  static constexpr bool is_nullable = true;
-
-  template <typename CallbackType, typename... RunArgs>
-  static R Invoke(CallbackType&& callback, RunArgs&&... args) {
-    DCHECK(!callback.is_null());
-    return std::forward<CallbackType>(callback).Run(
-        std::forward<RunArgs>(args)...);
-  }
-};
-
-// For RepeatingCallbacks.
-template <typename R, typename... Args>
-struct FunctorTraits<RepeatingCallback<R(Args...)>> {
-  using RunType = R(Args...);
-  static constexpr bool is_method = false;
-  static constexpr bool is_nullable = true;
-
-  template <typename CallbackType, typename... RunArgs>
-  static R Invoke(CallbackType&& callback, RunArgs&&... args) {
-    DCHECK(!callback.is_null());
-    return std::forward<CallbackType>(callback).Run(
-        std::forward<RunArgs>(args)...);
-  }
-};
-
-template <typename Functor>
-using MakeFunctorTraits = FunctorTraits<std::decay_t<Functor>>;
-
-// InvokeHelper<>
-//
-// There are 2 logical InvokeHelper<> specializations: normal, WeakCalls.
-//
-// The normal type just calls the underlying runnable.
-//
-// WeakCalls need special syntax that is applied to the first argument to check
-// if they should no-op themselves.
-template <bool is_weak_call, typename ReturnType>
-struct InvokeHelper;
-
-template <typename ReturnType>
-struct InvokeHelper<false, ReturnType> {
-  template <typename Functor, typename... RunArgs>
-  static inline ReturnType MakeItSo(Functor&& functor, RunArgs&&... args) {
-    using Traits = MakeFunctorTraits<Functor>;
-    return Traits::Invoke(std::forward<Functor>(functor),
-                          std::forward<RunArgs>(args)...);
-  }
-};
-
-template <typename ReturnType>
-struct InvokeHelper<true, ReturnType> {
-  // WeakCalls are only supported for functions with a void return type.
-  // Otherwise, the function result would be undefined if the the WeakPtr<>
-  // is invalidated.
-  static_assert(std::is_void<ReturnType>::value,
-                "weak_ptrs can only bind to methods without return values");
-
-  template <typename Functor, typename BoundWeakPtr, typename... RunArgs>
-  static inline void MakeItSo(Functor&& functor,
-                              BoundWeakPtr&& weak_ptr,
-                              RunArgs&&... args) {
-    if (!weak_ptr)
-      return;
-    using Traits = MakeFunctorTraits<Functor>;
-    Traits::Invoke(std::forward<Functor>(functor),
-                   std::forward<BoundWeakPtr>(weak_ptr),
-                   std::forward<RunArgs>(args)...);
-  }
-};
-
-// Invoker<>
-//
-// See description at the top of the file.
-template <typename StorageType, typename UnboundRunType>
-struct Invoker;
-
-template <typename StorageType, typename R, typename... UnboundArgs>
-struct Invoker<StorageType, R(UnboundArgs...)> {
-  static R RunOnce(BindStateBase* base,
-                   PassingTraitsType<UnboundArgs>... unbound_args) {
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    StorageType* storage = static_cast<StorageType*>(base);
-    static constexpr size_t num_bound_args =
-        std::tuple_size<decltype(storage->bound_args_)>::value;
-    return RunImpl(std::move(storage->functor_),
-                   std::move(storage->bound_args_),
-                   std::make_index_sequence<num_bound_args>(),
-                   std::forward<UnboundArgs>(unbound_args)...);
-  }
-
-  static R Run(BindStateBase* base,
-               PassingTraitsType<UnboundArgs>... unbound_args) {
-    // Local references to make debugger stepping easier. If in a debugger,
-    // you really want to warp ahead and step through the
-    // InvokeHelper<>::MakeItSo() call below.
-    const StorageType* storage = static_cast<StorageType*>(base);
-    static constexpr size_t num_bound_args =
-        std::tuple_size<decltype(storage->bound_args_)>::value;
-    return RunImpl(storage->functor_, storage->bound_args_,
-                   std::make_index_sequence<num_bound_args>(),
-                   std::forward<UnboundArgs>(unbound_args)...);
-  }
-
- private:
-  template <typename Functor, typename BoundArgsTuple, size_t... indices>
-  static inline R RunImpl(Functor&& functor,
-                          BoundArgsTuple&& bound,
-                          std::index_sequence<indices...>,
-                          UnboundArgs&&... unbound_args) {
-    static constexpr bool is_method = MakeFunctorTraits<Functor>::is_method;
-
-    using DecayedArgsTuple = std::decay_t<BoundArgsTuple>;
-    static constexpr bool is_weak_call =
-        IsWeakMethod<is_method,
-                     std::tuple_element_t<indices, DecayedArgsTuple>...>();
-
-    return InvokeHelper<is_weak_call, R>::MakeItSo(
-        std::forward<Functor>(functor),
-        Unwrap(std::get<indices>(std::forward<BoundArgsTuple>(bound)))...,
-        std::forward<UnboundArgs>(unbound_args)...);
-  }
-};
-
-// Extracts necessary type info from Functor and BoundArgs.
-// Used to implement MakeUnboundRunType, BindOnce and BindRepeating.
-template <typename Functor, typename... BoundArgs>
-struct BindTypeHelper {
-  static constexpr size_t num_bounds = sizeof...(BoundArgs);
-  using FunctorTraits = MakeFunctorTraits<Functor>;
-
-  // Example:
-  //   When Functor is `double (Foo::*)(int, const std::string&)`, and BoundArgs
-  //   is a template pack of `Foo*` and `int16_t`:
-  //    - RunType is `double(Foo*, int, const std::string&)`,
-  //    - ReturnType is `double`,
-  //    - RunParamsList is `TypeList<Foo*, int, const std::string&>`,
-  //    - BoundParamsList is `TypeList<Foo*, int>`,
-  //    - UnboundParamsList is `TypeList<const std::string&>`,
-  //    - BoundArgsList is `TypeList<Foo*, int16_t>`,
-  //    - UnboundRunType is `double(const std::string&)`.
-  using RunType = typename FunctorTraits::RunType;
-  using ReturnType = ExtractReturnType<RunType>;
-
-  using RunParamsList = ExtractArgs<RunType>;
-  using BoundParamsList = TakeTypeListItem<num_bounds, RunParamsList>;
-  using UnboundParamsList = DropTypeListItem<num_bounds, RunParamsList>;
-
-  using BoundArgsList = TypeList<BoundArgs...>;
-
-  using UnboundRunType = MakeFunctionType<ReturnType, UnboundParamsList>;
-};
-
-template <typename Functor>
-std::enable_if_t<FunctorTraits<Functor>::is_nullable, bool> IsNull(
-    const Functor& functor) {
-  return !functor;
-}
-
-template <typename Functor>
-std::enable_if_t<!FunctorTraits<Functor>::is_nullable, bool> IsNull(
-    const Functor&) {
-  return false;
-}
-
-// Used by ApplyCancellationTraits below.
-template <typename Functor, typename BoundArgsTuple, size_t... indices>
-bool ApplyCancellationTraitsImpl(const Functor& functor,
-                                 const BoundArgsTuple& bound_args,
-                                 std::index_sequence<indices...>) {
-  return CallbackCancellationTraits<Functor, BoundArgsTuple>::IsCancelled(
-      functor, std::get<indices>(bound_args)...);
-}
-
-// Relays |base| to corresponding CallbackCancellationTraits<>::Run(). Returns
-// true if the callback |base| represents is canceled.
-template <typename BindStateType>
-bool ApplyCancellationTraits(const BindStateBase* base) {
-  const BindStateType* storage = static_cast<const BindStateType*>(base);
-  static constexpr size_t num_bound_args =
-      std::tuple_size<decltype(storage->bound_args_)>::value;
-  return ApplyCancellationTraitsImpl(
-      storage->functor_, storage->bound_args_,
-      std::make_index_sequence<num_bound_args>());
-};
-
-// BindState<>
-//
-// This stores all the state passed into Bind().
-template <typename Functor, typename... BoundArgs>
-struct BindState final : BindStateBase {
-  using IsCancellable = std::integral_constant<
-      bool,
-      CallbackCancellationTraits<Functor,
-                                 std::tuple<BoundArgs...>>::is_cancellable>;
-
-  template <typename ForwardFunctor, typename... ForwardBoundArgs>
-  explicit BindState(BindStateBase::InvokeFuncStorage invoke_func,
-                     ForwardFunctor&& functor,
-                     ForwardBoundArgs&&... bound_args)
-      // IsCancellable is std::false_type if
-      // CallbackCancellationTraits<>::IsCancelled returns always false.
-      // Otherwise, it's std::true_type.
-      : BindState(IsCancellable{},
-                  invoke_func,
-                  std::forward<ForwardFunctor>(functor),
-                  std::forward<ForwardBoundArgs>(bound_args)...) {}
-
-  Functor functor_;
-  std::tuple<BoundArgs...> bound_args_;
-
- private:
-  template <typename ForwardFunctor, typename... ForwardBoundArgs>
-  explicit BindState(std::true_type,
-                     BindStateBase::InvokeFuncStorage invoke_func,
-                     ForwardFunctor&& functor,
-                     ForwardBoundArgs&&... bound_args)
-      : BindStateBase(invoke_func,
-                      &Destroy,
-                      &ApplyCancellationTraits<BindState>),
-        functor_(std::forward<ForwardFunctor>(functor)),
-        bound_args_(std::forward<ForwardBoundArgs>(bound_args)...) {
-    DCHECK(!IsNull(functor_));
-  }
-
-  template <typename ForwardFunctor, typename... ForwardBoundArgs>
-  explicit BindState(std::false_type,
-                     BindStateBase::InvokeFuncStorage invoke_func,
-                     ForwardFunctor&& functor,
-                     ForwardBoundArgs&&... bound_args)
-      : BindStateBase(invoke_func, &Destroy),
-        functor_(std::forward<ForwardFunctor>(functor)),
-        bound_args_(std::forward<ForwardBoundArgs>(bound_args)...) {
-    DCHECK(!IsNull(functor_));
-  }
-
-  ~BindState() = default;
-
-  static void Destroy(const BindStateBase* self) {
-    delete static_cast<const BindState*>(self);
-  }
-};
-
-// Used to implement MakeBindStateType.
-template <bool is_method, typename Functor, typename... BoundArgs>
-struct MakeBindStateTypeImpl;
-
-template <typename Functor, typename... BoundArgs>
-struct MakeBindStateTypeImpl<false, Functor, BoundArgs...> {
-  static_assert(!HasRefCountedTypeAsRawPtr<std::decay_t<BoundArgs>...>::value,
-                "A parameter is a refcounted type and needs scoped_refptr.");
-  using Type = BindState<std::decay_t<Functor>, std::decay_t<BoundArgs>...>;
-};
-
-template <typename Functor>
-struct MakeBindStateTypeImpl<true, Functor> {
-  using Type = BindState<std::decay_t<Functor>>;
-};
-
-template <typename Functor, typename Receiver, typename... BoundArgs>
-struct MakeBindStateTypeImpl<true, Functor, Receiver, BoundArgs...> {
- private:
-  using DecayedReceiver = std::decay_t<Receiver>;
-
-  static_assert(!std::is_array<std::remove_reference_t<Receiver>>::value,
-                "First bound argument to a method cannot be an array.");
-  static_assert(
-      !std::is_pointer<DecayedReceiver>::value ||
-          IsRefCountedType<std::remove_pointer_t<DecayedReceiver>>::value,
-      "Receivers may not be raw pointers. If using a raw pointer here is safe"
-      " and has no lifetime concerns, use base::Unretained() and document why"
-      " it's safe.");
-  static_assert(!HasRefCountedTypeAsRawPtr<std::decay_t<BoundArgs>...>::value,
-                "A parameter is a refcounted type and needs scoped_refptr.");
-
- public:
-  using Type = BindState<
-      std::decay_t<Functor>,
-      std::conditional_t<std::is_pointer<DecayedReceiver>::value,
-                         scoped_refptr<std::remove_pointer_t<DecayedReceiver>>,
-                         DecayedReceiver>,
-      std::decay_t<BoundArgs>...>;
-};
-
-template <typename Functor, typename... BoundArgs>
-using MakeBindStateType =
-    typename MakeBindStateTypeImpl<MakeFunctorTraits<Functor>::is_method,
-                                   Functor,
-                                   BoundArgs...>::Type;
-
-}  // namespace internal
-
-// An injection point to control |this| pointer behavior on a method invocation.
-// If IsWeakReceiver<> is true_type for |T| and |T| is used for a receiver of a
-// method, base::Bind cancels the method invocation if the receiver is tested as
-// false.
-// E.g. Foo::bar() is not called:
-//   struct Foo : base::SupportsWeakPtr<Foo> {
-//     void bar() {}
-//   };
-//
-//   WeakPtr<Foo> oo = nullptr;
-//   base::Bind(&Foo::bar, oo).Run();
-template <typename T>
-struct IsWeakReceiver : std::false_type {};
-
-template <typename T>
-struct IsWeakReceiver<internal::ConstRefWrapper<T>> : IsWeakReceiver<T> {};
-
-template <typename T>
-struct IsWeakReceiver<WeakPtr<T>> : std::true_type {};
-
-// An injection point to control how bound objects passed to the target
-// function. BindUnwrapTraits<>::Unwrap() is called for each bound objects right
-// before the target function is invoked.
-template <typename>
-struct BindUnwrapTraits {
-  template <typename T>
-  static T&& Unwrap(T&& o) {
-    return std::forward<T>(o);
-  }
-};
-
-template <typename T>
-struct BindUnwrapTraits<internal::UnretainedWrapper<T>> {
-  static T* Unwrap(const internal::UnretainedWrapper<T>& o) { return o.get(); }
-};
-
-template <typename T>
-struct BindUnwrapTraits<internal::ConstRefWrapper<T>> {
-  static const T& Unwrap(const internal::ConstRefWrapper<T>& o) {
-    return o.get();
-  }
-};
-
-template <typename T>
-struct BindUnwrapTraits<internal::RetainedRefWrapper<T>> {
-  static T* Unwrap(const internal::RetainedRefWrapper<T>& o) { return o.get(); }
-};
-
-template <typename T>
-struct BindUnwrapTraits<internal::OwnedWrapper<T>> {
-  static T* Unwrap(const internal::OwnedWrapper<T>& o) { return o.get(); }
-};
-
-template <typename T>
-struct BindUnwrapTraits<internal::PassedWrapper<T>> {
-  static T Unwrap(const internal::PassedWrapper<T>& o) { return o.Take(); }
-};
-
-// CallbackCancellationTraits allows customization of Callback's cancellation
-// semantics. By default, callbacks are not cancellable. A specialization should
-// set is_cancellable = true and implement an IsCancelled() that returns if the
-// callback should be cancelled.
-template <typename Functor, typename BoundArgsTuple, typename SFINAE>
-struct CallbackCancellationTraits {
-  static constexpr bool is_cancellable = false;
-};
-
-// Specialization for method bound to weak pointer receiver.
-template <typename Functor, typename... BoundArgs>
-struct CallbackCancellationTraits<
-    Functor,
-    std::tuple<BoundArgs...>,
-    std::enable_if_t<
-        internal::IsWeakMethod<internal::FunctorTraits<Functor>::is_method,
-                               BoundArgs...>::value>> {
-  static constexpr bool is_cancellable = true;
-
-  template <typename Receiver, typename... Args>
-  static bool IsCancelled(const Functor&,
-                          const Receiver& receiver,
-                          const Args&...) {
-    return !receiver;
-  }
-};
-
-// Specialization for a nested bind.
-template <typename Signature, typename... BoundArgs>
-struct CallbackCancellationTraits<OnceCallback<Signature>,
-                                  std::tuple<BoundArgs...>> {
-  static constexpr bool is_cancellable = true;
-
-  template <typename Functor>
-  static bool IsCancelled(const Functor& functor, const BoundArgs&...) {
-    return functor.IsCancelled();
-  }
-};
-
-template <typename Signature, typename... BoundArgs>
-struct CallbackCancellationTraits<RepeatingCallback<Signature>,
-                                  std::tuple<BoundArgs...>> {
-  static constexpr bool is_cancellable = true;
-
-  template <typename Functor>
-  static bool IsCancelled(const Functor& functor, const BoundArgs&...) {
-    return functor.IsCancelled();
-  }
-};
-
-// Returns a RunType of bound functor.
-// E.g. MakeUnboundRunType<R(A, B, C), A, B> is evaluated to R(C).
-template <typename Functor, typename... BoundArgs>
-using MakeUnboundRunType =
-    typename internal::BindTypeHelper<Functor, BoundArgs...>::UnboundRunType;
-
-}  // namespace base
-
-#endif  // BASE_BIND_INTERNAL_H_
diff --git a/base/callback.h b/base/callback.h
deleted file mode 100644
index 1b84f40..0000000
--- a/base/callback.h
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// NOTE: Header files that do not require the full definition of Callback or
-// Closure should #include "base/callback_forward.h" instead of this file.
-
-#ifndef BASE_CALLBACK_H_
-#define BASE_CALLBACK_H_
-
-#include "base/callback_forward.h"
-#include "base/callback_internal.h"
-
-// -----------------------------------------------------------------------------
-// Usage documentation
-// -----------------------------------------------------------------------------
-//
-// Overview:
-// A callback is similar in concept to a function pointer: it wraps a runnable
-// object such as a function, method, lambda, or even another callback, allowing
-// the runnable object to be invoked later via the callback object.
-//
-// Unlike function pointers, callbacks are created with base::BindOnce() or
-// base::BindRepeating() and support partial function application.
-//
-// A base::OnceCallback may be Run() at most once; a base::RepeatingCallback may
-// be Run() any number of times. |is_null()| is guaranteed to return true for a
-// moved-from callback.
-//
-//   // The lambda takes two arguments, but the first argument |x| is bound at
-//   // callback creation.
-//   base::OnceCallback<int(int)> cb = base::BindOnce([] (int x, int y) {
-//     return x + y;
-//   }, 1);
-//   // Run() only needs the remaining unbound argument |y|.
-//   printf("1 + 2 = %d\n", std::move(cb).Run(2));  // Prints 3
-//   printf("cb is null? %s\n",
-//          cb.is_null() ? "true" : "false");  // Prints true
-//   std::move(cb).Run(2);  // Crashes since |cb| has already run.
-//
-// Callbacks also support cancellation. A common use is binding the receiver
-// object as a WeakPtr<T>. If that weak pointer is invalidated, calling Run()
-// will be a no-op. Note that |is_cancelled()| and |is_null()| are distinct:
-// simply cancelling a callback will not also make it null.
-//
-// base::Callback is currently a type alias for base::RepeatingCallback. In the
-// future, we expect to flip this to default to base::OnceCallback.
-//
-// See //docs/callback.md for the full documentation.
-
-namespace base {
-
-template <typename R, typename... Args>
-class OnceCallback<R(Args...)> : public internal::CallbackBase {
- public:
-  using RunType = R(Args...);
-  using PolymorphicInvoke = R (*)(internal::BindStateBase*,
-                                  internal::PassingTraitsType<Args>...);
-
-  constexpr OnceCallback() = default;
-
-  explicit OnceCallback(internal::BindStateBase* bind_state)
-      : internal::CallbackBase(bind_state) {}
-
-  OnceCallback(const OnceCallback&) = delete;
-  OnceCallback& operator=(const OnceCallback&) = delete;
-
-  OnceCallback(OnceCallback&&) noexcept = default;
-  OnceCallback& operator=(OnceCallback&&) noexcept = default;
-
-  OnceCallback(RepeatingCallback<RunType> other)
-      : internal::CallbackBase(std::move(other)) {}
-
-  OnceCallback& operator=(RepeatingCallback<RunType> other) {
-    static_cast<internal::CallbackBase&>(*this) = std::move(other);
-    return *this;
-  }
-
-  bool Equals(const OnceCallback& other) const { return EqualsInternal(other); }
-
-  R Run(Args... args) const& {
-    static_assert(!sizeof(*this),
-                  "OnceCallback::Run() may only be invoked on a non-const "
-                  "rvalue, i.e. std::move(callback).Run().");
-    NOTREACHED();
-  }
-
-  R Run(Args... args) && {
-    // Move the callback instance into a local variable before the invocation,
-    // that ensures the internal state is cleared after the invocation.
-    // It's not safe to touch |this| after the invocation, since running the
-    // bound function may destroy |this|.
-    OnceCallback cb = std::move(*this);
-    PolymorphicInvoke f =
-        reinterpret_cast<PolymorphicInvoke>(cb.polymorphic_invoke());
-    return f(cb.bind_state_.get(), std::forward<Args>(args)...);
-  }
-};
-
-template <typename R, typename... Args>
-class RepeatingCallback<R(Args...)> : public internal::CallbackBaseCopyable {
- public:
-  using RunType = R(Args...);
-  using PolymorphicInvoke = R (*)(internal::BindStateBase*,
-                                  internal::PassingTraitsType<Args>...);
-
-  constexpr RepeatingCallback() = default;
-
-  explicit RepeatingCallback(internal::BindStateBase* bind_state)
-      : internal::CallbackBaseCopyable(bind_state) {}
-
-  // Copyable and movable.
-  RepeatingCallback(const RepeatingCallback&) = default;
-  RepeatingCallback& operator=(const RepeatingCallback&) = default;
-  RepeatingCallback(RepeatingCallback&&) noexcept = default;
-  RepeatingCallback& operator=(RepeatingCallback&&) noexcept = default;
-
-  bool Equals(const RepeatingCallback& other) const {
-    return EqualsInternal(other);
-  }
-
-  R Run(Args... args) const& {
-    PolymorphicInvoke f =
-        reinterpret_cast<PolymorphicInvoke>(this->polymorphic_invoke());
-    return f(this->bind_state_.get(), std::forward<Args>(args)...);
-  }
-
-  R Run(Args... args) && {
-    // Move the callback instance into a local variable before the invocation,
-    // that ensures the internal state is cleared after the invocation.
-    // It's not safe to touch |this| after the invocation, since running the
-    // bound function may destroy |this|.
-    RepeatingCallback cb = std::move(*this);
-    PolymorphicInvoke f =
-        reinterpret_cast<PolymorphicInvoke>(cb.polymorphic_invoke());
-    return f(cb.bind_state_.get(), std::forward<Args>(args)...);
-  }
-};
-
-}  // namespace base
-
-#endif  // BASE_CALLBACK_H_
diff --git a/base/callback_forward.h b/base/callback_forward.h
deleted file mode 100644
index f1851c4..0000000
--- a/base/callback_forward.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2011 The Chromium 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 BASE_CALLBACK_FORWARD_H_
-#define BASE_CALLBACK_FORWARD_H_
-
-namespace base {
-
-template <typename Signature>
-class OnceCallback;
-
-template <typename Signature>
-class RepeatingCallback;
-
-template <typename Signature>
-using Callback = RepeatingCallback<Signature>;
-
-// Syntactic sugar to make Callback<void()> easier to declare since it
-// will be used in a lot of APIs with delayed execution.
-using OnceClosure = OnceCallback<void()>;
-using RepeatingClosure = RepeatingCallback<void()>;
-using Closure = Callback<void()>;
-
-}  // namespace base
-
-#endif  // BASE_CALLBACK_FORWARD_H_
diff --git a/base/callback_internal.cc b/base/callback_internal.cc
deleted file mode 100644
index c52d8af..0000000
--- a/base/callback_internal.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/callback_internal.h"
-
-#include "base/logging.h"
-
-namespace base {
-namespace internal {
-
-namespace {
-
-bool ReturnFalse(const BindStateBase*) {
-  return false;
-}
-
-}  // namespace
-
-void BindStateBaseRefCountTraits::Destruct(const BindStateBase* bind_state) {
-  bind_state->destructor_(bind_state);
-}
-
-BindStateBase::BindStateBase(InvokeFuncStorage polymorphic_invoke,
-                             void (*destructor)(const BindStateBase*))
-    : BindStateBase(polymorphic_invoke, destructor, &ReturnFalse) {}
-
-BindStateBase::BindStateBase(InvokeFuncStorage polymorphic_invoke,
-                             void (*destructor)(const BindStateBase*),
-                             bool (*is_cancelled)(const BindStateBase*))
-    : polymorphic_invoke_(polymorphic_invoke),
-      destructor_(destructor),
-      is_cancelled_(is_cancelled) {}
-
-CallbackBase::CallbackBase(CallbackBase&& c) noexcept = default;
-CallbackBase& CallbackBase::operator=(CallbackBase&& c) noexcept = default;
-CallbackBase::CallbackBase(const CallbackBaseCopyable& c)
-    : bind_state_(c.bind_state_) {}
-
-CallbackBase& CallbackBase::operator=(const CallbackBaseCopyable& c) {
-  bind_state_ = c.bind_state_;
-  return *this;
-}
-
-CallbackBase::CallbackBase(CallbackBaseCopyable&& c) noexcept
-    : bind_state_(std::move(c.bind_state_)) {}
-
-CallbackBase& CallbackBase::operator=(CallbackBaseCopyable&& c) noexcept {
-  bind_state_ = std::move(c.bind_state_);
-  return *this;
-}
-
-void CallbackBase::Reset() {
-  // NULL the bind_state_ last, since it may be holding the last ref to whatever
-  // object owns us, and we may be deleted after that.
-  bind_state_ = nullptr;
-}
-
-bool CallbackBase::IsCancelled() const {
-  DCHECK(bind_state_);
-  return bind_state_->IsCancelled();
-}
-
-bool CallbackBase::EqualsInternal(const CallbackBase& other) const {
-  return bind_state_ == other.bind_state_;
-}
-
-CallbackBase::CallbackBase(BindStateBase* bind_state)
-    : bind_state_(bind_state ? AdoptRef(bind_state) : nullptr) {
-  DCHECK(!bind_state_.get() || bind_state_->HasOneRef());
-}
-
-CallbackBase::~CallbackBase() = default;
-
-CallbackBaseCopyable::CallbackBaseCopyable(const CallbackBaseCopyable& c)
-    : CallbackBase(nullptr) {
-  bind_state_ = c.bind_state_;
-}
-
-CallbackBaseCopyable::CallbackBaseCopyable(CallbackBaseCopyable&& c) noexcept =
-    default;
-
-CallbackBaseCopyable& CallbackBaseCopyable::operator=(
-    const CallbackBaseCopyable& c) {
-  bind_state_ = c.bind_state_;
-  return *this;
-}
-
-CallbackBaseCopyable& CallbackBaseCopyable::operator=(
-    CallbackBaseCopyable&& c) noexcept = default;
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/callback_internal.h b/base/callback_internal.h
deleted file mode 100644
index 7e5180f..0000000
--- a/base/callback_internal.h
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains utility functions and classes that help the
-// implementation, and management of the Callback objects.
-
-#ifndef BASE_CALLBACK_INTERNAL_H_
-#define BASE_CALLBACK_INTERNAL_H_
-
-#include "base/callback_forward.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-
-namespace base {
-
-struct FakeBindState;
-
-namespace internal {
-
-class CallbackBase;
-class CallbackBaseCopyable;
-
-class BindStateBase;
-
-template <typename Functor, typename... BoundArgs>
-struct BindState;
-
-struct BindStateBaseRefCountTraits {
-  static void Destruct(const BindStateBase*);
-};
-
-template <typename T, bool IsScalar = std::is_scalar<T>::value>
-struct PassingTraits;
-
-template <typename T>
-struct PassingTraits<T, false> {
-  using Type = T&&;
-};
-
-template <typename T>
-struct PassingTraits<T, true> {
-  using Type = T;
-};
-
-template <typename T>
-using PassingTraitsType = typename PassingTraits<T>::Type;
-
-// BindStateBase is used to provide an opaque handle that the Callback
-// class can use to represent a function object with bound arguments.  It
-// behaves as an existential type that is used by a corresponding
-// DoInvoke function to perform the function execution.  This allows
-// us to shield the Callback class from the types of the bound argument via
-// "type erasure."
-// At the base level, the only task is to add reference counting data. Don't use
-// RefCountedThreadSafe since it requires the destructor to be a virtual method.
-// Creating a vtable for every BindState template instantiation results in a lot
-// of bloat. Its only task is to call the destructor which can be done with a
-// function pointer.
-class BindStateBase
-    : public RefCountedThreadSafe<BindStateBase, BindStateBaseRefCountTraits> {
- public:
-  REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE();
-
-  using InvokeFuncStorage = void (*)();
-
- private:
-  BindStateBase(InvokeFuncStorage polymorphic_invoke,
-                void (*destructor)(const BindStateBase*));
-  BindStateBase(InvokeFuncStorage polymorphic_invoke,
-                void (*destructor)(const BindStateBase*),
-                bool (*is_cancelled)(const BindStateBase*));
-
-  ~BindStateBase() = default;
-
-  friend struct BindStateBaseRefCountTraits;
-  friend class RefCountedThreadSafe<BindStateBase, BindStateBaseRefCountTraits>;
-
-  friend class CallbackBase;
-  friend class CallbackBaseCopyable;
-
-  // Whitelist subclasses that access the destructor of BindStateBase.
-  template <typename Functor, typename... BoundArgs>
-  friend struct BindState;
-  friend struct ::base::FakeBindState;
-
-  bool IsCancelled() const { return is_cancelled_(this); }
-
-  // In C++, it is safe to cast function pointers to function pointers of
-  // another type. It is not okay to use void*. We create a InvokeFuncStorage
-  // that that can store our function pointer, and then cast it back to
-  // the original type on usage.
-  InvokeFuncStorage polymorphic_invoke_;
-
-  // Pointer to a function that will properly destroy |this|.
-  void (*destructor_)(const BindStateBase*);
-  bool (*is_cancelled_)(const BindStateBase*);
-
-  DISALLOW_COPY_AND_ASSIGN(BindStateBase);
-};
-
-// Holds the Callback methods that don't require specialization to reduce
-// template bloat.
-// CallbackBase<MoveOnly> is a direct base class of MoveOnly callbacks, and
-// CallbackBase<Copyable> uses CallbackBase<MoveOnly> for its implementation.
-class CallbackBase {
- public:
-  CallbackBase(CallbackBase&& c) noexcept;
-  CallbackBase& operator=(CallbackBase&& c) noexcept;
-
-  explicit CallbackBase(const CallbackBaseCopyable& c);
-  CallbackBase& operator=(const CallbackBaseCopyable& c);
-
-  explicit CallbackBase(CallbackBaseCopyable&& c) noexcept;
-  CallbackBase& operator=(CallbackBaseCopyable&& c) noexcept;
-
-  // Returns true if Callback is null (doesn't refer to anything).
-  bool is_null() const { return !bind_state_; }
-  explicit operator bool() const { return !is_null(); }
-
-  // Returns true if the callback invocation will be nop due to an cancellation.
-  // It's invalid to call this on uninitialized callback.
-  bool IsCancelled() const;
-
-  // Returns the Callback into an uninitialized state.
-  void Reset();
-
- protected:
-  using InvokeFuncStorage = BindStateBase::InvokeFuncStorage;
-
-  // Returns true if this callback equals |other|. |other| may be null.
-  bool EqualsInternal(const CallbackBase& other) const;
-
-  constexpr inline CallbackBase();
-
-  // Allow initializing of |bind_state_| via the constructor to avoid default
-  // initialization of the scoped_refptr.
-  explicit CallbackBase(BindStateBase* bind_state);
-
-  InvokeFuncStorage polymorphic_invoke() const {
-    return bind_state_->polymorphic_invoke_;
-  }
-
-  // Force the destructor to be instantiated inside this translation unit so
-  // that our subclasses will not get inlined versions.  Avoids more template
-  // bloat.
-  ~CallbackBase();
-
-  scoped_refptr<BindStateBase> bind_state_;
-};
-
-constexpr CallbackBase::CallbackBase() = default;
-
-// CallbackBase<Copyable> is a direct base class of Copyable Callbacks.
-class CallbackBaseCopyable : public CallbackBase {
- public:
-  CallbackBaseCopyable(const CallbackBaseCopyable& c);
-  CallbackBaseCopyable(CallbackBaseCopyable&& c) noexcept;
-  CallbackBaseCopyable& operator=(const CallbackBaseCopyable& c);
-  CallbackBaseCopyable& operator=(CallbackBaseCopyable&& c) noexcept;
-
- protected:
-  constexpr CallbackBaseCopyable() = default;
-  explicit CallbackBaseCopyable(BindStateBase* bind_state)
-      : CallbackBase(bind_state) {}
-  ~CallbackBaseCopyable() = default;
-};
-
-}  // namespace internal
-}  // namespace base
-
-#endif  // BASE_CALLBACK_INTERNAL_H_
diff --git a/base/logging.cc b/base/logging.cc
index 11cef81..a8ccd6f 100644
--- a/base/logging.cc
+++ b/base/logging.cc
@@ -46,8 +46,6 @@
 #include <string_view>
 #include <utility>
 
-#include "base/callback.h"
-#include "base/containers/stack.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
diff --git a/base/logging.h b/base/logging.h
index 78c0861..c581d33 100644
--- a/base/logging.h
+++ b/base/logging.h
@@ -15,7 +15,6 @@
 #include <type_traits>
 #include <utility>
 
-#include "base/callback_forward.h"
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/template_util.h"
diff --git a/build/gen.py b/build/gen.py
index 5011ea9..64e3f55 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -387,7 +387,6 @@
 
   static_libraries = {
       'base': {'sources': [
-        'base/callback_internal.cc',
         'base/command_line.cc',
         'base/environment.cc',
         'base/files/file.cc',
diff --git a/tools/gn/build_settings.cc b/tools/gn/build_settings.cc
index 711c6b8..46e7944 100644
--- a/tools/gn/build_settings.cc
+++ b/tools/gn/build_settings.cc
@@ -70,6 +70,6 @@
 
 void BuildSettings::ItemDefined(std::unique_ptr<Item> item) const {
   DCHECK(item);
-  if (!item_defined_callback_.is_null())
-    item_defined_callback_.Run(std::move(item));
+  if (item_defined_callback_)
+    item_defined_callback_(std::move(item));
 }
diff --git a/tools/gn/build_settings.h b/tools/gn/build_settings.h
index 40049d9..ef84f15 100644
--- a/tools/gn/build_settings.h
+++ b/tools/gn/build_settings.h
@@ -5,12 +5,12 @@
 #ifndef TOOLS_GN_BUILD_SETTINGS_H_
 #define TOOLS_GN_BUILD_SETTINGS_H_
 
+#include <functional>
 #include <map>
 #include <memory>
 #include <set>
 #include <utility>
 
-#include "base/callback.h"
 #include "base/files/file_path.h"
 #include "base/macros.h"
 #include "tools/gn/args.h"
@@ -25,8 +25,8 @@
 // may be multiple Settings objects that refer to this, one for each toolchain.
 class BuildSettings {
  public:
-  using ItemDefinedCallback = base::Callback<void(std::unique_ptr<Item>)>;
-  using PrintCallback = base::Callback<void(const std::string&)>;
+  using ItemDefinedCallback = std::function<void(std::unique_ptr<Item>)>;
+  using PrintCallback = std::function<void(const std::string&)>;
 
   BuildSettings();
   BuildSettings(const BuildSettings& other);
diff --git a/tools/gn/builder.cc b/tools/gn/builder.cc
index bbdb182..2482983 100644
--- a/tools/gn/builder.cc
+++ b/tools/gn/builder.cc
@@ -438,8 +438,8 @@
     record->set_should_generate(true);
 
     // This may have caused the item to go into "resolved and generated" state.
-    if (record->resolved() && !resolved_and_generated_callback_.is_null())
-      resolved_and_generated_callback_.Run(record);
+    if (record->resolved() && resolved_and_generated_callback_)
+      resolved_and_generated_callback_(record);
   } else if (!force) {
     return;  // Already set and we're not required to iterate dependencies.
   }
@@ -487,8 +487,8 @@
 
   if (!record->item()->OnResolved(err))
     return false;
-  if (record->should_generate() && !resolved_and_generated_callback_.is_null())
-    resolved_and_generated_callback_.Run(record);
+  if (record->should_generate() && resolved_and_generated_callback_)
+    resolved_and_generated_callback_(record);
 
   // Recursively update everybody waiting on this item to be resolved.
   for (BuilderRecord* waiting : record->waiting_on_resolution()) {
diff --git a/tools/gn/builder.h b/tools/gn/builder.h
index 62f4f96..f2996ca 100644
--- a/tools/gn/builder.h
+++ b/tools/gn/builder.h
@@ -5,10 +5,10 @@
 #ifndef TOOLS_GN_BUILDER_H_
 #define TOOLS_GN_BUILDER_H_
 
+#include <functional>
 #include <map>
 #include <memory>
 
-#include "base/callback.h"
 #include "base/macros.h"
 #include "tools/gn/builder_record.h"
 #include "tools/gn/label.h"
@@ -24,7 +24,7 @@
 // the main thread only. See also BuilderRecord.
 class Builder {
  public:
-  using ResolvedGeneratedCallback = base::Callback<void(const BuilderRecord*)>;
+  using ResolvedGeneratedCallback = std::function<void(const BuilderRecord*)>;
 
   explicit Builder(Loader* loader);
   ~Builder();
diff --git a/tools/gn/command_gen.cc b/tools/gn/command_gen.cc
index 200aad8..707c9e2 100644
--- a/tools/gn/command_gen.cc
+++ b/tools/gn/command_gen.cc
@@ -4,7 +4,6 @@
 
 #include <mutex>
 
-#include "base/bind.h"
 #include "base/command_line.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -78,7 +77,7 @@
   const Target* target = item->AsTarget();
   if (target) {
     g_scheduler->ScheduleWork(
-        base::Bind(&BackgroundDoWrite, write_info, target));
+        [write_info, target]() { BackgroundDoWrite(write_info, target); });
   }
 }
 
@@ -461,7 +460,9 @@
   // Cause the load to also generate the ninja files for each target.
   TargetWriteInfo write_info;
   setup->builder().set_resolved_and_generated_callback(
-      base::Bind(&ItemResolvedAndGeneratedCallback, &write_info));
+      [&write_info](const BuilderRecord* record) {
+        ItemResolvedAndGeneratedCallback(&write_info, record);
+      });
 
   // Do the actual load. This will also write out the target ninja files.
   if (!setup->Run())
diff --git a/tools/gn/functions.cc b/tools/gn/functions.cc
index 74b48bc..937ffd2 100644
--- a/tools/gn/functions.cc
+++ b/tools/gn/functions.cc
@@ -1022,11 +1022,12 @@
 
   const BuildSettings::PrintCallback& cb =
       scope->settings()->build_settings()->print_callback();
-  if (cb.is_null()) {
+  if (cb) {
+    cb(output);
+  } else {
     printf("%s", output.c_str());
     fflush(stdout);
-  } else
-    cb.Run(output);
+  }
 
   return Value();
 }
diff --git a/tools/gn/header_checker.cc b/tools/gn/header_checker.cc
index f4af9d8..d9ff4b2 100644
--- a/tools/gn/header_checker.cc
+++ b/tools/gn/header_checker.cc
@@ -6,7 +6,6 @@
 
 #include <algorithm>
 
-#include "base/bind.h"
 #include "base/containers/queue.h"
 #include "base/files/file_util.h"
 #include "base/strings/string_util.h"
@@ -173,8 +172,9 @@
     for (const auto& vect_i : file.second) {
       if (vect_i.target->check_includes()) {
         task_count_.Increment();
-        pool.PostTask(base::BindOnce(&HeaderChecker::DoWork, this,
-                                     vect_i.target, file.first));
+        pool.PostTask([this, target = vect_i.target, file = file.first]() {
+          DoWork(target, file);
+        });
       }
     }
   }
diff --git a/tools/gn/header_checker.h b/tools/gn/header_checker.h
index 786edcb..b668441 100644
--- a/tools/gn/header_checker.h
+++ b/tools/gn/header_checker.h
@@ -6,6 +6,7 @@
 #define TOOLS_GN_HEADER_CHECKER_H_
 
 #include <condition_variable>
+#include <functional>
 #include <map>
 #include <mutex>
 #include <set>
@@ -96,8 +97,7 @@
 
   using TargetVector = std::vector<TargetInfo>;
   using FileMap = std::map<SourceFile, TargetVector>;
-  using PathExistsCallback =
-      base::RepeatingCallback<bool(const base::FilePath& path)>;
+  using PathExistsCallback = std::function<bool(const base::FilePath& path)>;
 
   // Backend for Run() that takes the list of files to check. The errors_ list
   // will be populate on failure.
diff --git a/tools/gn/header_checker_unittest.cc b/tools/gn/header_checker_unittest.cc
index c6529d5..4243696 100644
--- a/tools/gn/header_checker_unittest.cc
+++ b/tools/gn/header_checker_unittest.cc
@@ -5,7 +5,6 @@
 #include <ostream>
 #include <vector>
 
-#include "base/bind.h"
 #include "tools/gn/config.h"
 #include "tools/gn/header_checker.h"
 #include "tools/gn/scheduler.h"
diff --git a/tools/gn/input_file_manager.cc b/tools/gn/input_file_manager.cc
index aad8cc8..320e7a5 100644
--- a/tools/gn/input_file_manager.cc
+++ b/tools/gn/input_file_manager.cc
@@ -7,7 +7,6 @@
 #include <memory>
 #include <utility>
 
-#include "base/bind.h"
 #include "base/stl_util.h"
 #include "tools/gn/filesystem_utils.h"
 #include "tools/gn/parser.h"
@@ -31,7 +30,7 @@
 
 void InvokeFileLoadCallback(const InputFileManager::FileLoadCallback& cb,
                             const ParseNode* node) {
-  cb.Run(node);
+  cb(node);
 }
 
 bool DoLoadFile(const LocationRange& origin,
@@ -111,7 +110,7 @@
   // Try not to schedule callbacks while holding the lock. All cases that don't
   // want to schedule should return early. Otherwise, this will be scheduled
   // after we leave the lock.
-  Task schedule_this;
+  std::function<void()> schedule_this;
   {
     std::lock_guard<std::mutex> lock(lock_);
 
@@ -121,9 +120,10 @@
       std::unique_ptr<InputFileData> data =
           std::make_unique<InputFileData>(file_name);
       data->scheduled_callbacks.push_back(callback);
-      schedule_this =
-          base::BindOnce(&InputFileManager::BackgroundLoadFile, this, origin,
-                         build_settings, file_name, &data->file);
+      schedule_this = [this, origin, build_settings, file_name,
+                       file = &data->file]() {
+        BackgroundLoadFile(origin, build_settings, file_name, file);
+      };
       input_files_[file_name] = std::move(data);
 
     } else {
@@ -146,8 +146,9 @@
 
       if (data->loaded) {
         // Can just directly issue the callback on the background thread.
-        schedule_this = base::BindOnce(&InvokeFileLoadCallback, callback,
-                                       data->parsed_root.get());
+        schedule_this = [callback, root = data->parsed_root.get()]() {
+          InvokeFileLoadCallback(callback, root);
+        };
       } else {
         // Load is pending on this file, schedule the invoke.
         data->scheduled_callbacks.push_back(callback);
@@ -326,7 +327,7 @@
   // item in the list, so that's extra overhead and complexity for no gain.
   if (success) {
     for (const auto& cb : callbacks)
-      cb.Run(unowned_root);
+      cb(unowned_root);
   }
   return success;
 }
diff --git a/tools/gn/input_file_manager.h b/tools/gn/input_file_manager.h
index c4f19e9..9676f2f 100644
--- a/tools/gn/input_file_manager.h
+++ b/tools/gn/input_file_manager.h
@@ -5,13 +5,13 @@
 #ifndef TOOLS_GN_INPUT_FILE_MANAGER_H_
 #define TOOLS_GN_INPUT_FILE_MANAGER_H_
 
+#include <functional>
 #include <mutex>
 #include <set>
 #include <unordered_map>
 #include <utility>
 #include <vector>
 
-#include "base/callback.h"
 #include "base/files/file_path.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
@@ -38,7 +38,7 @@
  public:
   // Callback issued when a file is laoded. On auccess, the parse node will
   // refer to the root block of the file. On failure, this will be NULL.
-  using FileLoadCallback = base::Callback<void(const ParseNode*)>;
+  using FileLoadCallback = std::function<void(const ParseNode*)>;
 
   InputFileManager();
 
diff --git a/tools/gn/loader.cc b/tools/gn/loader.cc
index d1a2953..148ba39 100644
--- a/tools/gn/loader.cc
+++ b/tools/gn/loader.cc
@@ -6,7 +6,6 @@
 
 #include <memory>
 
-#include "base/bind.h"
 #include "tools/gn/build_settings.h"
 #include "tools/gn/err.h"
 #include "tools/gn/filesystem_utils.h"
@@ -208,10 +207,12 @@
                                   const SourceFile& file) {
   Err err;
   pending_loads_++;
-  if (!AsyncLoadFile(origin, settings->build_settings(), file,
-                     base::Bind(&LoaderImpl::BackgroundLoadFile, this, settings,
-                                file, origin),
-                     &err)) {
+  if (!AsyncLoadFile(
+          origin, settings->build_settings(), file,
+          [this, settings, file, origin](const ParseNode* parse_node) {
+            BackgroundLoadFile(settings, file, origin, parse_node);
+          },
+          &err)) {
     g_scheduler->FailWithError(err);
     DecrementPendingLoads();
   }
@@ -222,11 +223,13 @@
     const Scope::KeyValueMap& toolchain_overrides) {
   Err err;
   pending_loads_++;
-  if (!AsyncLoadFile(LocationRange(), settings->build_settings(),
-                     settings->build_settings()->build_config_file(),
-                     base::Bind(&LoaderImpl::BackgroundLoadBuildConfig, this,
-                                settings, toolchain_overrides),
-                     &err)) {
+  if (!AsyncLoadFile(
+          LocationRange(), settings->build_settings(),
+          settings->build_settings()->build_config_file(),
+          [this, settings, toolchain_overrides](const ParseNode* root) {
+            BackgroundLoadBuildConfig(settings, toolchain_overrides, root);
+          },
+          &err)) {
     g_scheduler->FailWithError(err);
     DecrementPendingLoads();
   }
@@ -237,8 +240,7 @@
                                     const LocationRange& origin,
                                     const ParseNode* root) {
   if (!root) {
-    task_runner_->PostTask(
-        base::BindOnce(&LoaderImpl::DecrementPendingLoads, this));
+    task_runner_->PostTask([this]() { DecrementPendingLoads(); });
     return;
   }
 
@@ -277,7 +279,7 @@
 
   trace.Done();
 
-  task_runner_->PostTask(base::BindOnce(&LoaderImpl::DidLoadFile, this));
+  task_runner_->PostTask([this]() { DidLoadFile(); });
 }
 
 void LoaderImpl::BackgroundLoadBuildConfig(
@@ -285,8 +287,7 @@
     const Scope::KeyValueMap& toolchain_overrides,
     const ParseNode* root) {
   if (!root) {
-    task_runner_->PostTask(
-        base::BindOnce(&LoaderImpl::DecrementPendingLoads, this));
+    task_runner_->PostTask([this]() { DecrementPendingLoads(); });
     return;
   }
 
@@ -348,8 +349,10 @@
     }
   }
 
-  task_runner_->PostTask(base::BindOnce(&LoaderImpl::DidLoadBuildConfig, this,
-                                        settings->toolchain_label()));
+  task_runner_->PostTask(
+      [this, toolchain_label = settings->toolchain_label()]() {
+        DidLoadBuildConfig(toolchain_label);
+      });
 }
 
 void LoaderImpl::DidLoadFile() {
@@ -419,19 +422,19 @@
 void LoaderImpl::DecrementPendingLoads() {
   DCHECK_GT(pending_loads_, 0);
   pending_loads_--;
-  if (pending_loads_ == 0 && !complete_callback_.is_null())
-    complete_callback_.Run();
+  if (pending_loads_ == 0 && complete_callback_)
+    complete_callback_();
 }
 
-bool LoaderImpl::AsyncLoadFile(
-    const LocationRange& origin,
-    const BuildSettings* build_settings,
-    const SourceFile& file_name,
-    const base::Callback<void(const ParseNode*)>& callback,
-    Err* err) {
-  if (async_load_file_.is_null()) {
-    return g_scheduler->input_file_manager()->AsyncLoadFile(
-        origin, build_settings, file_name, callback, err);
+bool LoaderImpl::AsyncLoadFile(const LocationRange& origin,
+                               const BuildSettings* build_settings,
+                               const SourceFile& file_name,
+                               std::function<void(const ParseNode*)> callback,
+                               Err* err) {
+  if (async_load_file_) {
+    return async_load_file_(origin, build_settings, file_name,
+                            std::move(callback), err);
   }
-  return async_load_file_.Run(origin, build_settings, file_name, callback, err);
+  return g_scheduler->input_file_manager()->AsyncLoadFile(
+      origin, build_settings, file_name, std::move(callback), err);
 }
diff --git a/tools/gn/loader.h b/tools/gn/loader.h
index 06737c3..bd679bb 100644
--- a/tools/gn/loader.h
+++ b/tools/gn/loader.h
@@ -5,11 +5,11 @@
 #ifndef TOOLS_GN_LOADER_H_
 #define TOOLS_GN_LOADER_H_
 
+#include <functional>
 #include <map>
 #include <memory>
 #include <set>
 
-#include "base/callback.h"
 #include "base/memory/ref_counted.h"
 #include "tools/gn/label.h"
 #include "tools/gn/scope.h"
@@ -72,11 +72,11 @@
  public:
   // Callback to emulate InputFileManager::AsyncLoadFile.
   using AsyncLoadFileCallback =
-      base::Callback<bool(const LocationRange&,
-                          const BuildSettings*,
-                          const SourceFile&,
-                          const base::Callback<void(const ParseNode*)>&,
-                          Err*)>;
+      std::function<bool(const LocationRange&,
+                         const BuildSettings*,
+                         const SourceFile&,
+                         std::function<void(const ParseNode*)>,
+                         Err*)>;
 
   explicit LoaderImpl(const BuildSettings* build_settings);
 
@@ -96,13 +96,13 @@
   // The complete callback is called whenever there are no more pending loads.
   // Called on the main thread only. This may be called more than once if the
   // queue is drained, but then more stuff gets added.
-  void set_complete_callback(const base::Closure& cb) {
-    complete_callback_ = cb;
+  void set_complete_callback(std::function<void()> cb) {
+    complete_callback_ = std::move(cb);
   }
 
   // This callback is used when the loader finds it wants to load a file.
-  void set_async_load_file(const AsyncLoadFileCallback& cb) {
-    async_load_file_ = cb;
+  void set_async_load_file(AsyncLoadFileCallback cb) {
+    async_load_file_ = std::move(cb);
   }
 
   const Label& default_toolchain_label() const {
@@ -152,13 +152,13 @@
   bool AsyncLoadFile(const LocationRange& origin,
                      const BuildSettings* build_settings,
                      const SourceFile& file_name,
-                     const base::Callback<void(const ParseNode*)>& callback,
+                     std::function<void(const ParseNode*)> callback,
                      Err* err);
 
   MsgLoop* task_runner_;
 
   int pending_loads_;
-  base::Closure complete_callback_;
+  std::function<void()> complete_callback_;
 
   // When non-null, use this callback instead of the InputFileManager for
   // mocking purposes.
diff --git a/tools/gn/loader_unittest.cc b/tools/gn/loader_unittest.cc
index 83a2389..ede20d7 100644
--- a/tools/gn/loader_unittest.cc
+++ b/tools/gn/loader_unittest.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <functional>
 #include <map>
 #include <memory>
 #include <utility>
 #include <vector>
 
-#include "base/bind.h"
 #include "tools/gn/build_settings.h"
 #include "tools/gn/err.h"
 #include "tools/gn/loader.h"
@@ -52,7 +52,7 @@
 
 class MockInputFileManager {
  public:
-  using Callback = base::Callback<void(const ParseNode*)>;
+  using Callback = std::function<void(const ParseNode*)>;
 
   MockInputFileManager() = default;
 
@@ -91,8 +91,11 @@
 };
 
 LoaderImpl::AsyncLoadFileCallback MockInputFileManager::GetCallback() {
-  return base::Bind(&MockInputFileManager::AsyncLoadFile,
-                    base::Unretained(this));
+  return
+      [this](const LocationRange& origin, const BuildSettings* build_settings,
+             const SourceFile& file_name, const Callback& callback, Err* err) {
+        return AsyncLoadFile(origin, build_settings, file_name, callback, err);
+      };
 }
 
 // Sets a given response for a given source file.
@@ -131,9 +134,9 @@
   for (const auto& cur : pending_) {
     CannedResponseMap::const_iterator found = canned_responses_.find(cur.first);
     if (found == canned_responses_.end())
-      cur.second.Run(&block);
+      cur.second(&block);
     else
-      cur.second.Run(found->second->root.get());
+      cur.second(found->second->root.get());
   }
   pending_.clear();
 }
@@ -217,8 +220,10 @@
   SourceFile build_config("//build/config/BUILDCONFIG.gn");
   SourceFile root_build("//BUILD.gn");
   build_settings_.set_build_config_file(build_config);
-  build_settings_.set_item_defined_callback(base::Bind(
-      &MockBuilder::OnItemDefined, base::Unretained(&mock_builder_)));
+  build_settings_.set_item_defined_callback(
+      [builder = &mock_builder_](std::unique_ptr<Item> item) {
+        builder->OnItemDefined(std::move(item));
+      });
 
   scoped_refptr<LoaderImpl> loader(new LoaderImpl(&build_settings_));
   mock_ifm_.AddCannedResponse(build_config,
diff --git a/tools/gn/scheduler.cc b/tools/gn/scheduler.cc
index f4960b9..a37d62d 100644
--- a/tools/gn/scheduler.cc
+++ b/tools/gn/scheduler.cc
@@ -6,7 +6,6 @@
 
 #include <algorithm>
 
-#include "base/bind.h"
 #include "tools/gn/standard_out.h"
 #include "tools/gn/target.h"
 
@@ -40,8 +39,7 @@
 }
 
 void Scheduler::Log(const std::string& verb, const std::string& msg) {
-  task_runner()->PostTask(base::BindOnce(&Scheduler::LogOnMainThread,
-                                         base::Unretained(this), verb, msg));
+  task_runner()->PostTask([this, verb, msg]() { LogOnMainThread(verb, msg); });
 }
 
 void Scheduler::FailWithError(const Err& err) {
@@ -54,23 +52,20 @@
     is_failed_ = true;
   }
 
-  task_runner()->PostTask(base::BindOnce(&Scheduler::FailWithErrorOnMainThread,
-                                         base::Unretained(this), err));
+  task_runner()->PostTask([this, err]() { FailWithErrorOnMainThread(err); });
 }
 
-void Scheduler::ScheduleWork(Task work) {
+void Scheduler::ScheduleWork(std::function<void()> work) {
   IncrementWorkCount();
   pool_work_count_.Increment();
-  worker_pool_.PostTask(base::BindOnce(
-      [](Scheduler* self, Task work) {
-        std::move(work).Run();
-        self->DecrementWorkCount();
-        if (!self->pool_work_count_.Decrement()) {
-          std::unique_lock<std::mutex> auto_lock(self->pool_work_count_lock_);
-          self->pool_work_count_cv_.notify_one();
-        }
-      },
-      this, std::move(work)));
+  worker_pool_.PostTask([this, work = std::move(work)]() {
+    work();
+    DecrementWorkCount();
+    if (!pool_work_count_.Decrement()) {
+      std::unique_lock<std::mutex> auto_lock(pool_work_count_lock_);
+      pool_work_count_cv_.notify_one();
+    }
+  });
 }
 
 void Scheduler::AddGenDependency(const base::FilePath& file) {
@@ -154,8 +149,7 @@
 
 void Scheduler::DecrementWorkCount() {
   if (!work_count_.Decrement()) {
-    task_runner()->PostTask(
-        base::BindOnce(&Scheduler::OnComplete, base::Unretained(this)));
+    task_runner()->PostTask([this]() { OnComplete(); });
   }
 }
 
diff --git a/tools/gn/scheduler.h b/tools/gn/scheduler.h
index d005df5..395b115 100644
--- a/tools/gn/scheduler.h
+++ b/tools/gn/scheduler.h
@@ -6,6 +6,7 @@
 #define TOOLS_GN_SCHEDULER_H_
 
 #include <condition_variable>
+#include <functional>
 #include <map>
 #include <mutex>
 
@@ -17,7 +18,6 @@
 #include "tools/gn/source_file.h"
 #include "tools/gn/token.h"
 #include "util/msg_loop.h"
-#include "util/task.h"
 #include "util/worker_pool.h"
 
 class Target;
@@ -46,7 +46,7 @@
   void Log(const std::string& verb, const std::string& msg);
   void FailWithError(const Err& err);
 
-  void ScheduleWork(Task work);
+  void ScheduleWork(std::function<void()> work);
 
   void Shutdown();
 
diff --git a/tools/gn/setup.cc b/tools/gn/setup.cc
index 16e09fe..7540a8c 100644
--- a/tools/gn/setup.cc
+++ b/tools/gn/setup.cc
@@ -11,7 +11,6 @@
 #include <sstream>
 #include <utility>
 
-#include "base/bind.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
@@ -178,13 +177,15 @@
   // this call completing on the main thread, the 'Complete' function will
   // be signaled and we'll stop running with an incomplete build.
   g_scheduler->IncrementWorkCount();
-  task_runner->PostTask(base::BindOnce(
-      [](Builder* builder_call_on_main_thread_only,
-         std::unique_ptr<Item> item) {
-        builder_call_on_main_thread_only->ItemDefined(std::move(item));
+
+  // Work around issue binding a unique_ptr with std::function by moving into a
+  // shared_ptr.
+  auto item_shared = std::make_shared<std::unique_ptr<Item>>(std::move(item));
+  task_runner->PostTask(
+      [builder_call_on_main_thread_only, item_shared]() mutable {
+        builder_call_on_main_thread_only->ItemDefined(std::move(*item_shared));
         g_scheduler->DecrementWorkCount();
-      },
-      builder_call_on_main_thread_only, base::Passed(&item)));
+      });
 }
 
 void DecrementWorkCount() {
@@ -306,9 +307,12 @@
   dotfile_settings_.set_toolchain_label(Label());
 
   build_settings_.set_item_defined_callback(
-      base::Bind(&ItemDefinedCallback, scheduler_.task_runner(), &builder_));
+      [task_runner = scheduler_.task_runner(),
+       builder = &builder_](std::unique_ptr<Item> item) {
+        ItemDefinedCallback(task_runner, builder, std::move(item));
+      });
 
-  loader_->set_complete_callback(base::Bind(&DecrementWorkCount));
+  loader_->set_complete_callback(&DecrementWorkCount);
   // The scheduler's task runner wasn't created when the Loader was created, so
   // we need to set it now.
   loader_->set_task_runner(scheduler_.task_runner());
diff --git a/tools/gn/target.cc b/tools/gn/target.cc
index 8a5b989..5b3d603 100644
--- a/tools/gn/target.cc
+++ b/tools/gn/target.cc
@@ -6,7 +6,6 @@
 
 #include <stddef.h>
 
-#include "base/bind.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
diff --git a/tools/gn/test_with_scope.cc b/tools/gn/test_with_scope.cc
index 80d9692..5025420 100644
--- a/tools/gn/test_with_scope.cc
+++ b/tools/gn/test_with_scope.cc
@@ -7,7 +7,6 @@
 #include <memory>
 #include <utility>
 
-#include "base/bind.h"
 #include "tools/gn/parser.h"
 #include "tools/gn/tokenizer.h"
 
@@ -28,7 +27,7 @@
       scope_(&settings_),
       scope_progammatic_provider_(&scope_, true) {
   build_settings_.set_print_callback(
-      base::Bind(&TestWithScope::AppendPrintOutput, base::Unretained(this)));
+      [this](const std::string& str) { AppendPrintOutput(str); });
 
   settings_.set_toolchain_label(toolchain_.label());
   settings_.set_default_toolchain_label(toolchain_.label());
diff --git a/util/msg_loop.cc b/util/msg_loop.cc
index dbb92cf..1566532 100644
--- a/util/msg_loop.cc
+++ b/util/msg_loop.cc
@@ -23,7 +23,7 @@
 
 void MsgLoop::Run() {
   while (!should_quit_) {
-    Task task;
+    std::function<void()> task;
     {
       std::unique_lock<std::mutex> queue_lock(queue_mutex_);
       notifier_.wait(queue_lock, [this]() {
@@ -37,16 +37,15 @@
       task_queue_.pop();
     }
 
-    std::move(task).Run();
+    task();
   }
 }
 
 void MsgLoop::PostQuit() {
-  PostTask(
-      base::BindOnce([](MsgLoop* self) { self->should_quit_ = true; }, this));
+  PostTask([this]() { should_quit_ = true; });
 }
 
-void MsgLoop::PostTask(Task work) {
+void MsgLoop::PostTask(std::function<void()> work) {
   {
     std::unique_lock<std::mutex> queue_lock(queue_mutex_);
     task_queue_.emplace(std::move(work));
@@ -57,7 +56,7 @@
 
 void MsgLoop::RunUntilIdleForTesting() {
   for (bool done = false; !done;) {
-    Task task;
+    std::function<void()> task;
     {
       std::unique_lock<std::mutex> queue_lock(queue_mutex_);
       task = std::move(task_queue_.front());
@@ -67,7 +66,7 @@
         done = true;
     }
 
-    std::move(task).Run();
+    task();
   }
 }
 
diff --git a/util/msg_loop.h b/util/msg_loop.h
index 267d2a9..b6e1ec7 100644
--- a/util/msg_loop.h
+++ b/util/msg_loop.h
@@ -6,9 +6,9 @@
 #define UTIL_RUN_LOOP_H_
 
 #include "base/macros.h"
-#include "util/task.h"
 
 #include <condition_variable>
+#include <functional>
 #include <mutex>
 #include <queue>
 
@@ -26,7 +26,7 @@
 
   // Posts a work item to this queue. All items will be run on the thread from
   // which Run() was called. Can be called from any thread.
-  void PostTask(Task task);
+  void PostTask(std::function<void()> task);
 
   // Run()s until the queue is empty. Should only be used (carefully) in tests.
   void RunUntilIdleForTesting();
@@ -37,7 +37,7 @@
 
  private:
   std::mutex queue_mutex_;
-  std::queue<Task> task_queue_;
+  std::queue<std::function<void()>> task_queue_;
   std::condition_variable notifier_;
   bool should_quit_ = false;
 
diff --git a/util/task.h b/util/task.h
deleted file mode 100644
index 278ff13..0000000
--- a/util/task.h
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2018 The Chromium 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 UTIL_TASK_H_
-#define UTIL_TASK_H_
-
-#include "base/bind.h"
-#include "base/callback.h"
-
-using Task = base::OnceClosure;
-
-#endif  // UTIL_TASK_H_
diff --git a/util/worker_pool.cc b/util/worker_pool.cc
index 60bcfbf..3c049a9 100644
--- a/util/worker_pool.cc
+++ b/util/worker_pool.cc
@@ -117,7 +117,7 @@
   }
 }
 
-void WorkerPool::PostTask(Task work) {
+void WorkerPool::PostTask(std::function<void()> work) {
   {
     std::unique_lock<std::mutex> queue_lock(queue_mutex_);
     CHECK(!should_stop_processing_);
@@ -129,7 +129,7 @@
 
 void WorkerPool::Worker() {
   for (;;) {
-    Task task;
+    std::function<void()> task;
 
     {
       std::unique_lock<std::mutex> queue_lock(queue_mutex_);
@@ -145,6 +145,6 @@
       task_queue_.pop();
     }
 
-    std::move(task).Run();
+    task();
   }
 }
diff --git a/util/worker_pool.h b/util/worker_pool.h
index d061644..7284ebe 100644
--- a/util/worker_pool.h
+++ b/util/worker_pool.h
@@ -6,13 +6,13 @@
 #define UTIL_WORKER_POOL_H_
 
 #include <condition_variable>
+#include <functional>
 #include <mutex>
 #include <queue>
 #include <thread>
 
 #include "base/logging.h"
 #include "base/macros.h"
-#include "util/task.h"
 
 class WorkerPool {
  public:
@@ -20,13 +20,13 @@
   WorkerPool(size_t thread_count);
   ~WorkerPool();
 
-  void PostTask(Task work);
+  void PostTask(std::function<void()> work);
 
  private:
   void Worker();
 
   std::vector<std::thread> threads_;
-  std::queue<base::OnceClosure> task_queue_;
+  std::queue<std::function<void()>> task_queue_;
   std::mutex queue_mutex_;
   std::condition_variable_any pool_notifier_;
   bool should_stop_processing_;