| // Copyright 2014 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 "tools/gn/deps_iterator.h" | 
 |  | 
 | #include "tools/gn/target.h" | 
 |  | 
 | DepsIterator::DepsIterator() : current_index_(0) { | 
 |   vect_stack_[0] = nullptr; | 
 |   vect_stack_[1] = nullptr; | 
 |   vect_stack_[2] = nullptr; | 
 | } | 
 |  | 
 | DepsIterator::DepsIterator(const LabelTargetVector* a, | 
 |                            const LabelTargetVector* b, | 
 |                            const LabelTargetVector* c) | 
 |     : current_index_(0) { | 
 |   vect_stack_[0] = a; | 
 |   vect_stack_[1] = b; | 
 |   vect_stack_[2] = c; | 
 |  | 
 |   if (vect_stack_[0] && vect_stack_[0]->empty()) | 
 |     operator++(); | 
 | } | 
 |  | 
 | // Advance to the next position. This assumes there are more vectors. | 
 | // | 
 | // For internal use, this function tolerates an initial index equal to the | 
 | // length of the current vector. In this case, it will advance to the next | 
 | // one. | 
 | DepsIterator& DepsIterator::operator++() { | 
 |   DCHECK(vect_stack_[0]); | 
 |  | 
 |   current_index_++; | 
 |   if (current_index_ >= vect_stack_[0]->size()) { | 
 |     // Advance to next vect. Shift the elements left by one. | 
 |     vect_stack_[0] = vect_stack_[1]; | 
 |     vect_stack_[1] = vect_stack_[2]; | 
 |     vect_stack_[2] = nullptr; | 
 |  | 
 |     current_index_ = 0; | 
 |  | 
 |     if (vect_stack_[0] && vect_stack_[0]->empty()) | 
 |       operator++(); | 
 |   } | 
 |   return *this; | 
 | } | 
 |  | 
 | DepsIteratorRange::DepsIteratorRange(const DepsIterator& b) | 
 |     : begin_(b), | 
 |       end_() { | 
 | } | 
 |  | 
 | DepsIteratorRange::~DepsIteratorRange() = default; |