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

#include "cc/layers/layer_lists.h"

#include "cc/layers/layer.h"

namespace cc {

RenderSurfaceLayerList::RenderSurfaceLayerList() {}

RenderSurfaceLayerList::~RenderSurfaceLayerList() {
  for (size_t i = 0; i < size(); ++i)
    at(size() - 1 - i)->ClearRenderSurface();
}

Layer* RenderSurfaceLayerList::at(size_t i) const {
  return list_.at(i);
}

void RenderSurfaceLayerList::pop_back() {
  list_.pop_back();
}

void RenderSurfaceLayerList::push_back(const scoped_refptr<Layer>& layer) {
  list_.push_back(layer);
}

Layer* RenderSurfaceLayerList::back() {
  return list_.back();
}

size_t RenderSurfaceLayerList::size() const {
  return list_.size();
}

scoped_refptr<Layer>& RenderSurfaceLayerList::operator[](size_t i) {
  return list_[i];
}
const scoped_refptr<Layer>& RenderSurfaceLayerList::operator[](size_t i) const {
  return list_[i];
}

LayerList::iterator RenderSurfaceLayerList::begin() {
  return list_.begin();
}

LayerList::iterator RenderSurfaceLayerList::end() {
  return list_.end();
}

LayerList::const_iterator RenderSurfaceLayerList::begin() const {
  return list_.begin();
}

LayerList::const_iterator RenderSurfaceLayerList::end() const {
  return list_.end();
}

void RenderSurfaceLayerList::clear() {
  for (size_t i = 0; i < list_.size(); ++i)
    DCHECK(!list_[i]->render_surface());
  list_.clear();
}

}  // namespace cc
