Die Implementationen Die Operationen der ADT TUPLE (tupl)

UNION (unio)

Domainchg(Domain x1,Component-x x2)

PRECONDITION für chg_u1: is_u1(x1) = TRUE

Überschreiben des Inhalts der Union x1 durch den Wert x2, der vom gleichen Typ sein muß

Nomenklatur Der Name wird erweitert; wenn angegeben, mit dem Namen der Komponente OHNE das führende s_ , sonst mit dem Namen des jeweiligen Elementtyps.

Das überschriebene Objekt wird NICHT implizit gelöscht

x1 wird zerstört (im Gegensatz zu subst)

funccswitch()

Funktional (ähnlich wie sswitch)

Erzeugt ,,Switch-Funktionen``, die der switch-Klausel in C gleichen (wie bei discr zu sehen). Beim Aufruf wird der aktuelle Typ der Union bestimmt und abhängig davon eine Bearbeitungs-Funktion (die Sie an anderer Stelle definieren) aufgerufen.

Die Namen der Bearbeitungs-Funktionen ergeben sich aus dem Namen der ,,Switch-Funktion`` durch Erweiterung mit dem Namen des Elementtyps (im Unterschied zu sswitch).

Parameter: Result gibt den Datentyp des Resultats der erzeugten Funktion an (Default: void)

XX,XXX,XXXX,... sind Datentypen von optionalen zusätzlichen Argumenten dieser Funktion

Die genaue Spezifikation können Sie mit vdminfo ermitteln.

Beispiel:

DOMAINS
* Uni = s_u1 : Nat0 | s_u2 : Str
* Xyz = ...
* IMPLEMENTATIONS
* Uni = ...+ cswitch.case(Result=,,Intg``, XX=,,Xyz``)
* erzeugt die Switch-Funktion
* case_uni(x1,x2) =
* (is_u1(x1) tex2html_wrap_inline6506 case_nat0(s_u1(x1),x2)
* is_u2(x1) tex2html_wrap_inline6506 case_str(s_u2(x1),x2)
* )
*[0.5ex] TYPE: UniXyZ tex2html_wrap_inline6488 Intg
*[0.5ex] Die Bearbeitungs-Funktionen haben folgende TYPE-Klauseln:
* TYPE case_nat0 : Nat0XyZ tex2html_wrap_inline6488 Intg
* TYPE case_str : StrXyZ tex2html_wrap_inline6488 Intg
*

Discriminant-Domaindiscr(Domain x1)

#enum Discriminant-Domain {d_xxx,d_yyy,...}

Erzeugt ein mit der switch-Klausel in C abfragbares Flag, das anzeigt, welchen Datentyp die Union x1 hat

Die Namen der Flags entsprechen den Namen der Komponenten, das führende ,,s_`` wird durch ,,d_`` ersetzt.

Beispiel: Uni = s_u1 : E1 | s_u2 : E2

Uni u;
* tex2html_wrap_inline6814
* switch(discr_uni(u)) {
* case d_u1: ...; break;
* case d_u2: ...; break;
* }
*

Boolis(Domain x1)

Test, welcher Datentyp aktuell ist; der Aufruf der ,,richtigen`` Operation ergibt TRUE, jeder andere ergibt FALSE.

Nomenklatur Der Name wird erweitert; wenn angegeben, mit dem Namen der Komponente OHNE das führende s_ , sonst mit dem Namen des jeweiligen Elementtyps.

Boolis_ge(Domain x1,Domain x2)

Test, ob x1 tex2html_wrap_inline8519 x2 ist

Boolis_gr(Domain x1,Domain x2)

Test, ob x1 > x2 ist

Domainmk(Component-x x1)

Erzeugt eine Union aus dem Objekt x1

Nomenklatur Der Name wird erweitert; wenn angegeben, mit dem Namen der Komponente OHNE das führende s_ , sonst mit dem Namen des jeweiligen Elementtyps.

Domainovwrt(Domain x1,Component-x x2

Ersetzen des aktuellen Inhalts von x1 durch x2 -- dabei kann auch der Typ von x1 verändert werden

Nomenklatur Der Name wird erweitert; wenn angegeben, mit dem Namen der Komponente OHNE das führende s_ , sonst mit dem Namen des jeweiligen Elementtyps.

x1 wird zerstört

Component-xs(Domain x1)

PRECONDITION für s_u1: is_u1(x1) = TRUE

Der Inhalt der Union wird als Objekt vom gewünschten Komponententyp geliefert, wenn die Union gerade diesen Typ hat

Nomenklatur Der Name wird erweitert; wenn angegeben, mit dem Namen der Komponente OHNE das führende s_ , sonst mit dem Namen des jeweiligen Elementtyps. Der Operationsname entspricht damit dem Namen der Komponente, wenn dieser angegeben ist!

funcsswitch()

Funktional (ähnlich wie cswitch)

Erzeugt ,,Switch-Funktionen``, die der switch-Klausel in C gleichen (wie bei discr schon gesehen). Beim Aufruf wird der aktuelle Typ der Union bestimmt und abhängig davon eine Bearbeitungs-Funktion (die Sie an anderer Stelle definieren) aufgerufen.

Die Namen der Bearbeitungs-Funktionen ergeben sich aus dem Namen der ,,Switch-Funktion`` durch Erweiterung mit dem Komponentennamen OHNE führendes ,,s_`` (im Unterschied zu cswitch).

Die genaue Spezifikation können Sie mit vdminfo ermitteln.

Parameter: Result gibt den Datentyp des Resultats der erzeugten Funktion an (Default: void)

XX,XXX,XXXX,... sind Datentypen von optionalen zusätzlichen Argumenten dieser Funktion

Beispiel:

DOMAINS
* Uni = s_u1 : Nat0 | s_u2 : Str
* IMPLEMENTATIONS
* Uni = ...+ cswitch.case()
*[0.5ex] erzeugt die Switch-Funktion
* case_uni(x1) =
* (is_u1(x1) tex2html_wrap_inline6506 case_u1(s_u1(x1))
* is_u2(x1) tex2html_wrap_inline6506 case_u2(s_u2(x1))
* )
*[0.5ex] TYPE: Uni tex2html_wrap_inline6488
*[0.5ex] Die Bearbeitungs-Funktionen haben folgende TYPE-Klauseln:
* TYPE case_u1 : Nat0 tex2html_wrap_inline6488
* TYPE case_u2 : Str tex2html_wrap_inline6488
*

Domainsubst(Domain x1,Component-x x2)

PRECONDITION für subst_u1: is_u1(x1) = TRUE

Überschreiben des Inhalts der Union x1 durch den Wert x2, der vom gleichen Typ sein muß, nachdem x1 kopiert wurde (der alte Inhalt bleibt erhalten)

Nomenklatur Der Name wird erweitert; wenn angegeben, mit dem Namen der Komponente OHNE das führende s_ , sonst mit dem Namen des jeweiligen Elementtyps.

Die Implementationen Die Operationen der ADT TUPLE (tupl)

VDM Class Library