blob: 782371f6e71703059aeb6a4022a1aee785f1ad2d [file] [log] [blame]
Daniel Eratb8cf9492015-07-06 13:18:13 -06001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// This defines helpful methods for dealing with Callbacks. Because Callbacks
6// are implemented using templates, with a class per callback signature, adding
7// methods to Callback<> itself is unattractive (lots of extra code gets
8// generated). Instead, consider adding methods here.
9//
10// ResetAndReturn(&cb) is like cb.Reset() but allows executing a callback (via a
11// copy) after the original callback is Reset(). This can be handy if Run()
12// reads/writes the variable holding the Callback.
13
14#ifndef BASE_CALLBACK_HELPERS_H_
15#define BASE_CALLBACK_HELPERS_H_
16
Daniel Eratb8cf9492015-07-06 13:18:13 -060017#include "base/callback.h"
18#include "base/compiler_specific.h"
Alex Vakulenko0d205d72016-01-15 13:02:14 -080019#include "base/macros.h"
Daniel Eratb8cf9492015-07-06 13:18:13 -060020
21namespace base {
22
Luis Hector Chaveze5b2c6f2017-07-26 17:33:47 +000023template <typename Sig>
24base::Callback<Sig> ResetAndReturn(base::Callback<Sig>* cb) {
25 base::Callback<Sig> ret(*cb);
26 cb->Reset();
Daniel Eratb8cf9492015-07-06 13:18:13 -060027 return ret;
28}
29
Luis Hector Chavez0c4f26a2016-07-15 16:23:21 -070030// ScopedClosureRunner is akin to std::unique_ptr<> for Closures. It ensures
31// that the Closure is executed no matter how the current scope exits.
Daniel Eratb8cf9492015-07-06 13:18:13 -060032class BASE_EXPORT ScopedClosureRunner {
33 public:
34 ScopedClosureRunner();
35 explicit ScopedClosureRunner(const Closure& closure);
36 ~ScopedClosureRunner();
37
Luis Hector Chavez0c4f26a2016-07-15 16:23:21 -070038 ScopedClosureRunner(ScopedClosureRunner&& other);
39
40 // Releases the current closure if it's set and replaces it with the closure
41 // from |other|.
42 ScopedClosureRunner& operator=(ScopedClosureRunner&& other);
43
44 // Calls the current closure and resets it, so it wont be called again.
45 void RunAndReset();
46
47 // Replaces closure with the new one releasing the old one without calling it.
48 void ReplaceClosure(const Closure& closure);
49
50 // Releases the Closure without calling.
Daniel Eratb8cf9492015-07-06 13:18:13 -060051 Closure Release() WARN_UNUSED_RESULT;
52
53 private:
54 Closure closure_;
55
56 DISALLOW_COPY_AND_ASSIGN(ScopedClosureRunner);
57};
58
59} // namespace base
60
61#endif // BASE_CALLBACK_HELPERS_H_