1/*
2 *  Copyright 2015 The WebRTC Project Authors. All rights reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_BASE_KEEP_REF_UNTIL_DONE_H_
12#define WEBRTC_BASE_KEEP_REF_UNTIL_DONE_H_
13
14#include "webrtc/base/bind.h"
15#include "webrtc/base/callback.h"
16#include "webrtc/base/refcount.h"
17#include "webrtc/base/scoped_ref_ptr.h"
18
19namespace rtc {
20
21namespace impl {
22template <class T>
23static inline void DoNothing(const scoped_refptr<T>& object) {}
24}  // namespace impl
25
26// KeepRefUntilDone keeps a reference to |object| until the returned
27// callback goes out of scope. If the returned callback is copied, the
28// reference will be released when the last callback goes out of scope.
29template <class ObjectT>
30static inline Callback0<void> KeepRefUntilDone(ObjectT* object) {
31  return rtc::Bind(&impl::DoNothing<ObjectT>, scoped_refptr<ObjectT>(object));
32}
33
34template <class ObjectT>
35static inline Callback0<void> KeepRefUntilDone(
36    const scoped_refptr<ObjectT>& object) {
37  return rtc::Bind(&impl::DoNothing<ObjectT>, object);
38}
39
40}  // namespace rtc
41
42
43#endif  // WEBRTC_BASE_KEEP_REF_UNTIL_DONE_H_
44