// Copyright (C) 2006, Ondra Kamenik // $Id: static_atoms.h 1218 2007-03-19 21:52:49Z kamenik $ #ifndef OGP_STATIC_ATOMS #define OGP_STATIC_ATOMS #include "dynamic_atoms.h" namespace ogp { class StaticAtoms : public Atoms, public Constants { protected: typedef map Tvarmap; typedef map Tinvmap; /** Storage for names. */ NameStorage varnames; /** Outer order of variables. */ vector varorder; /** This is the map mapping a variable name to the tree * index. */ Tvarmap vars; /** This is the inverse mapping. It maps a tree index to the * variable name. */ Tinvmap indices; public: StaticAtoms() : Atoms(), Constants(), varnames(), varorder(), vars() { } /* Copy constructor. */ StaticAtoms(const StaticAtoms &a); /** Conversion from DynamicAtoms. This takes all atoms from * the DynamicAtoms and adds its static version. The new tree * indices are allocated in the passed OperationTree. Whole * the process is traced in the map mapping old tree indices * to new tree indices. */ StaticAtoms(const DynamicAtoms &da, OperationTree &otree, Tintintmap &tmap) : Atoms(), Constants(), varnames(), varorder(), vars() { import_atoms(da, otree, tmap); } /* Destructor. */ virtual ~StaticAtoms() { } /** This imports atoms from dynamic atoms inserting the new * tree indices to the given tree (including constants). The * mapping from old atoms to new atoms is traced in tmap. */ void import_atoms(const DynamicAtoms &da, OperationTree &otree, Tintintmap &tmap); /** If the name is constant, it returns its tree index if the * constant is registered in Constants, it returns -1 * otherwise. If the name is not constant, it returns result * from check_variable, which is implemented by a subclass. */ int check(const char *name) const; /** This assigns a given tree index to the variable name. The * name should have been checked before the call. */ void assign(const char *name, int t); int nvar() const { return varnames.num(); } /** This returns a vector of all variables. */ vector variables() const; /** This returns a tree index of the given variable. */ int index(const char *name) const; /** This returns a name from the given tree index. NULL is * returned if the tree index doesn't exist. */ const char *inv_index(int t) const; /** This returns a name in a outer ordering. (There is no other ordering.) */ const char * name(int i) const { return varorder[i]; } /** Debug print. */ void print() const; /** This registers a variable. A subclass can reimplement * this, for example, to ensure uniqueness of the * name. However, this method should be always called in * overriding methods to do the registering job. */ virtual void register_name(const char *name); /** Return the name storage to allow querying to other * classes. */ const NameStorage & get_name_storage() const { return varnames; } protected: /** This checks the variable. The implementing subclass might * want to throw an exception if the variable has not been * registered. */ virtual int check_variable(const char *name) const = 0; }; }; #endif // Local Variables: // mode:C++ // End: