t_packedset.mod 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. MODULE TPackedSet;
  2. // ISO PACKEDSET: 1/2/4-byte storage, INCL/EXCL/IN, ORD, elements in
  3. // records/arrays, value and VAR parameters, set operations. Exit 42.
  4. TYPE
  5. Small = PACKEDSET OF [0..7];
  6. Wide2 = PACKEDSET OF [0..15];
  7. Wide4 = PACKEDSET OF [0..31];
  8. Colour = (red, blue, green, yellow, cyan, purple, black);
  9. CS = PACKEDSET OF Colour;
  10. Rec = RECORD
  11. s : Small;
  12. tag: CARDINAL;
  13. END;
  14. Arr = ARRAY [0..3] OF Small;
  15. Set8 = SET OF [0..7];
  16. CONST SC = Small{1, 2};
  17. VAR ExitCode : INTEGER;
  18. VAR s, t : Small;
  19. VAR w2 : Wide2;
  20. VAR w4 : Wide4;
  21. VAR c : CS;
  22. VAR r : Rec;
  23. VAR a, b : Arr;
  24. VAR n : Set8;
  25. VAR i : INTEGER;
  26. PROCEDURE Take (x: Small) : CARDINAL;
  27. BEGIN
  28. RETURN ORD(x)
  29. END Take;
  30. PROCEDURE AddTo (VAR x: Small; v: CARDINAL);
  31. BEGIN
  32. INCL(x, v)
  33. END AddTo;
  34. PROCEDURE Has2 (x: Set8) : BOOLEAN;
  35. BEGIN
  36. RETURN 2 IN x
  37. END Has2;
  38. PROCEDURE TakePacked (x: Small) : CARDINAL;
  39. BEGIN
  40. RETURN ORD(x)
  41. END TakePacked;
  42. BEGIN
  43. i := 0;
  44. s := Small{};
  45. t := Small{1, 2};
  46. AddTo(s, 3);
  47. EXCL(t, 1);
  48. IF (3 IN s) AND NOT (2 IN s) AND NOT (1 IN s) THEN i := i + 1 END;
  49. IF (2 IN t) AND NOT (1 IN t) THEN i := i + 2 END;
  50. c := CS{red, purple};
  51. IF (red IN c) AND (purple IN c) AND NOT (blue IN c) THEN i := i + 4 END;
  52. r.s := Small{7};
  53. INCL(r.s, 6);
  54. r.tag := 99;
  55. IF (6 IN r.s) AND (7 IN r.s) AND (r.tag = 99) THEN i := i + 8 END;
  56. a[0] := Small{1}; a[1] := Small{2}; a[2] := Small{3}; a[3] := Small{4};
  57. a[2] := Small{};
  58. IF (4 IN a[3]) AND NOT (3 IN a[2]) THEN i := i + 16 END;
  59. IF (ORD(SC) = 6) AND (2 IN SC) THEN i := i + 3 END;
  60. b := a;
  61. IF (4 IN b[3]) AND NOT (3 IN b[2]) THEN i := i + 5 END;
  62. s := t + Small{4}; (* union, assigned back to packed *)
  63. n := s; (* packed -> normal representation *)
  64. IF (2 IN s) AND (4 IN s) AND (2 IN n) AND (4 IN n)
  65. AND Has2(s) AND (TakePacked(Set8{2}) = 4) THEN i := i + 3 END;
  66. w2 := Wide2{15};
  67. w4 := Wide4{31};
  68. IF (ORD(Small{2..5}) = 60)
  69. AND (SIZE(Small) = 1) AND (SIZE(Wide2) = 2) AND (SIZE(Wide4) = 4)
  70. AND (SIZE(s) = 1) AND (SIZE(w2) = 2) AND (SIZE(w4) = 4)
  71. AND (15 IN w2) AND (31 IN w4)
  72. AND (Take(s) = ORD(s)) THEN
  73. ExitCode := i
  74. ELSE
  75. ExitCode := 1
  76. END
  77. END TPackedSet.