// 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.
#ifndef TOOLS_GN_DEPS_ITERATOR_H_
#define TOOLS_GN_DEPS_ITERATOR_H_
#include "base/basictypes.h"
#include "tools/gn/label_ptr.h"
class Target;
// Iterates over the deps of a target.
//
// Since there are multiple kinds of deps, this iterator allows looping over
// each one in one loop.
class DepsIterator {
public:
enum LinkedOnly {
LINKED_ONLY,
};
// Iterate over public, private, and data deps.
explicit DepsIterator(const Target* t);
// Iterate over the public and private linked deps, but not the data deps.
DepsIterator(const Target* t, LinkedOnly);
// Returns true when there are no more targets.
bool done() const {
return !vect_stack_[0];
}
// Advance to the next position. This assumes !done().
//
// 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.
void Advance();
// The current dependency.
const LabelTargetPair& pair() const {
DCHECK_LT(current_index_, vect_stack_[0]->size());
return (*vect_stack_[0])[current_index_];
}
// The pointer to the current dependency.
const Target* target() const { return pair().ptr; }
// The label of the current dependency.
const Label& label() const { return pair().label; }
private:
const LabelTargetVector* vect_stack_[3];
size_t current_index_;
DISALLOW_COPY_AND_ASSIGN(DepsIterator);
};
#endif // TOOLS_GN_DEPS_ITERATOR_H_