--- rpl/modules/sets/union.rplc 2017/07/02 22:28:20 1.2 +++ rpl/modules/sets/union.rplc 2017/07/03 11:47:05 1.3 @@ -2,10 +2,143 @@ #include "sets.h" declareExternalFunction(union) + declareObject(object1); + declareObject(object2); + declareObject(result); + + integer8 i; + integer8 j; + integer8 k; + integer8 target(vector); + + HEADER + declareHelpString("Union"); + numberOfArguments(2); + FUNCTION + pullFromStack(object1, external); + returnOnError(freeObject(object1)); + pullFromStack(object2, external); + returnOnError(freeObject(object1); freeObject(object2)); + + if ((objectSubtype(object1) ne ISET) or + (objectSubtype(object2) ne ISET)) then + executionError("Type not allowed"); + returnOnError(freeObject(object1); freeObject(object2)); + endIf + + vector = allocate(((*((set_t *) (*object1).objet)).size + + (*((set_t *) (*object2).objet)).size) * size(integer8)); + + i = 0; + j = 0; + k = 0; + + repeatWhile((i lt (*((set_t *) (*object1).objet)).size) and + (j lt (*((set_t *) (*object2).objet)).size)) + if ((*((set_t *) (*object1).objet)).values[i] lt + (*((set_t *) (*object2).objet)).values[j]) then + vector[k] = (*((set_t *) (*object1).objet)).values[i]; + postIncr(i); + elseIf ((*((set_t *) (*object2).objet)).values[j] lt + (*((set_t *) (*object1).objet)).values[i]) then + vector[k] = (*((set_t *) (*object2).objet)).values[j]; + postIncr(j); + orElse + vector[k] = (*((set_t *) (*object2).objet)).values[j]; + postIncr(i); + postIncr(j); + endIf + + postIncr(k); + endWhile + + repeatWhile(i lt (*((set_t *) (*object1).objet)).size) + vector[k] = (*((set_t *) (*object1).objet)).values[i]; + postIncr(i); + postIncr(k); + endWhile + + repeatWhile(j lt (*((set_t *) (*object2).objet)).size) + vector[k] = (*((set_t *) (*object2).objet)).values[j]; + postIncr(j); + postIncr(k); + endWhile + + vector = reallocate(vector, k * size(integer8)); + + createExternalObject(result, ISET); + (*result).objet = allocate(size(set_t)); + + (*((set_t *) (*result).objet)).size = k; + (*((set_t *) (*result).objet)).values = vector; + + freeObject(object1); + freeObject(object2); + + pushOnStack(result); + END +endExternalFunction + +declareExternalFunction(intersection) + declareObject(object1); + declareObject(object2); + declareObject(result); + + integer8 i; + integer8 j; + integer8 k; + integer8 target(vector); + HEADER declareHelpString("Union"); numberOfArguments(2); FUNCTION + pullFromStack(object1, external); + returnOnError(freeObject(object1)); + pullFromStack(object2, external); + returnOnError(freeObject(object1); freeObject(object2)); + + if ((objectSubtype(object1) ne ISET) or + (objectSubtype(object2) ne ISET)) then + executionError("Type not allowed"); + returnOnError(freeObject(object1); freeObject(object2)); + endIf + + vector = allocate((*((set_t *) (*object1).objet)).size + * size(integer8)); + + i = 0; + j = 0; + k = 0; + + repeatWhile((i lt (*((set_t *) (*object1).objet)).size) and + (j lt (*((set_t *) (*object2).objet)).size)) + if ((*((set_t *) (*object1).objet)).values[i] lt + (*((set_t *) (*object2).objet)).values[j]) then + postIncr(i); + elseIf ((*((set_t *) (*object2).objet)).values[j] lt + (*((set_t *) (*object1).objet)).values[i]) then + postIncr(j); + orElse + vector[k] = (*((set_t *) (*object2).objet)).values[j]; + postIncr(i); + postIncr(j); + postIncr(k); + endIf + endWhile + + vector = reallocate(vector, k * size(integer8)); + + createExternalObject(result, ISET); + (*result).objet = allocate(size(set_t)); + + (*((set_t *) (*result).objet)).size = k; + (*((set_t *) (*result).objet)).values = vector; + + freeObject(object1); + freeObject(object2); + + pushOnStack(result); END endExternalFunction