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