blob: ba01b67691f42f02e9ae2e893abbbc1067fbe0f6 [file] [log] [blame]
// This file was GENERATED by command:
// pump.py callback_helper.h.pump
// DO NOT EDIT BY HAND!!!
// Copyright 2014 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.
#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_CALLBACK_HELPER_H_
#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_CALLBACK_HELPER_H_
#include "base/bind.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/sequenced_task_runner.h"
#include "base/thread_task_runner_handle.h"
// TODO(tzik): Merge this file to media/base/bind_to_current_loop.h.
namespace sync_file_system {
namespace drive_backend {
namespace internal {
template <typename T>
typename base::enable_if<
base::internal::IsMoveOnlyType<T>::value,
base::internal::PassedWrapper<T> >::type
RebindForward(T& t) {
return base::Passed(&t);
}
template <typename T>
typename base::enable_if<
!base::internal::IsMoveOnlyType<T>::value,
T&>::type
RebindForward(T& t) {
return t;
}
template <typename T>
class CallbackHolder {
public:
CallbackHolder(base::SequencedTaskRunner* task_runner,
const tracked_objects::Location& from_here,
const base::Callback<T>& callback)
: task_runner_(task_runner),
from_here_(from_here),
callback_(new base::Callback<T>(callback)) {
DCHECK(task_runner_);
}
~CallbackHolder() {
base::Callback<T>* callback = callback_.release();
if (!task_runner_->DeleteSoon(from_here_, callback))
delete callback;
}
base::SequencedTaskRunner* task_runner() const { return task_runner_; }
const tracked_objects::Location& from_here() const { return from_here_; }
const base::Callback<T>& callback() const { return *callback_; }
private:
scoped_refptr<base::SequencedTaskRunner> task_runner_;
const tracked_objects::Location from_here_;
scoped_ptr<base::Callback<T> > callback_;
DISALLOW_COPY_AND_ASSIGN(CallbackHolder);
};
template <typename>
struct RelayToTaskRunnerHelper;
template <>
struct RelayToTaskRunnerHelper<void()> {
static void Run(CallbackHolder<void()>* holder) {
holder->task_runner()->PostTask(
holder->from_here(), base::Bind(holder->callback()));
}
};
template <typename A1>
struct RelayToTaskRunnerHelper<void(A1)> {
static void Run(CallbackHolder<void(A1)>* holder, A1 a1) {
holder->task_runner()->PostTask(
holder->from_here(), base::Bind(holder->callback(), RebindForward(a1)));
}
};
template <typename A1, typename A2>
struct RelayToTaskRunnerHelper<void(A1, A2)> {
static void Run(CallbackHolder<void(A1, A2)>* holder, A1 a1, A2 a2) {
holder->task_runner()->PostTask(
holder->from_here(), base::Bind(holder->callback(), RebindForward(a1),
RebindForward(a2)));
}
};
template <typename A1, typename A2, typename A3>
struct RelayToTaskRunnerHelper<void(A1, A2, A3)> {
static void Run(CallbackHolder<void(A1, A2, A3)>* holder, A1 a1, A2 a2,
A3 a3) {
holder->task_runner()->PostTask(
holder->from_here(), base::Bind(holder->callback(), RebindForward(a1),
RebindForward(a2), RebindForward(a3)));
}
};
template <typename A1, typename A2, typename A3, typename A4>
struct RelayToTaskRunnerHelper<void(A1, A2, A3, A4)> {
static void Run(CallbackHolder<void(A1, A2, A3, A4)>* holder, A1 a1, A2 a2,
A3 a3, A4 a4) {
holder->task_runner()->PostTask(
holder->from_here(), base::Bind(holder->callback(), RebindForward(a1),
RebindForward(a2), RebindForward(a3), RebindForward(a4)));
}
};
template <typename A1, typename A2, typename A3, typename A4, typename A5>
struct RelayToTaskRunnerHelper<void(A1, A2, A3, A4, A5)> {
static void Run(CallbackHolder<void(A1, A2, A3, A4, A5)>* holder, A1 a1,
A2 a2, A3 a3, A4 a4, A5 a5) {
holder->task_runner()->PostTask(
holder->from_here(), base::Bind(holder->callback(), RebindForward(a1),
RebindForward(a2), RebindForward(a3), RebindForward(a4),
RebindForward(a5)));
}
};
template <typename A1, typename A2, typename A3, typename A4, typename A5,
typename A6>
struct RelayToTaskRunnerHelper<void(A1, A2, A3, A4, A5, A6)> {
static void Run(CallbackHolder<void(A1, A2, A3, A4, A5, A6)>* holder, A1 a1,
A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
holder->task_runner()->PostTask(
holder->from_here(), base::Bind(holder->callback(), RebindForward(a1),
RebindForward(a2), RebindForward(a3), RebindForward(a4),
RebindForward(a5), RebindForward(a6)));
}
};
template <typename A1, typename A2, typename A3, typename A4, typename A5,
typename A6, typename A7>
struct RelayToTaskRunnerHelper<void(A1, A2, A3, A4, A5, A6, A7)> {
static void Run(CallbackHolder<void(A1, A2, A3, A4, A5, A6, A7)>* holder,
A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
holder->task_runner()->PostTask(
holder->from_here(), base::Bind(holder->callback(), RebindForward(a1),
RebindForward(a2), RebindForward(a3), RebindForward(a4),
RebindForward(a5), RebindForward(a6), RebindForward(a7)));
}
};
} // namespace internal
template <typename T>
base::Callback<T> RelayCallbackToTaskRunner(
base::SequencedTaskRunner* task_runner,
const tracked_objects::Location& from_here,
const base::Callback<T>& callback) {
DCHECK(task_runner->RunsTasksOnCurrentThread());
if (callback.is_null())
return base::Callback<T>();
return base::Bind(&internal::RelayToTaskRunnerHelper<T>::Run,
base::Owned(new internal::CallbackHolder<T>(
task_runner, from_here, callback)));
}
template <typename T>
base::Callback<T> RelayCallbackToCurrentThread(
const tracked_objects::Location& from_here,
const base::Callback<T>& callback) {
return RelayCallbackToTaskRunner(
base::ThreadTaskRunnerHandle::Get(),
from_here, callback);
}
} // namespace drive_backend
} // namespace sync_file_system
#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_CALLBACK_HELPER_H_