home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / OB3.2D2.DMS / in.adf / Module / BigSets.mod < prev    next >
Encoding:
Text File  |  1994-08-05  |  5.1 KB  |  257 lines

  1. (*-------------------------------------------------------------------------*)
  2. (*                                                                         *)
  3. (*  Amiga Oberon Interface Module: BigSets            Date: 02-Nov-92      *)
  4. (*                                                                         *)
  5. (*   © 1992 by Fridtjof Siebert                                            *)
  6. (*                                                                         *)
  7. (*-------------------------------------------------------------------------*)
  8.  
  9. MODULE BigSets;
  10.  
  11. IMPORT BasicTypes;
  12.  
  13. TYPE
  14.   BigSet * = POINTER TO BigSetDesc;
  15.   BigSetDesc * = RECORD (BasicTypes.ANYDesc)
  16.     nbElements - : LONGINT;
  17.     bits         : POINTER TO ARRAY OF SET;
  18.   END;
  19.  
  20. CONST
  21.   SetSize = MAX(SET) + 1;
  22.  
  23.  
  24. PROCEDURE Create * (nbElements: LONGINT): BigSet;
  25. (*
  26.  * Create empty Set with numElements Elements of the range 0..n-1
  27.  *
  28.  * require
  29.  *   0 <= numElements
  30.  *
  31.  * ensure
  32.  *   Result.numElements = numElements;
  33.  *   0 <= x < numElementes IMPLIES ~ Result.In(x)
  34.  *
  35.  *)
  36.  
  37. VAR
  38.   new: BigSet;
  39.  
  40. BEGIN
  41.   NEW(new);
  42.   NEW(new.bits,(nbElements + MAX(SET)) DIV SetSize);
  43.   new.nbElements := nbElements;
  44.   RETURN new;
  45. END Create;
  46.  
  47.  
  48. PROCEDURE (b: BigSet) Copy * (): BigSet;
  49. (*
  50.  * Create a 1 : 1 copy of b.
  51.  *
  52.  * ensure
  53.  *   Result.numElements = b.numElements;
  54.  *     b.In(x) IMPLIES   Result.In(x)
  55.  *   ~ b.In(x) IMPLIES ~ Result.In(x)
  56.  *
  57.  *)
  58.  
  59. VAR
  60.   copy: BigSet;
  61.   i: LONGINT;
  62. BEGIN
  63.   copy := Create(b.nbElements);
  64.   FOR i:=0 TO LEN(b.bits^)-1 DO
  65.     copy.bits[i] := b.bits[i];
  66.   END;
  67.   RETURN copy;
  68. END Copy;
  69.  
  70.  
  71. PROCEDURE (b: BigSet) Incl * (e: LONGINT);
  72. (*
  73.  * require
  74.  *   0 <= e < b.numElements;
  75.  *
  76.  * ensure
  77.  *   b.In(e);
  78.  *
  79.  *)
  80.  
  81. BEGIN
  82.   INCL(b.bits[e DIV SetSize],e MOD SetSize);
  83. END Incl;
  84.  
  85.  
  86. PROCEDURE (b: BigSet) Excl * (e: LONGINT);
  87. (*
  88.  * require
  89.  *   0 <= e < b.numElements;
  90.  *
  91.  * ensure
  92.  *   ~ b.In(e);
  93.  *
  94.  *)
  95.  
  96. BEGIN
  97.   EXCL(b.bits[e DIV SetSize],e MOD SetSize);
  98. END Excl;
  99.  
  100.  
  101. PROCEDURE (b: BigSet) In * (e: LONGINT): BOOLEAN;
  102. (*
  103.  * require
  104.  *   0 <= e < b.numElements;
  105.  *
  106.  *)
  107.  
  108. BEGIN
  109.   RETURN (e MOD SetSize) IN b.bits[e DIV SetSize];
  110. END In;
  111.  
  112.  
  113. PROCEDURE (b: BigSet) Complement * (): BigSet;
  114. (*
  115.  * ensure
  116.  *   Result.numElements = b.numElements;
  117.  *     Result.In(x) IMPLIES ~ b.In(x);
  118.  *   ~ Result.In(x) IMPLIES   b.In(x)
  119.  *)
  120.  
  121. VAR
  122.   n: LONGINT;
  123.   result: BigSet;
  124.  
  125. BEGIN
  126.   result := Create(b.nbElements);
  127.   FOR n := 0 TO LEN(b.bits^)-1 DO
  128.     result.bits[n] := - b.bits[n];
  129.   END;
  130.   RETURN result;
  131. END Complement;
  132.  
  133.  
  134. PROCEDURE NewMax(a,b: BigSet): BigSet;
  135. (*
  136.  * allocates new Set. Result.nbElements = MAX(a.nbElements,b.nbElements);
  137.  *)
  138. VAR
  139.   c: BigSet;
  140. BEGIN
  141.   IF b.nbElements > a.nbElements THEN
  142.     a := b;
  143.   END;
  144.   c := Create(a.nbElements);
  145.   RETURN c;
  146. END NewMax;
  147.  
  148.  
  149. PROCEDURE Min(a,b: BigSet): LONGINT;
  150. (*
  151.  * Result is MIN(a.bits^,b.bits^)-1
  152.  *)
  153. BEGIN
  154.   IF LEN(b.bits^) < LEN(a.bits^) THEN
  155.     RETURN LEN(b.bits^)-1;
  156.   ELSE
  157.     RETURN LEN(a.bits^)-1;
  158.   END;
  159. END Min;
  160.  
  161.  
  162. PROCEDURE (b: BigSet) Difference * (c: BigSet): BigSet;
  163. (*
  164.  * require
  165.  *   c # NIL;
  166.  *
  167.  * ensure
  168.  *   Result.numElements = b.numElements;
  169.  *     Result.In(x) IMPLIES   b.In(x) &  ~ c.In(x);
  170.  *   ~ Result.In(x) IMPLIES ~ b.In(x) OR   c.In(x);
  171.  *)
  172.  
  173. VAR
  174.   n: LONGINT;
  175.   result: BigSet;
  176.  
  177. BEGIN
  178.   result := NewMax(b,c);
  179.   FOR n := 0              TO Min(b,c)       DO result.bits[n] := b.bits[n] - c.bits[n] END;
  180.   FOR n := LEN(b.bits^)-1 TO LEN(c.bits^)-1 DO result.bits[n] := b.bits[n]             END;
  181.   RETURN result;
  182. END Difference;
  183.  
  184.  
  185. PROCEDURE (b: BigSet) Intersection * (c: BigSet): BigSet;
  186. (*
  187.  * require
  188.  *   c # NIL;
  189.  *
  190.  * ensure
  191.  *   Result.numElements = b.numElements;
  192.  *     Result.In(x) IMPLIES   b.In(x) &    c.In(x);
  193.  *   ~ Result.In(x) IMPLIES ~ b.In(x) OR ~ c.In(x);
  194.  *)
  195.  
  196. VAR
  197.   n: LONGINT;
  198.   result: BigSet;
  199.  
  200. BEGIN
  201.   result := NewMax(b,c);
  202.   FOR n := 0              TO Min(b,c)       DO result.bits[n] := b.bits[n] * c.bits[n] END;
  203.   RETURN result;
  204. END Intersection;
  205.  
  206.  
  207. PROCEDURE (b: BigSet) SymmetricDifference * (c: BigSet): BigSet;
  208. (*
  209.  * require
  210.  *   c # NIL;
  211.  *
  212.  * ensure
  213.  *   Result.numElements = b.numElements;
  214.  *     Result.In(x) IMPLIES b.In(x) # c.In(x);
  215.  *   ~ Result.In(x) IMPLIES b.In(x) = c.In(x);
  216.  *)
  217.  
  218. VAR
  219.   n: LONGINT;
  220.   result: BigSet;
  221.  
  222. BEGIN
  223.   result := NewMax(b,c);
  224.   FOR n := 0              TO Min(b,c)       DO result.bits[n] := b.bits[n] / c.bits[n] END;
  225.   FOR n := LEN(b.bits^)-1 TO LEN(c.bits^)-1 DO result.bits[n] := b.bits[n]             END;
  226.   FOR n := LEN(c.bits^)-1 TO LEN(b.bits^)-1 DO result.bits[n] :=             c.bits[n] END;
  227.   RETURN result;
  228. END SymmetricDifference;
  229.  
  230.  
  231. PROCEDURE (b: BigSet) Union * (c: BigSet): BigSet;
  232. (*
  233.  * require
  234.  *   c # NIL;
  235.  *
  236.  * ensure
  237.  *   Result.numElements = b.numElements;
  238.  *     Result.In(x) IMPLIES   b.In(x) OR   c.In(x);
  239.  *   ~ Result.In(x) IMPLIES ~ b.In(x) &  ~ c.In(x);
  240.  *)
  241.  
  242. VAR
  243.   n: LONGINT;
  244.   result: BigSet;
  245.  
  246. BEGIN
  247.   result := NewMax(b,c);
  248.   FOR n := 0              TO Min(b,c)       DO result.bits[n] := b.bits[n] + c.bits[n] END;
  249.   FOR n := LEN(b.bits^)-1 TO LEN(c.bits^)-1 DO result.bits[n] := b.bits[n]             END;
  250.   FOR n := LEN(c.bits^)-1 TO LEN(b.bits^)-1 DO result.bits[n] := c.bits[n]             END;
  251.   RETURN result;
  252. END Union;
  253.  
  254.  
  255. END BigSets.
  256.  
  257.