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

#include "base/logging.h"
#include "services/media/framework/refs.h"
#include "services/media/framework/stages/input.h"
#include "services/media/framework/stages/output.h"
#include "services/media/framework/stages/stage.h"

namespace mojo {
namespace media {

size_t PartRef::input_count() const {
  DCHECK(valid());
  return stage_->input_count();
}

InputRef PartRef::input(size_t index) const {
  DCHECK(valid());
  DCHECK(index < stage_->input_count());
  return InputRef(stage_, index);
}

InputRef PartRef::input() const {
  DCHECK(valid());
  DCHECK(stage_->input_count() == 1);
  return InputRef(stage_, 0);
}

size_t PartRef::output_count() const {
  DCHECK(valid());
  return stage_->output_count();
}

OutputRef PartRef::output(size_t index) const {
  DCHECK(valid());
  DCHECK(index < stage_->output_count());
  return OutputRef(stage_, index);
}

OutputRef PartRef::output() const {
  DCHECK(valid());
  DCHECK(stage_->output_count() == 1);
  return OutputRef(stage_, 0);
}

bool InputRef::connected() const {
  DCHECK(valid());
  return actual().connected();
}

const OutputRef& InputRef::mate() const {
  DCHECK(valid());
  return actual().mate();
}

InputRef::InputRef(Stage* stage, size_t index) :
    stage_(stage), index_(index) {
  DCHECK(valid());
}

Input& InputRef::actual() const {
  DCHECK(valid());
  return stage_->input(index_);
}

bool InputRef::valid() const {
  return stage_ != nullptr && index_ < stage_->input_count();
}

bool OutputRef::connected() const {
  DCHECK(valid());
  return actual().connected();
}

const InputRef& OutputRef::mate() const {
  DCHECK(valid());
  return actual().mate();
}

OutputRef::OutputRef(Stage* stage, size_t index) :
    stage_(stage), index_(index) {
  DCHECK(valid());
}

Output& OutputRef::actual() const {
  DCHECK(valid());
  return stage_->output(index_);
}

bool OutputRef::valid() const {
  return stage_ != nullptr && index_ < stage_->output_count();
}

}  // namespace media
}  // namespace mojo
