cr.startblock(); {
/* Have update to call into */
VarDescriptor mdfyptr=VarDescriptor.makeNew("modifyptr");
- cr.outputline("int "+mdfyptr.getSafeSymbol()+"="+repairtable.getSafeSymbol()+"->getrelation2("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
+ VarDescriptor ismdfyptr=VarDescriptor.makeNew("ismodifyptr");
+ cr.outputline("int "+ismdfyptr.getSafeSymbol()+"="+repairtable.getSafeSymbol()+"->ismodify("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
+
+
+
String parttype="";
for(int i=0;i<currentrule.numQuantifiers();i++) {
cr.outputline("void *"+tmpptr.getSafeSymbol()+"=");
cr.outputline("(void *) "+repairtable.getSafeSymbol()+"->getrelation("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
- cr.outputline("if ("+mdfyptr.getSafeSymbol()+")");
+ cr.outputline("if ("+ismdfyptr.getSafeSymbol()+")");
{
cr.startblock();
+ cr.outputline("int "+mdfyptr.getSafeSymbol()+"="+repairtable.getSafeSymbol()+"->getrelation2("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
cr.outputline("void (*"+funptr.getSafeSymbol()+") ("+name+"_state *,"+name+"*,RepairHash *"+parttype+",int,int,int)="+"(void (*) ("+name+"_state *,"+name+"*,RepairHash *"+parttype+",int,int,int)) "+tmpptr.getSafeSymbol()+";");
cr.outputline(methodcall+","+leftvar+", "+rightvar+", "+mdfyptr.getSafeSymbol() +");");
cr.endblock();
// ************************************************************
-RepairHashNode::RepairHashNode(int setrelation, int rule, int lvalue, int rvalue, int data, int data2){
+RepairHashNode::RepairHashNode(int setrelation, int rule, int lvalue, int rvalue, int data, int data2, int ismodify){
this->setrelation = setrelation;
this->lvalue=lvalue;
this->rvalue=rvalue;
this->next = 0;
this->lnext=0;
this->rule=rule;
+ this->ismodify=ismodify;
}
// ************************************************************
}
int RepairHash::addrelation(int relation, int rule, int lvalue, int rvalue, int data) {
- return addrelation(relation,rule,lvalue,rvalue,data, 0);
+ unsigned int hashkey = ((unsigned int)(relation ^ rule ^ lvalue ^ rvalue)) % size;
+
+ RepairHashNode **ptr = &bucket[hashkey];
+
+ /* check that this key/object pair isn't already here */
+ // TBD can be optimized for set v. relation */
+ while (*ptr) {
+ if ((*ptr)->setrelation == relation &&
+ (*ptr)->rule==rule &&
+ (*ptr)->lvalue==lvalue &&
+ (*ptr)->rvalue==rvalue &&
+ (*ptr)->data == data&&
+ (*ptr)->data2 == 0) {
+ return 0;
+ }
+ ptr = &((*ptr)->next);
+ }
+
+ *ptr = new RepairHashNode(relation,rule,lvalue,rvalue, data,0,0);
+ (*ptr)->lnext=nodelist;
+ nodelist=*ptr;
+ numelements++;
+ return 1;
}
int RepairHash::addrelation(int relation, int rule, int lvalue, int rvalue, int data, int data2) {
ptr = &((*ptr)->next);
}
- *ptr = new RepairHashNode(relation,rule,lvalue,rvalue, data,data2);
+ *ptr = new RepairHashNode(relation,rule,lvalue,rvalue, data,data2,1);
(*ptr)->lnext=nodelist;
nodelist=*ptr;
numelements++;
return getrelation(setv||SETFLAG, rule, value,0);
}
+int RepairHash::ismodify(int relation, int rule, int lvalue,int rvalue) {
+ unsigned int hashkey = ((unsigned int)(relation ^ rule ^ lvalue ^ rvalue)) % size;
+
+ RepairHashNode **ptr = &bucket[hashkey];
+
+ /* check that this key/object pair isn't already here */
+ // TBD can be optimized for set v. relation */
+ while (*ptr) {
+ if ((*ptr)->setrelation == relation &&
+ (*ptr)->rule==rule &&
+ (*ptr)->lvalue==lvalue &&
+ (*ptr)->rvalue==rvalue) {
+ return (*ptr)->ismodify;
+ }
+ ptr = &((*ptr)->next);
+ }
+ return 0;
+}
+
int RepairHash::getrelation2(int relation, int rule, int lvalue,int rvalue) {
unsigned int hashkey = ((unsigned int)(relation ^ rule ^ lvalue ^ rvalue)) % size;
}
return 0;
}
+
int RepairHash::getrelation(int relation, int rule, int lvalue,int rvalue) {
unsigned int hashkey = ((unsigned int)(relation ^ rule ^ lvalue ^ rvalue)) % size;
int lvalue;
int rvalue;
int rule;
- RepairHashNode(int setrelation, int rule, int lvalue, int rvalue, int data, int data2);
+ int ismodify;
+ RepairHashNode(int setrelation, int rule, int lvalue, int rvalue, int data, int data2,int ismodify);
};
class RepairHash {
int getset(int setv, int rule, int value);
int getrelation(int relation, int rule, int lvalue, int rvalue);
int getrelation2(int relation, int rule, int lvalue, int rvalue);
+ int ismodify(int relation, int rule, int lvalue, int rvalue);
};
#endif