summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Iannucci <robbie@rail.com>2012-10-01 20:51:00 (GMT)
committerRobert A Iannucci Jr <iannucci@chromium.org>2012-11-09 04:25:39 (GMT)
commit8775c4d1e3630230dcea202f2d1647e56a81c20f (patch)
treec603c0d2f6063647703ef00dbf3c1c2e9e377a79
parent93e509469953a90f31afc838536b82568da397b2 (diff)
downloadNinja-8775c4d1e3630230dcea202f2d1647e56a81c20f.zip
Ninja-8775c4d1e3630230dcea202f2d1647e56a81c20f.tar.gz
Ninja-8775c4d1e3630230dcea202f2d1647e56a81c20f.tar.bz2
Pull out base changes to state
-rw-r--r--src/state.cc17
-rw-r--r--src/state.h25
2 files changed, 40 insertions, 2 deletions
diff --git a/src/state.cc b/src/state.cc
index 4c7168b..0697e48 100644
--- a/src/state.cc
+++ b/src/state.cc
@@ -22,10 +22,12 @@
#include "metrics.h"
#include "util.h"
+const Pool State::kDefaultPool("", 0);
const Rule State::kPhonyRule("phony");
State::State() {
AddRule(&kPhonyRule);
+ AddPool(&kDefaultPool);
}
void State::AddRule(const Rule* rule) {
@@ -40,7 +42,20 @@ const Rule* State::LookupRule(const string& rule_name) {
return i->second;
}
-Edge* State::AddEdge(const Rule* rule) {
+void State::AddPool(const Pool* pool) {
+ assert(LookupPool(pool->name()) == NULL);
+ pools_[pool->name()] = pool;
+}
+
+const Pool* State::LookupPool(const string& pool_name) {
+ map<string, const Pool*>::iterator i = pools_.find(pool_name);
+ if (i == pools_.end())
+ return NULL;
+ return i->second;
+}
+
+Edge* State::AddEdge(const Rule* rule, const Pool* pool) {
+ // FIXME(iannucci): do something with pool
Edge* edge = new Edge();
edge->rule_ = rule;
edge->env_ = &bindings_;
diff --git a/src/state.h b/src/state.h
index 026acf3..38fc74f 100644
--- a/src/state.h
+++ b/src/state.h
@@ -27,16 +27,36 @@ struct Edge;
struct Node;
struct Rule;
+/// A pool for delayed edges
+struct Pool {
+ explicit Pool(const string& name, int depth)
+ : name_(name), depth_(depth) { }
+
+ // A depth of 0 is infinite
+ bool isValid() const { return depth_ >= 0; }
+ int depth() const { return depth_; }
+ string name() const { return name_; }
+
+private:
+ string name_;
+
+ int depth_;
+};
+
/// Global state (file status, loaded rules) for a single run.
struct State {
static const Rule kPhonyRule;
+ static const Pool kDefaultPool;
State();
void AddRule(const Rule* rule);
const Rule* LookupRule(const string& rule_name);
- Edge* AddEdge(const Rule* rule);
+ void AddPool(const Pool* pool);
+ const Pool* LookupPool(const string& pool_name);
+
+ Edge* AddEdge(const Rule* rule, const Pool* pool);
Node* GetNode(StringPiece path);
Node* LookupNode(StringPiece path);
@@ -65,6 +85,9 @@ struct State {
/// All the rules used in the graph.
map<string, const Rule*> rules_;
+ /// All the pools used in the graph.
+ map<string, const Pool*> pools_;
+
/// All the edges of the graph.
vector<Edge*> edges_;