|  | // 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_HELPERS_H_ | 
|  | #define BASE_BIND_HELPERS_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  |  | 
|  | #include <type_traits> | 
|  | #include <utility> | 
|  |  | 
|  | #include "base/bind.h" | 
|  | #include "base/callback.h" | 
|  | #include "base/memory/weak_ptr.h" | 
|  | #include "build_config.h" | 
|  |  | 
|  | // This defines a set of simple functions and utilities that people want when | 
|  | // using Callback<> and Bind(). | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | // Creates a null callback. | 
|  | class BASE_EXPORT NullCallback { | 
|  | public: | 
|  | template <typename R, typename... Args> | 
|  | operator RepeatingCallback<R(Args...)>() const { | 
|  | return RepeatingCallback<R(Args...)>(); | 
|  | } | 
|  | template <typename R, typename... Args> | 
|  | operator OnceCallback<R(Args...)>() const { | 
|  | return OnceCallback<R(Args...)>(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | // Creates a callback that does nothing when called. | 
|  | class BASE_EXPORT DoNothing { | 
|  | public: | 
|  | template <typename... Args> | 
|  | operator RepeatingCallback<void(Args...)>() const { | 
|  | return Repeatedly<Args...>(); | 
|  | } | 
|  | template <typename... Args> | 
|  | operator OnceCallback<void(Args...)>() const { | 
|  | return Once<Args...>(); | 
|  | } | 
|  | // Explicit way of specifying a specific callback type when the compiler can't | 
|  | // deduce it. | 
|  | template <typename... Args> | 
|  | static RepeatingCallback<void(Args...)> Repeatedly() { | 
|  | return BindRepeating([](Args... args) {}); | 
|  | } | 
|  | template <typename... Args> | 
|  | static OnceCallback<void(Args...)> Once() { | 
|  | return BindOnce([](Args... args) {}); | 
|  | } | 
|  | }; | 
|  |  | 
|  | // Useful for creating a Closure that will delete a pointer when invoked. Only | 
|  | // use this when necessary. In most cases MessageLoop::DeleteSoon() is a better | 
|  | // fit. | 
|  | template <typename T> | 
|  | void DeletePointer(T* obj) { | 
|  | delete obj; | 
|  | } | 
|  |  | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_BIND_HELPERS_H_ |