Diff for /rpl/modules/sets/union.rplc between versions 1.2 and 1.3

version 1.2, 2017/07/02 22:28:20 version 1.3, 2017/07/03 11:47:05
Line 2 Line 2
 #include "sets.h"  #include "sets.h"
   
 declareExternalFunction(union)  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      HEADER
         declareHelpString("Union");          declareHelpString("Union");
         numberOfArguments(2);          numberOfArguments(2);
     FUNCTION      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      END
 endExternalFunction  endExternalFunction
   

Removed from v.1.2  
changed lines
  Added in v.1.3


CVSweb interface <joel.bertrand@systella.fr>