In order to make use of an index, certain member functions have to defined by the user. Given an internal index named foo, the rewriter invokes two functions named
int get_foo_state() const;within the generated code. The user should provide the implementations for these functions within the datatypes.
void set_foo_state(int);
For example, reusing the well-formed formulas example (see section 4.1.2), an internal index on the datatype Wff can be implemented as follows:
#include <AD/rewrite/burs.h> class WffIndex { int state; public: WffIndex() : state(BURS::undefined_state) {} int get_wff_state() const { return state; } void set_wff_state(int s) { state = s; } }; datatype Wff : public WffIndex = F | T | Var (const char *) | And (Wff, Wff) | Or (Wff, Wff) | Not (Wff) | Implies (Wff, Wff) ; ... rewrite Simplify { index: Wff = wff; ... };
Here, the class WffIndex provides the internal index interface
functions get_wff_state
and set_wff_state
expected by
the rewriter. Note that each term must be initialized with the
state BURS::undefined_state
. This constant is defined within
the library include file <AD/rewrite/burs.h>
.
To enable the index, in the rewriter we specify that datatype Wff should make use of the index named wff, using the index: declaration.