2003-11-18 14:06:07 +02:00
|
|
|
#ifndef __NIXEXPR_H
|
|
|
|
#define __NIXEXPR_H
|
2003-10-30 18:11:24 +02:00
|
|
|
|
2003-10-31 19:09:31 +02:00
|
|
|
#include <map>
|
|
|
|
|
2003-10-30 18:11:24 +02:00
|
|
|
#include <aterm2.h>
|
|
|
|
|
|
|
|
#include "util.hh"
|
|
|
|
|
|
|
|
|
2003-11-18 14:06:07 +02:00
|
|
|
/* Nix expressions are represented as ATerms. The maximal sharing
|
2003-10-30 18:11:24 +02:00
|
|
|
property of the ATerm library allows us to implement caching of
|
|
|
|
normals forms efficiently. */
|
|
|
|
typedef ATerm Expr;
|
|
|
|
|
2004-10-27 01:54:26 +03:00
|
|
|
typedef ATerm Pos;
|
|
|
|
|
2003-10-30 18:11:24 +02:00
|
|
|
|
2003-11-03 22:30:40 +02:00
|
|
|
/* Mappings from ATerms to ATerms. This is just a wrapper around
|
|
|
|
ATerm tables. */
|
|
|
|
class ATermMap
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
unsigned int maxLoadPct;
|
|
|
|
ATermTable table;
|
|
|
|
|
|
|
|
public:
|
2004-02-04 18:03:29 +02:00
|
|
|
ATermMap(unsigned int initialSize = 64, unsigned int maxLoadPct = 75);
|
2003-11-03 22:30:40 +02:00
|
|
|
ATermMap(const ATermMap & map);
|
|
|
|
~ATermMap();
|
|
|
|
|
2005-05-08 13:28:19 +03:00
|
|
|
ATermMap & ATermMap::operator = (const ATermMap & map);
|
|
|
|
|
2003-11-03 22:30:40 +02:00
|
|
|
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;
|
2004-02-04 18:03:29 +02:00
|
|
|
|
|
|
|
void add(const ATermMap & map);
|
|
|
|
|
|
|
|
void reset();
|
|
|
|
|
|
|
|
private:
|
|
|
|
void add(const ATermMap & map, ATermList & keys);
|
2005-05-08 13:28:19 +03:00
|
|
|
|
|
|
|
void free();
|
|
|
|
void copy(const ATermMap & map);
|
2003-11-03 22:30:40 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2004-08-04 13:59:20 +03:00
|
|
|
/* A STL vector of ATerms. Should be used with great care since it's
|
|
|
|
stored on the heap, and the elements are therefore not roots to the
|
|
|
|
ATerm garbage collector. */
|
|
|
|
typedef vector<ATerm> ATermVector;
|
|
|
|
|
|
|
|
|
2004-04-06 01:27:41 +03:00
|
|
|
/* Show a position. */
|
|
|
|
string showPos(ATerm pos);
|
|
|
|
|
2003-10-30 18:11:24 +02:00
|
|
|
/* Generic bottomup traversal over ATerms. The traversal first
|
|
|
|
recursively descends into subterms, and then applies the given term
|
|
|
|
function to the resulting term. */
|
|
|
|
struct TermFun
|
|
|
|
{
|
|
|
|
virtual ATerm operator () (ATerm e) = 0;
|
|
|
|
};
|
|
|
|
ATerm bottomupRewrite(TermFun & f, ATerm e);
|
|
|
|
|
2003-10-31 19:09:31 +02:00
|
|
|
/* Query all attributes in an attribute set expression. The
|
|
|
|
expression must be in normal form. */
|
2004-04-06 01:27:41 +03:00
|
|
|
void queryAllAttrs(Expr e, ATermMap & attrs, bool withPos = false);
|
2003-10-31 19:09:31 +02:00
|
|
|
|
|
|
|
/* Query a specific attribute from an attribute set expression. The
|
|
|
|
expression must be in normal form. */
|
|
|
|
Expr queryAttr(Expr e, const string & name);
|
2004-04-06 01:27:41 +03:00
|
|
|
Expr queryAttr(Expr e, const string & name, ATerm & pos);
|
2003-10-31 19:09:31 +02:00
|
|
|
|
|
|
|
/* Create an attribute set expression from an Attrs value. */
|
2003-11-03 22:30:40 +02:00
|
|
|
Expr makeAttrs(const ATermMap & attrs);
|
2003-10-31 19:09:31 +02:00
|
|
|
|
|
|
|
/* Perform a set of substitutions on an expression. */
|
2003-11-03 22:30:40 +02:00
|
|
|
Expr substitute(const ATermMap & subs, Expr e);
|
2003-10-31 19:09:31 +02:00
|
|
|
|
2004-02-03 16:45:34 +02:00
|
|
|
/* Check whether all variables are defined in the given expression.
|
|
|
|
Throw an exception if this isn't the case. */
|
|
|
|
void checkVarDefs(const ATermMap & def, Expr e);
|
|
|
|
|
2003-11-05 18:27:40 +02:00
|
|
|
/* Create an expression representing a boolean. */
|
|
|
|
Expr makeBool(bool b);
|
|
|
|
|
2003-10-30 18:11:24 +02:00
|
|
|
|
2003-11-18 14:06:07 +02:00
|
|
|
#endif /* !__NIXEXPR_H */
|