diff interps/rail/src/Var.h @ 996:859f9b4339e6

<Gregor> tar xf egobot.tar.xz
author HackBot
date Sun, 09 Dec 2012 19:30:08 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/rail/src/Var.h	Sun Dec 09 19:30:08 2012 +0000
@@ -0,0 +1,54 @@
+// Var.h
+
+// This is the base class for all variables in rail. The
+// acquire/release is for reference counting, which we will use for
+// our GC implementation. We can use reference counting here because
+// the only primitives are cons (':'), lambda ('&'), and stack
+// operations. No modifications of cons cells or closures are allowed.
+
+// The simple tag-based polymorphism here is used because all of the
+// actions work only on specific well-defined types. Thus we want
+// to bypass the complex multiple-dispatch pattern.
+
+#ifndef VAR_H_RAIL_1
+#define VAR_H_RAIL_1
+
+class StringVar;
+class ListVar;
+class NilVar;
+class Closure;
+
+class Var
+{
+public:
+  Var() : refCount(0) {}
+  virtual ~Var() {}
+
+  void acquire(void)
+  {
+    ++refCount;
+  }
+
+  void release(void)
+  {
+    --refCount;
+    if (refCount <= 0)
+    {
+      delete this;
+    }
+  }
+
+  virtual StringVar * getString(void)=0;
+  virtual ListVar * getList(void)=0;
+  virtual NilVar * getNil(void)=0;
+  virtual Closure * getClosure(void)=0;
+
+  virtual std::string toString(void) const=0;
+private:
+  Var(Var const &) {}
+  Var & operator=(Var const &) { return *this; }
+private:
+  int refCount;
+};
+
+#endif