blob: f2ac4ae5779eea7100ce9fc560cbe384c381ffb0 [file] [log] [blame]
// Copyright (c) 2013 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_ITEM_TREE_H_
#define TOOLS_GN_ITEM_TREE_H_
#include "base/containers/hash_tables.h"
#include "base/memory/scoped_ptr.h"
#include "base/synchronization/lock.h"
#include "tools/gn/label.h"
class Err;
class Item;
class ItemNode;
// Represents the full dependency tree if labeled items in the system.
// Generally you will interact with this through the target manager, etc.
class ItemTree {
public:
ItemTree();
~ItemTree();
// This lock must be held when calling the "Locked" functions below.
base::Lock& lock() { return lock_; }
// Returns NULL if the item is not found.
//
// The lock must be held.
ItemNode* GetExistingNodeLocked(const Label& label);
// There must not be an item with this label in the tree already. Takes
// ownership of the pointer.
//
// The lock must be held.
void AddNodeLocked(ItemNode* node);
// Mark the given item as being generated. If it has no unresolved
// dependencies, it will be marked resolved, and the resolved state will be
// recursively pushed into the dependency tree. Returns an error if there was
// an error.
Err MarkItemGeneratedLocked(const Label& label);
// Fills the given vector with all known items.
void GetAllItemsLocked(std::vector<const Item*>* dest) const;
// Returns an error if there are unresolved dependencies, or no error if
// there aren't.
//
// The lock should not be held.
Err CheckForBadItems() const;
private:
Err MarkItemResolvedLocked(ItemNode* node);
// Given a set of unresolved nodes, looks for cycles and returns the error
// message describing any cycles it found.
std::string CheckForCircularDependenciesLocked(
const std::vector<const ItemNode*>& bad_nodes) const;
mutable base::Lock lock_;
typedef base::hash_map<Label, ItemNode*> StringToNodeHash;
StringToNodeHash items_; // Owning pointer.
DISALLOW_COPY_AND_ASSIGN(ItemTree);
};
#endif // TOOLS_GN_ITEM_TREE_H_