about summary refs log tree commit diff stats
path: root/cpp/012transform
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-03-17 08:42:38 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-03-17 09:06:48 -0700
commitb1bbe92da37dd44df458ffa122e052612bb9eff3 (patch)
tree976cde85c97d4877eb8c1e5151a919406fdd1049 /cpp/012transform
parentc062697c9ff3c8cb0938f56bed3df2af3d122bd6 (diff)
downloadmu-b1bbe92da37dd44df458ffa122e052612bb9eff3.tar.gz
945 - move 'transform' layer to before 'run'
Diffstat (limited to 'cpp/012transform')
-rw-r--r--cpp/012transform28
1 files changed, 28 insertions, 0 deletions
diff --git a/cpp/012transform b/cpp/012transform
new file mode 100644
index 00000000..bb130187
--- /dev/null
+++ b/cpp/012transform
@@ -0,0 +1,28 @@
+//: Once a set of recipes is loaded, it can be filtered through an extensible
+//: list of 'transforms'.
+//:
+//: The hope is that this framework of transform tools will provide a
+//: deconstructed alternative to conventional compilers.
+
+:(before "End Recipe Fields")
+size_t transformed_until;
+  recipe() :transformed_until(-1) {}
+
+:(before "End Types")
+typedef void (*transform_fn)(recipe_number);
+
+:(before "End Globals")
+vector<transform_fn> Transform;
+
+:(code)
+void transform_all() {
+  for (size_t t = 0; t < Transform.size(); ++t) {
+    for (unordered_map<recipe_number, recipe>::iterator p = Recipe.begin(); p != Recipe.end(); ++p) {
+      recipe& r = p->second;
+      if (r.steps.empty()) continue;
+      if (r.transformed_until != t-1) continue;
+      (*Transform[t])(/*recipe_number*/p->first);
+      r.transformed_until = t;
+    }
+  }
+}