xref: /aosp_15_r20/external/libchrome/base/bind_helpers.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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 Worker void 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