callback_helper.h revision 0529e5d033099cbfc42635f6f6183833b09dff6e
1// Copyright 2014 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#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_CALLBACK_HELPER_H_
6#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_CALLBACK_HELPER_H_
7
8#include "base/bind.h"
9#include "base/location.h"
10#include "base/message_loop/message_loop_proxy.h"
11
12namespace sync_file_system {
13namespace drive_backend {
14
15namespace internal {
16
17template <typename T>
18typename base::enable_if<
19    base::internal::IsMoveOnlyType<T>::value,
20    base::internal::PassedWrapper<T> >::type
21RebindForward(T& t) {
22  return base::Passed(&t);
23}
24
25template <typename T>
26typename base::enable_if<
27    !base::internal::IsMoveOnlyType<T>::value,
28    T&>::type
29RebindForward(T& t) {
30  return t;
31}
32
33template <typename T>
34void RelayToTaskRunner1(base::SequencedTaskRunner* task_runner,
35                        const tracked_objects::Location& from_here,
36                        const base::Callback<void(T)>& callback,
37                        T arg) {
38  task_runner->PostTask(
39      from_here, base::Bind(callback, RebindForward(arg)));
40}
41
42template <typename T1, typename T2>
43void RelayToTaskRunner2(base::SequencedTaskRunner* task_runner,
44                        const tracked_objects::Location& from_here,
45                        const base::Callback<void(T1, T2)>& callback,
46                        T1 arg1,
47                        T2 arg2) {
48  task_runner->PostTask(
49      from_here, base::Bind(callback,
50                            RebindForward(arg1),
51                            RebindForward(arg2)));
52}
53
54}  // namespace internal
55
56template <typename T>
57base::Callback<void(T)> CreateRelayedCallback(
58    const base::Callback<void(T)>& callback) {
59  return base::Bind(&internal::RelayToTaskRunner1<T>,
60                    base::MessageLoopProxy::current(),
61                    FROM_HERE,
62                    callback);
63}
64
65template <typename T1, typename T2>
66base::Callback<void(T1, T2)> CreateRelayedCallback(
67    const base::Callback<void(T1, T2)>& callback) {
68  return base::Bind(&internal::RelayToTaskRunner2<T1, T2>,
69                    base::MessageLoopProxy::current(),
70                    FROM_HERE,
71                    callback);
72}
73
74}  // namespace drive_backend
75}  // namespace sync_file_system
76
77#endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_CALLBACK_HELPER_H_
78