| // 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() { | |
| } |