// This file was GENERATED by command:
//     pump.py bind_to_loop.h.pump
// DO NOT EDIT BY HAND!!!


// 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.

#ifndef MEDIA_BASE_BIND_TO_LOOP_H_
#define MEDIA_BASE_BIND_TO_LOOP_H_

#include "base/bind.h"
#include "base/location.h"
#include "base/message_loop_proxy.h"

// This is a helper utility for base::Bind()ing callbacks on to particular
// MessageLoops.  A typical use is when |a| (of class |A|) wants to hand a
// callback such as base::Bind(&A::AMethod, a) to |b|, but needs to ensure that
// when |b| executes the callback, it does so on a particular MessageLoop.
//
// Typical usage: request to be called back on the current thread:
// other->StartAsyncProcessAndCallMeBack(
//    media::BindToLoop(MessageLoopProxy::current(),
//                      base::Bind(&MyClass::MyMethod, this)));
//
// Note that like base::Bind(), BindToLoop() can't bind non-constant references,
// and that *unlike* base::Bind(), BindToLoop() makes copies of its arguments,
// and thus can't be used with arrays.

namespace media {

// Mimic base::internal::CallbackForward, replacing p.Pass() with
// base::Passed(&p) to account for the extra layer of indirection.
namespace internal {
template <typename T>
T& TrampolineForward(T& t) { return t; }

template <typename T>
base::internal::PassedWrapper<scoped_ptr<T> > TrampolineForward(
    scoped_ptr<T>& p) { return base::Passed(&p); }

template <typename T>
base::internal::PassedWrapper<scoped_array<T> > TrampolineForward(
    scoped_array<T>& p) { return base::Passed(&p); }

template <typename T, typename R>
base::internal::PassedWrapper<scoped_ptr_malloc<T, R> > TrampolineForward(
    scoped_ptr_malloc<T, R>& p) { return base::Passed(&p); }

template <typename T>
base::internal::PassedWrapper<ScopedVector<T> > TrampolineForward(
    ScopedVector<T>& p) { return base::Passed(&p); }

template <typename T> struct TrampolineHelper;

template <>
struct TrampolineHelper<void()> {
  static void Run(
      const scoped_refptr<base::MessageLoopProxy>& loop,
      const base::Callback<void()>& cb) {
    loop->PostTask(FROM_HERE, base::Bind(cb));
  }
};


template <typename A1>
struct TrampolineHelper<void(A1)> {
  static void Run(
      const scoped_refptr<base::MessageLoopProxy>& loop,
      const base::Callback<void(A1)>& cb, A1 a1) {
    loop->PostTask(FROM_HERE, base::Bind(cb, internal::TrampolineForward(a1)));
  }
};


template <typename A1, typename A2>
struct TrampolineHelper<void(A1, A2)> {
  static void Run(
      const scoped_refptr<base::MessageLoopProxy>& loop,
      const base::Callback<void(A1, A2)>& cb, A1 a1, A2 a2) {
    loop->PostTask(FROM_HERE, base::Bind(cb, internal::TrampolineForward(a1),
        internal::TrampolineForward(a2)));
  }
};


template <typename A1, typename A2, typename A3>
struct TrampolineHelper<void(A1, A2, A3)> {
  static void Run(
      const scoped_refptr<base::MessageLoopProxy>& loop,
      const base::Callback<void(A1, A2, A3)>& cb, A1 a1, A2 a2, A3 a3) {
    loop->PostTask(FROM_HERE, base::Bind(cb, internal::TrampolineForward(a1),
        internal::TrampolineForward(a2), internal::TrampolineForward(a3)));
  }
};


template <typename A1, typename A2, typename A3, typename A4>
struct TrampolineHelper<void(A1, A2, A3, A4)> {
  static void Run(
      const scoped_refptr<base::MessageLoopProxy>& loop,
      const base::Callback<void(A1, A2, A3, A4)>& cb, A1 a1, A2 a2, A3 a3,
          A4 a4) {
    loop->PostTask(FROM_HERE, base::Bind(cb, internal::TrampolineForward(a1),
        internal::TrampolineForward(a2), internal::TrampolineForward(a3),
        internal::TrampolineForward(a4)));
  }
};


template <typename A1, typename A2, typename A3, typename A4, typename A5>
struct TrampolineHelper<void(A1, A2, A3, A4, A5)> {
  static void Run(
      const scoped_refptr<base::MessageLoopProxy>& loop,
      const base::Callback<void(A1, A2, A3, A4, A5)>& cb, A1 a1, A2 a2, A3 a3,
          A4 a4, A5 a5) {
    loop->PostTask(FROM_HERE, base::Bind(cb, internal::TrampolineForward(a1),
        internal::TrampolineForward(a2), internal::TrampolineForward(a3),
        internal::TrampolineForward(a4), internal::TrampolineForward(a5)));
  }
};


template <typename A1, typename A2, typename A3, typename A4, typename A5,
    typename A6>
struct TrampolineHelper<void(A1, A2, A3, A4, A5, A6)> {
  static void Run(
      const scoped_refptr<base::MessageLoopProxy>& loop,
      const base::Callback<void(A1, A2, A3, A4, A5, A6)>& cb, A1 a1, A2 a2,
          A3 a3, A4 a4, A5 a5, A6 a6) {
    loop->PostTask(FROM_HERE, base::Bind(cb, internal::TrampolineForward(a1),
        internal::TrampolineForward(a2), internal::TrampolineForward(a3),
        internal::TrampolineForward(a4), internal::TrampolineForward(a5),
        internal::TrampolineForward(a6)));
  }
};


template <typename A1, typename A2, typename A3, typename A4, typename A5,
    typename A6, typename A7>
struct TrampolineHelper<void(A1, A2, A3, A4, A5, A6, A7)> {
  static void Run(
      const scoped_refptr<base::MessageLoopProxy>& loop,
      const base::Callback<void(A1, A2, A3, A4, A5, A6, A7)>& cb, A1 a1, A2 a2,
          A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
    loop->PostTask(FROM_HERE, base::Bind(cb, internal::TrampolineForward(a1),
        internal::TrampolineForward(a2), internal::TrampolineForward(a3),
        internal::TrampolineForward(a4), internal::TrampolineForward(a5),
        internal::TrampolineForward(a6), internal::TrampolineForward(a7)));
  }
};


}  // namespace internal

template<typename T>
static base::Callback<T> BindToLoop(
    const scoped_refptr<base::MessageLoopProxy>& loop,
    const base::Callback<T>& cb) {
  return base::Bind(&internal::TrampolineHelper<T>::Run, loop, cb);
}

template<typename T>
static base::Callback<T> BindToCurrentLoop(
    const base::Callback<T>& cb) {
  return BindToLoop(base::MessageLoopProxy::current(), cb);
}

}  // namespace media

#endif  // MEDIA_BASE_BIND_TO_LOOP_H_
