1// 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/basictypes.h"
18#include "base/callback.h"
19#include "base/compiler_specific.h"
20
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
30// ScopedClosureRunner is akin to scoped_ptr for Closures. It ensures that the
31// Closure is executed and deleted no matter how the current scope exits.
32class BASE_EXPORT ScopedClosureRunner {
33 public:
34  ScopedClosureRunner();
35  explicit ScopedClosureRunner(const Closure& closure);
36  ~ScopedClosureRunner();
37
38  void Reset();
39  void Reset(const Closure& closure);
40  Closure Release() WARN_UNUSED_RESULT;
41
42 private:
43  Closure closure_;
44
45  DISALLOW_COPY_AND_ASSIGN(ScopedClosureRunner);
46};
47
48}  // namespace base
49
50#endif  // BASE_CALLBACK_HELPERS_H_
51