Universität Ulm, Fakultät für Mathematik und Wirtschaftswissenschaften, SAI

WS 2000/01 || Entwicklung objekt-orientierter Bibliotheken || Beispiele

Collections-17


TestLists LinearLists PrintableCollections PrintableIntegers Collections PrintableObjects Integers

In dieser Variante von Collections (die auf Collections-16 basiert) wurden die Operationen First und Next durch Iteratoren ersetzt. Dies hat insbesondere den Vorteil, daß es nun möglich ist, eine Kollektion gleichzeitig mehrfach durchzulaufen.

Collections
Hier wurden nur die Schnittstellenprozeduren First und Next durch GetIterator ersetzt:
PROCEDURE GetIterator(collection: Collection;
                      VAR iterator: Iterators.Iterator);

Integers
blieb unverändert.

LinearLists
Der Iterator wird durch die Prozedur IterateList repräsentiert,
PROCEDURE IterateList(it: Iterators.Iterator;
                      list: Objects.Object;
                      param: SHORTINT); (* ignored *)
   VAR
      linkable: Linkable;
BEGIN
   WITH list: List DO
      linkable := list.head;
      WHILE linkable # NIL DO
         Iterators.Yield(it, linkable.object);
         linkable := linkable.next;
      END;
   END;
END IterateList;
die dann durch die Schnittstellenprozedur GetIterator
PROCEDURE GetIterator(collection: Collections.Collection;
                      VAR iterator: Iterators.Iterator);
BEGIN
   Iterators.Create(iterator, IterateList, collection, 0);
END GetIterator;
zum Leben erweckt werden kann.

Der vierte Parameter von Iterators.Create wird als dritter Parameter an IterateList übergeben und dient zur vereinfachten Parameterisierung des Iterators, so kann beispielsweise die Reihenfolge spezifiziert werden. In diesem Beispiel wird davon aber kein Gebrauch gemacht.

PrintableCollections
Diese Version verwendet nun einen Iterator, um eine Kollektion zu durchlaufen:
PROCEDURE PrintCollection(s: Streams.Stream; object: Services.Object);
   VAR
      member: Disciplines.Object;
      first: BOOLEAN;
      it: Iterators.Iterator;
BEGIN
   WITH object: Collections.Collection DO
      Write.CharS(s, "(");
      Collections.GetIterator(object, it);
      first := TRUE;
      WHILE Iterators.Get(it, member) DO
	 IF first THEN
	    first := FALSE;
	 ELSE
	    Write.StringS(s, ", ");
	 END;
	 IF member IS Services.Object THEN
	    PrintableObjects.Print(s, member(Services.Object));
	 ELSE
	    Write.CharS(s, "?");
	 END;
      END;
      Write.StringS(s, ")");
   END;
END PrintCollection;

PrintableIntegers
blieb unverändert.

PrintableObjects
blieb unverändert.

TestLists
blieb unverändert.

Die Quellen stehen als Shell-Archiv zur Verfügung.
WS 2000/01 || Entwicklung objekt-orientierter Bibliotheken || Beispiele

Andreas Borchert, 8. Januar 2001