// Copyright 2013 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_CALLBACK_HOLDER_H_
#define MEDIA_BASE_CALLBACK_HOLDER_H_

#include "base/bind.h"
#include "base/callback.h"
#include "base/callback_helpers.h"
#include "media/base/bind_to_loop.h"

namespace media {

// A helper class that can hold a callback from being fired.
template <typename CB> class CallbackHolder {
 public:
  CallbackHolder() : hold_(false) {}

  ~CallbackHolder() {
    // Make sure all callbacks are satisfied!
    DCHECK(!hold_);
    DCHECK(original_cb_.is_null());
    DCHECK(held_cb_.is_null());
  }

  // Sets the callback to be potentially held.
  void SetCallback(const CB& cb) {
    DCHECK(original_cb_.is_null());
    DCHECK(held_cb_.is_null());
    original_cb_ = cb;
  }

  bool IsNull() const {
    return original_cb_.is_null() && held_cb_.is_null();
  }

  // Holds the callback when Run() is called.
  void HoldCallback() { hold_ = true; }

  // Runs or holds the callback as specified by |hold_|.
  // This method has overloaded versions to support different types of CB.
  void RunOrHold() {
    DCHECK(held_cb_.is_null());
    if (hold_)
      held_cb_ = base::ResetAndReturn(&original_cb_);
    else
      base::ResetAndReturn(&original_cb_).Run();
  }

  template <typename A1> void RunOrHold(A1 a1) {
    DCHECK(held_cb_.is_null());
    if (hold_) {
      held_cb_ = base::Bind(base::ResetAndReturn(&original_cb_),
                            internal::TrampolineForward(a1));
    } else {
      base::ResetAndReturn(&original_cb_).Run(a1);
    }
  }

  template <typename A1, typename A2> void RunOrHold(A1 a1, A2 a2) {
    DCHECK(held_cb_.is_null());
    if (hold_) {
      held_cb_ = base::Bind(base::ResetAndReturn(&original_cb_),
                            internal::TrampolineForward(a1),
                            internal::TrampolineForward(a2));
    } else {
      base::ResetAndReturn(&original_cb_).Run(a1, a2);
    }
  }

  // Releases and runs the held callback.
  void RunHeldCallback() {
    DCHECK(hold_);
    DCHECK(!held_cb_.is_null());
    hold_ = false;
    base::ResetAndReturn(&held_cb_).Run();
  }

 private:
  bool hold_;
  CB original_cb_;
  base::Closure held_cb_;
};

}  // namespace media

#endif  // MEDIA_BASE_CALLBACK_HOLDER_H_
