| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- MODULE TPackedSet;
- // ISO PACKEDSET: 1/2/4-byte storage, INCL/EXCL/IN, ORD, elements in
- // records/arrays, value and VAR parameters, set operations. Exit 42.
- TYPE
- Small = PACKEDSET OF [0..7];
- Wide2 = PACKEDSET OF [0..15];
- Wide4 = PACKEDSET OF [0..31];
- Colour = (red, blue, green, yellow, cyan, purple, black);
- CS = PACKEDSET OF Colour;
- Rec = RECORD
- s : Small;
- tag: CARDINAL;
- END;
- Arr = ARRAY [0..3] OF Small;
- Set8 = SET OF [0..7];
- CONST SC = Small{1, 2};
- VAR ExitCode : INTEGER;
- VAR s, t : Small;
- VAR w2 : Wide2;
- VAR w4 : Wide4;
- VAR c : CS;
- VAR r : Rec;
- VAR a, b : Arr;
- VAR n : Set8;
- VAR i : INTEGER;
- PROCEDURE Take (x: Small) : CARDINAL;
- BEGIN
- RETURN ORD(x)
- END Take;
- PROCEDURE AddTo (VAR x: Small; v: CARDINAL);
- BEGIN
- INCL(x, v)
- END AddTo;
- PROCEDURE Has2 (x: Set8) : BOOLEAN;
- BEGIN
- RETURN 2 IN x
- END Has2;
- PROCEDURE TakePacked (x: Small) : CARDINAL;
- BEGIN
- RETURN ORD(x)
- END TakePacked;
- BEGIN
- i := 0;
- s := Small{};
- t := Small{1, 2};
- AddTo(s, 3);
- EXCL(t, 1);
- IF (3 IN s) AND NOT (2 IN s) AND NOT (1 IN s) THEN i := i + 1 END;
- IF (2 IN t) AND NOT (1 IN t) THEN i := i + 2 END;
- c := CS{red, purple};
- IF (red IN c) AND (purple IN c) AND NOT (blue IN c) THEN i := i + 4 END;
- r.s := Small{7};
- INCL(r.s, 6);
- r.tag := 99;
- IF (6 IN r.s) AND (7 IN r.s) AND (r.tag = 99) THEN i := i + 8 END;
- a[0] := Small{1}; a[1] := Small{2}; a[2] := Small{3}; a[3] := Small{4};
- a[2] := Small{};
- IF (4 IN a[3]) AND NOT (3 IN a[2]) THEN i := i + 16 END;
- IF (ORD(SC) = 6) AND (2 IN SC) THEN i := i + 3 END;
- b := a;
- IF (4 IN b[3]) AND NOT (3 IN b[2]) THEN i := i + 5 END;
- s := t + Small{4}; (* union, assigned back to packed *)
- n := s; (* packed -> normal representation *)
- IF (2 IN s) AND (4 IN s) AND (2 IN n) AND (4 IN n)
- AND Has2(s) AND (TakePacked(Set8{2}) = 4) THEN i := i + 3 END;
- w2 := Wide2{15};
- w4 := Wide4{31};
- IF (ORD(Small{2..5}) = 60)
- AND (SIZE(Small) = 1) AND (SIZE(Wide2) = 2) AND (SIZE(Wide4) = 4)
- AND (SIZE(s) = 1) AND (SIZE(w2) = 2) AND (SIZE(w4) = 4)
- AND (15 IN w2) AND (31 IN w4)
- AND (Take(s) = ORD(s)) THEN
- ExitCode := i
- ELSE
- ExitCode := 1
- END
- END TPackedSet.
|