// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This defines helpful methods for dealing with Callbacks. Because Callbacks // are implemented using templates, with a class per callback signature, adding // methods to Callback<> itself is unattractive (lots of extra code gets // generated). Instead, consider adding methods here. // // ResetAndReturn(&cb) is like cb.Reset() but allows executing a callback (via a // copy) after the original callback is Reset(). This can be handy if Run() // reads/writes the variable holding the Callback. #ifndef BASE_CALLBACK_HELPERS_H_ #define BASE_CALLBACK_HELPERS_H_ #include "base/callback.h" #include "base/compiler_specific.h" #include "base/macros.h" namespace base { template <typename Sig> base::Callback<Sig> ResetAndReturn(base::Callback<Sig>* cb) { base::Callback<Sig> ret(*cb); cb->Reset(); return ret; } // ScopedClosureRunner is akin to std::unique_ptr<> for Closures. It ensures // that the Closure is executed no matter how the current scope exits. class BASE_EXPORT ScopedClosureRunner { public: ScopedClosureRunner(); explicit ScopedClosureRunner(const Closure& closure); ~ScopedClosureRunner(); ScopedClosureRunner(ScopedClosureRunner&& other); // Releases the current closure if it's set and replaces it with the closure // from |other|. ScopedClosureRunner& operator=(ScopedClosureRunner&& other); // Calls the current closure and resets it, so it wont be called again. void RunAndReset(); // Replaces closure with the new one releasing the old one without calling it. void ReplaceClosure(const Closure& closure); // Releases the Closure without calling. Closure Release() WARN_UNUSED_RESULT; private: Closure closure_; DISALLOW_COPY_AND_ASSIGN(ScopedClosureRunner); }; } // namespace base #endif // BASE_CALLBACK_HELPERS_H_