class Item { public: Item(const char *name) { Item::name=name; } virtual ~Item() {}; //Bool hasQS(const char *statename); virtual int queryState(const char *statename) =0; //Bool hasSS(const char *statename); virtual void setState(const char *statename, int newState) =0; const char *queryName() { return name; } private: const char *name; }; class SCM; class Dependency { public: Dependency(Item *item, const char *stateName, const char *expression) { Dependency::item=item; state=stateName; expr=expression; } virtual ~Dependency() {} private: friend class SCM; void apply(SCM *scm); const char *queryState(SCM *scm, const char *p, int *b); Item *item; const char *state; const char *expr; }; class SCM { public: SCM(); virtual ~SCM(); void addItem(Item *item); void addDependency(const char *itemName, const char *stateName, const char *expr); void changed(const char *itemName); void changed(); int queryItemState(const char *itemName, const char *stateName); private: Item **itemTable; unsigned items,itemsAlloc; Dependency **dependencyTable; unsigned dependencies,dependenciesAlloc; }; /* ... scm.addItem(MakeItem(c_lzw,"b1")); scm.addDependency("b1","e","a1.c"); //b1.e = a1.c ... scm.addDependency("d1","e","a1.c|a2.c|a3.c|a4.c"); */