--- rpl/modules/sets/union.rplc 2017/07/03 11:47:05 1.3 +++ rpl/modules/sets/union.rplc 2017/07/31 08:59:37 1.5 @@ -67,73 +67,10 @@ declareExternalFunction(union) vector = reallocate(vector, k * size(integer8)); createExternalObject(result, ISET); - (*result).objet = allocate(size(set_t)); + objectOf(result) = 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; + objectContainer(set_t, result)->size = k; + objectContainer(set_t, result)->values = vector; freeObject(object1); freeObject(object2);