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