blob: 782371f6e71703059aeb6a4022a1aee785f1ad2d [file] [log] [blame]
fischman@chromium.orgdc221a72012-03-25 05:37:27 +09001// 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
17#include "base/callback.h"
avi@chromium.orgb74bab82013-08-30 11:04:04 +090018#include "base/compiler_specific.h"
avia6a6a682015-12-27 07:15:14 +090019#include "base/macros.h"
fischman@chromium.orgdc221a72012-03-25 05:37:27 +090020
21namespace base {
22
23template <typename Sig>
24base::Callback<Sig> ResetAndReturn(base::Callback<Sig>* cb) {
25 base::Callback<Sig> ret(*cb);
26 cb->Reset();
27 return ret;
28}
29
sergeyuf9cf2812016-06-25 09:51:09 +090030// ScopedClosureRunner is akin to std::unique_ptr<> for Closures. It ensures
31// that the Closure is executed no matter how the current scope exits.
avi@chromium.orgb74bab82013-08-30 11:04:04 +090032class BASE_EXPORT ScopedClosureRunner {
33 public:
34 ScopedClosureRunner();
35 explicit ScopedClosureRunner(const Closure& closure);
36 ~ScopedClosureRunner();
37
sergeyuf9cf2812016-06-25 09:51:09 +090038 ScopedClosureRunner(ScopedClosureRunner&& other);
39
sergeyu93396d12016-07-08 09:34:27 +090040 // Releases the current closure if it's set and replaces it with the closure
41 // from |other|.
sergeyuf9cf2812016-06-25 09:51:09 +090042 ScopedClosureRunner& operator=(ScopedClosureRunner&& other);
43
44 // Calls the current closure and resets it, so it wont be called again.
sergeyu93396d12016-07-08 09:34:27 +090045 void RunAndReset();
sergeyuf9cf2812016-06-25 09:51:09 +090046
sergeyu93396d12016-07-08 09:34:27 +090047 // Replaces closure with the new one releasing the old one without calling it.
48 void ReplaceClosure(const Closure& closure);
sergeyuf9cf2812016-06-25 09:51:09 +090049
50 // Releases the Closure without calling.
avi@chromium.orgb74bab82013-08-30 11:04:04 +090051 Closure Release() WARN_UNUSED_RESULT;
52
53 private:
54 Closure closure_;
55
56 DISALLOW_COPY_AND_ASSIGN(ScopedClosureRunner);
57};
58
fischman@chromium.orgdc221a72012-03-25 05:37:27 +090059} // namespace base
60
61#endif // BASE_CALLBACK_HELPERS_H_