ui/src/vbt/MiscDetail.m3


Copyright (C) 1994, Digital Equipment Corp.
<*PRAGMA LL*>

MODULE MiscDetail;

VAR mu := NEW(MUTEX);
    tbl := NEW(REF ARRAY OF REFANY, 0);

PROCEDURE FromRef (ra: REFANY): INTEGER =
  BEGIN
    IF ra = NIL THEN RETURN -1 END;
    LOCK mu DO
      FOR i := 0 TO LAST(tbl^) DO
        IF tbl[i] = NIL THEN tbl[i] := ra; RETURN i END
      END;
      VAR
        n   := NUMBER(tbl^);
        new := NEW(REF ARRAY OF REFANY, MAX(4, 2 * n));
      BEGIN
        SUBARRAY(new^, 0, n) := tbl^;
        FOR i := n TO LAST(new^) DO new[i] := NIL END;
        new[n] := ra;
        tbl := new;
        RETURN n
      END
    END
  END FromRef;

PROCEDURE ToRef (i: INTEGER): REFANY =
  BEGIN
    LOCK mu DO
      IF i < 0 OR i > LAST(tbl^) THEN RETURN NIL END;
      RETURN tbl[i]
    END
  END ToRef;

PROCEDURE Delete(i: INTEGER) =
  BEGIN
    LOCK mu DO
      IF i < 0 OR i > LAST(tbl^) THEN RETURN END;
      tbl[i] := NIL
    END
  END Delete;

BEGIN
END MiscDetail.