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