11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "tools/gn/deps_iterator.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "tools/gn/target.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDepsIterator::DepsIterator(const Target* t) : current_index_(0) {
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  vect_stack_[0] = &t->public_deps();
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  vect_stack_[1] = &t->private_deps();
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  vect_stack_[2] = &t->data_deps();
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (vect_stack_[0]->empty())
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Advance();
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Iterate over the public and private linked deps, but not the data deps.
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDepsIterator::DepsIterator(const Target* t, LinkedOnly) : current_index_(0) {
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  vect_stack_[0] = &t->public_deps();
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  vect_stack_[1] = &t->private_deps();
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  vect_stack_[2] = NULL;
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (vect_stack_[0]->empty())
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Advance();
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Advance to the next position. This assumes there are more vectors.
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// For internal use, this function tolerates an initial index equal to the
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// length of the current vector. In this case, it will advance to the next
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// one.
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DepsIterator::Advance() {
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(vect_stack_[0]);
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  current_index_++;
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (current_index_ >= vect_stack_[0]->size()) {
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Advance to next vect. Shift the elements left by one.
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    vect_stack_[0] = vect_stack_[1];
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    vect_stack_[1] = vect_stack_[2];
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    vect_stack_[2] = NULL;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    current_index_ = 0;
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (vect_stack_[0] && vect_stack_[0]->empty())
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Advance();
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
49