dps/src/Pile.m3


Copyright (C) 1994, Digital Equipment Corp.

MODULE Pile;

IMPORT Text;

PROCEDURE New (): T =
  BEGIN
  RETURN NEW (T, first := NIL, mutex := NEW (MUTEX));
  END New;

PROCEDURE Insert (pile: T; it: Element) =
  BEGIN
  LOCK pile.mutex DO
    it.next := pile.first;
    pile.first := it;
    END;
  END Insert;

PROCEDURE Delete (pile: T; it: Element) =
 VAR one: Element;
  BEGIN
  LOCK pile.mutex DO
    one := pile.first;
    <* ASSERT one # NIL *> (* Client error: Delete from empty pile! *)
    IF one = it THEN pile.first := one.next; RETURN; END;
    WHILE one.next#NIL DO
      IF one.next = it THEN one.next := one.next.next; RETURN; END;
      one := one.next;
      END;
    <* ASSERT FALSE *> (* Client error: Delete-ee not in pile! *)
    END; (* of LOCK *)
  END Delete;

PROCEDURE FindByKey (pile: T; key: INTEGER): Element =
 VAR one: Element;
  BEGIN
  LOCK pile.mutex DO
    one := pile.first;
    WHILE one#NIL DO
      IF one.key = key THEN RETURN one; END;
      one := one.next;
      END;
    END;
  RETURN NIL;
  END FindByKey;

PROCEDURE FindByName (pile: T; name: TEXT): Element =
 VAR one: Element;
  BEGIN
  LOCK pile.mutex DO
    one := pile.first;
    WHILE one#NIL DO
      IF Text.Equal(one.name, name) THEN RETURN one; END;
      one := one.next;
      END;
    END;
  RETURN NIL;
  END FindByName;

  BEGIN

  END Pile.