next up previous contents
Next: 4.2.4 Operationen auf Listen Up: 4.2 CLS-Unterprogrammbibliothek Previous: 4.2.2 Objektstruktur

4.2.3 Implementation von Listen

Die nicht eindeutigen Beziehungen zwischen Objekten, also die Informationen über Unterobjekte, Referenzen und Rückreferenzen von Objekten sind in Form von einfach verketteten Listen repräsentiert. Teilweise könnten einfachere Organisationsformen, die die Reihenfolge nicht berücksichtigen, eingesetzt werden. Die Verwendung von Listen hat also - neben programmtechnischen Gründen - in vielen Fällen nur den Zweck, in Bezug auf die Reihenfolge ,,konservativ`` (erhaltend) zu sein. Zu den wenigen Ausnahmen zählen Linienreferenzen von Flächen, die ein geschlossenes Polygon ergeben müssen, und die Reihenfolge von Gitterelementen, die die Beziehung zu den in Feldern abgespeicherten Attributwerten herstellt.

Diese einfach verketteten Listen dienen auch zum beliebigen Gruppieren von Objekten.

Die grundlegende Listenimplementation ist unabhängig vom PAI und CLS. Sie wird von einer anderen Unterprogrammbibliothek (VISTA base data, VBD) versteckt gehandhabt. Diese Implementierung kennt nur eine Folge von Konstruktorknoten (jeder Konstruktorknoten besteht aus einem Zeiger auf das entsprechende Listenelement und einem Zeiger auf den nächsten Konstruktorknoten; der letzte Knoten enthält den NULL-Zeiger). Eine Liste wird einfach durch den Zeiger auf den ersten Knoten identifiziert, ist also kein eigener Datentyp. Es stehen Funktionen zur Verfügung, um Elemente der Listen zu suchen, zu entfernen oder zu extrahieren; dies kann nach verschiedensten, auch anwenderdefinierten, Kriterien geschehen.

Dieser sehr einfache Listentyp des VBD wird in CLS als Kern eines etwas leistungsfähigeren Typs, der clsReallist (,,Reale Liste``), verwendet. Sie wird durch eine Struktur definiert, die neben dem Zeiger auf den ersten auch einen auf den letzten Knoten der Liste enthält, um die Operationen ,,Element anhängen`` und ,,Listen verketten`` schnell durchführen zu können. Darüber hinaus gibt es eine Komponente linkcount, die die aktuellen Verwendungen zählt; compressed sagt aus, ob diese Liste aus echten Elementen oder aus Unterlisten besteht, und tag dient der CLS-internen Laufzeittypüberprüfung.

Die Teile eines Objektes ,,Liste der Kinder``, ,,Liste der Referenzen`` und ,,Liste der Rückreferenzen`` sind in den Objektdatenstrukturen als derartige clsReallists implementiert.

Darüber hinaus gibt es aber einen eigenen Listentyp in CLS, der gewisse Operationen wie Kopieren und Aneinanderhängen erlaubt, ohne effektiv Listen zu manipulieren. Dieser Typ heißt clsList (,,Virtuelle Liste``), und nur mit diesem können Listen des CLS von außen angesprochen werden.

Wenn z.B. eine Liste der Kinder eines Objektes angefordert wird, dann wird die vorhandene Reale Liste nicht etwa mit allen Knoten kopiert, sondern eine clsList-Struktur angelegt, die die Referenz ,,Kinder dieses Objektes`` enthält. Zum Schutz vor nun unerlaubtem Löschen des Objektes wird der linkcount seiner Realen Liste erhöht. (Wenn die Virtuelle Liste nachher nicht mehr freigegeben wird, kommt es spätestens beim Schließen der PIF-Datei zu dem bei Entwicklern berüchtigten Fehler ''List is still linked''.) Solange nun auf der angeforderten Liste nur Lese-Operationen durchgeführt werden, wird intern mit der Originalliste gearbeitet. Damit werden Änderungen am Stand der zugrundeliegenden Echten Liste, die direkt am Objekt durchgeführt werden, automatisch wirksam. Erst wenn die Virtuelle Liste verändert werden soll (z.B. Löschen, Hinzufügen oder Wechseln von Elementen), wird tatsächlich eine neue Echte Liste angelegt und linkcount in der Originalliste wieder vermindert.

Die Virtuelle Liste tritt in verschiedenen Formen auf, ohne daß der Anwendungsprogrammierer etwas davon merkt; aber jede Art der Virtuellen Liste verweist intern auf eine Reale Liste.

Die verschiedenen Möglichkeiten für Virtuelle Listen sind:

Echte Liste:
Die Liste verweist auf eine freie (nicht als Bestandteil eines CLS-Objektes vorliegende) Reale Liste. Diese kann wiederum Virtuelle Listen statt Elemente gruppieren.
Kinder eines Objektes:
Die Liste verweist auf ein CLS-Objekt mit dem internen Vermerk ,,Kinder``.
Referenzen eines Objektes:
Die Liste verweist auf ein CLS-Objekt mit dem internen Vermerk ,,Referenzen``.
Rückreferenzen eines Objektes:
Die Liste verweist auf ein CLS-Objekt mit dem internen Vermerk ,,Rückreferenzen``.

Um die Realen Listen eines CLS-Objektes zu verändern, muß das Objekt selbst angesprochen werden.


next up previous contents
Next: 4.2.4 Operationen auf Listen Up: 4.2 CLS-Unterprogrammbibliothek Previous: 4.2.2 Objektstruktur

Martin Knaipp
Wed Jun 12 15:41:33 MET DST 1996