File:
[local] /
rpl /
modules /
sets /
intersection.rplc
Revision
1.2:
download - view:
text,
annotated -
select for diffs -
revision graph
Mon Jul 31 08:59:37 2017 UTC (7 years, 9 months ago) by
bertrand
Branches:
MAIN
CVS tags:
rpl-4_1_35,
rpl-4_1_34,
rpl-4_1_33,
rpl-4_1_32,
rpl-4_1_31,
rpl-4_1_30,
rpl-4_1_29,
rpl-4_1_28,
rpl-4_1_27,
HEAD
Correction de L->S
1: #include "src/rplexternals.h"
2: #include "sets.h"
3:
4: declareExternalFunction(intersection)
5: declareObject(object1);
6: declareObject(object2);
7: declareObject(result);
8:
9: integer8 i;
10: integer8 j;
11: integer8 k;
12: integer8 target(vector);
13:
14: HEADER
15: declareHelpString("Intersection");
16: numberOfArguments(2);
17: FUNCTION
18: pullFromStack(object1, external);
19: returnOnError(freeObject(object1));
20: pullFromStack(object2, external);
21: returnOnError(freeObject(object1); freeObject(object2));
22:
23: if ((objectSubtype(object1) ne ISET) or
24: (objectSubtype(object2) ne ISET)) then
25: executionError("Type not allowed");
26: returnOnError(freeObject(object1); freeObject(object2));
27: endIf
28:
29: vector = allocate((*((set_t *) (*object1).objet)).size
30: * size(integer8));
31:
32: i = 0;
33: j = 0;
34: k = 0;
35:
36: repeatWhile((i lt (*((set_t *) (*object1).objet)).size) and
37: (j lt (*((set_t *) (*object2).objet)).size))
38: if ((*((set_t *) (*object1).objet)).values[i] lt
39: (*((set_t *) (*object2).objet)).values[j]) then
40: postIncr(i);
41: elseIf ((*((set_t *) (*object2).objet)).values[j] lt
42: (*((set_t *) (*object1).objet)).values[i]) then
43: postIncr(j);
44: orElse
45: vector[k] = (*((set_t *) (*object2).objet)).values[j];
46: postIncr(i);
47: postIncr(j);
48: postIncr(k);
49: endIf
50: endWhile
51:
52: vector = reallocate(vector, k * size(integer8));
53:
54: createExternalObject(result, ISET);
55: objectOf(result) = allocate(size(set_t));
56:
57: objectContainer(set_t, result)->size = k;
58: objectContainer(set_t, result)->values = vector;
59:
60: freeObject(object1);
61: freeObject(object2);
62:
63: pushOnStack(result);
64: END
65: endExternalFunction
66:
67: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>