1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_BIND_HELPERS_H_ 6*635a8641SAndroid Build Coastguard Worker #define BASE_BIND_HELPERS_H_ 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker #include <stddef.h> 9*635a8641SAndroid Build Coastguard Worker 10*635a8641SAndroid Build Coastguard Worker #include <type_traits> 11*635a8641SAndroid Build Coastguard Worker #include <utility> 12*635a8641SAndroid Build Coastguard Worker 13*635a8641SAndroid Build Coastguard Worker #include "base/bind.h" 14*635a8641SAndroid Build Coastguard Worker #include "base/callback.h" 15*635a8641SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 16*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h" 17*635a8641SAndroid Build Coastguard Worker 18*635a8641SAndroid Build Coastguard Worker // This defines a set of simple functions and utilities that people want when 19*635a8641SAndroid Build Coastguard Worker // using Callback<> and Bind(). 20*635a8641SAndroid Build Coastguard Worker 21*635a8641SAndroid Build Coastguard Worker namespace base { 22*635a8641SAndroid Build Coastguard Worker 23*635a8641SAndroid Build Coastguard Worker // Creates a null callback. 24*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT NullCallback { 25*635a8641SAndroid Build Coastguard Worker public: 26*635a8641SAndroid Build Coastguard Worker template <typename R, typename... Args> 27*635a8641SAndroid Build Coastguard Worker operator RepeatingCallback<R(Args...)>() const { 28*635a8641SAndroid Build Coastguard Worker return RepeatingCallback<R(Args...)>(); 29*635a8641SAndroid Build Coastguard Worker } 30*635a8641SAndroid Build Coastguard Worker template <typename R, typename... Args> 31*635a8641SAndroid Build Coastguard Worker operator OnceCallback<R(Args...)>() const { 32*635a8641SAndroid Build Coastguard Worker return OnceCallback<R(Args...)>(); 33*635a8641SAndroid Build Coastguard Worker } 34*635a8641SAndroid Build Coastguard Worker }; 35*635a8641SAndroid Build Coastguard Worker 36*635a8641SAndroid Build Coastguard Worker // Creates a callback that does nothing when called. 37*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT DoNothing { 38*635a8641SAndroid Build Coastguard Worker public: 39*635a8641SAndroid Build Coastguard Worker template <typename... Args> 40*635a8641SAndroid Build Coastguard Worker operator RepeatingCallback<void(Args...)>() const { 41*635a8641SAndroid Build Coastguard Worker return Repeatedly<Args...>(); 42*635a8641SAndroid Build Coastguard Worker } 43*635a8641SAndroid Build Coastguard Worker template <typename... Args> 44*635a8641SAndroid Build Coastguard Worker operator OnceCallback<void(Args...)>() const { 45*635a8641SAndroid Build Coastguard Worker return Once<Args...>(); 46*635a8641SAndroid Build Coastguard Worker } 47*635a8641SAndroid Build Coastguard Worker // Explicit way of specifying a specific callback type when the compiler can't 48*635a8641SAndroid Build Coastguard Worker // deduce it. 49*635a8641SAndroid Build Coastguard Worker template <typename... Args> Repeatedly()50*635a8641SAndroid Build Coastguard Worker static RepeatingCallback<void(Args...)> Repeatedly() { 51*635a8641SAndroid Build Coastguard Worker return BindRepeating([](Args... args) {}); 52*635a8641SAndroid Build Coastguard Worker } 53*635a8641SAndroid Build Coastguard Worker template <typename... Args> Once()54*635a8641SAndroid Build Coastguard Worker static OnceCallback<void(Args...)> Once() { 55*635a8641SAndroid Build Coastguard Worker return BindOnce([](Args... args) {}); 56*635a8641SAndroid Build Coastguard Worker } 57*635a8641SAndroid Build Coastguard Worker }; 58*635a8641SAndroid Build Coastguard Worker 59*635a8641SAndroid Build Coastguard Worker // Useful for creating a Closure that will delete a pointer when invoked. Only 60*635a8641SAndroid Build Coastguard Worker // use this when necessary. In most cases MessageLoop::DeleteSoon() is a better 61*635a8641SAndroid Build Coastguard Worker // fit. 62*635a8641SAndroid Build Coastguard Worker template <typename T> DeletePointer(T * obj)63*635a8641SAndroid Build Coastguard Workervoid DeletePointer(T* obj) { 64*635a8641SAndroid Build Coastguard Worker delete obj; 65*635a8641SAndroid Build Coastguard Worker } 66*635a8641SAndroid Build Coastguard Worker 67*635a8641SAndroid Build Coastguard Worker } // namespace base 68*635a8641SAndroid Build Coastguard Worker 69*635a8641SAndroid Build Coastguard Worker #endif // BASE_BIND_HELPERS_H_ 70