Mercurial > repo
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