about summary refs log tree commit diff
path: root/src/fix-ng/fix-expr.hh
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2003-11-03T20·30+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2003-11-03T20·30+0000
commit0690c1c9c01dd5889dbfccf2da6cb99f5c4e151b (patch)
treec388986ad9539ecf0a238fabfec07873e553021f /src/fix-ng/fix-expr.hh
parentff3132427839888933c3779844bf35ca9e189cb9 (diff)
* Work around problems with the ATerm library.
  The ATerm library doesn't search the heap for pointers to ATerms
  when garbage collecting.  As a result, C++ containers such as
  `map<ATerm, ATerm>' will cause pointer to be hidden from the garbage
  collector, causing crashes.  Instead, we now use ATermTables.

Diffstat (limited to 'src/fix-ng/fix-expr.hh')
-rw-r--r--src/fix-ng/fix-expr.hh40
1 files changed, 35 insertions, 5 deletions
diff --git a/src/fix-ng/fix-expr.hh b/src/fix-ng/fix-expr.hh
index 700f7beca906..93a010abeda6 100644
--- a/src/fix-ng/fix-expr.hh
+++ b/src/fix-ng/fix-expr.hh
@@ -14,6 +14,38 @@
 typedef ATerm Expr;
 
 
+/* Mappings from ATerms to ATerms.  This is just a wrapper around
+   ATerm tables. */
+class ATermMap
+{
+private:
+    unsigned int maxLoadPct;
+    ATermTable table;
+    
+public:
+    ATermMap(unsigned int initialSize = 16, unsigned int maxLoadPct = 75);
+    ATermMap(const ATermMap & map);
+    ~ATermMap();
+
+    void set(ATerm key, ATerm value);
+    void set(const string & key, ATerm value);
+
+    ATerm get(ATerm key) const;
+    ATerm get(const string & key) const;
+
+    void remove(ATerm key);
+    void remove(const string & key);
+
+    ATermList keys() const;
+};
+
+
+/* Convert a string to an ATerm (i.e., a quoted nullary function
+   applicaton). */
+ATerm string2ATerm(const string & s);
+string aterm2String(ATerm t);
+
+
 /* Generic bottomup traversal over ATerms.  The traversal first
    recursively descends into subterms, and then applies the given term
    function to the resulting term. */
@@ -25,19 +57,17 @@ ATerm bottomupRewrite(TermFun & f, ATerm e);
 
 /* Query all attributes in an attribute set expression.  The
    expression must be in normal form. */
-typedef map<string, Expr> Attrs;
-void queryAllAttrs(Expr e, Attrs & attrs);
+void queryAllAttrs(Expr e, ATermMap & attrs);
 
 /* Query a specific attribute from an attribute set expression.  The
    expression must be in normal form. */
 Expr queryAttr(Expr e, const string & name);
 
 /* Create an attribute set expression from an Attrs value. */
-Expr makeAttrs(const Attrs & attrs);
+Expr makeAttrs(const ATermMap & attrs);
 
 /* Perform a set of substitutions on an expression. */
-typedef map<string, Expr> Subs;
-ATerm substitute(Subs & subs, ATerm e);
+Expr substitute(const ATermMap & subs, Expr e);
 
 
 #endif /* !__FIXEXPR_H */