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) case_nat0(s_u1(x1),x2)
*
is_u2(x1) case_str(s_u2(x1),x2)
*
)
*[0.5ex]
TYPE: UniXyZ Intg
*[0.5ex]
Die Bearbeitungs-Funktionen haben folgende TYPE-Klauseln:
*
TYPE case_nat0 : Nat0XyZ Intg
*
TYPE case_str : StrXyZ 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;
*
*
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 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) case_u1(s_u1(x1))
*
is_u2(x1) case_u2(s_u2(x1))
*
)
*[0.5ex]
TYPE: Uni
*[0.5ex]
Die Bearbeitungs-Funktionen haben folgende TYPE-Klauseln:
*
TYPE case_u1 : Nat0
*
TYPE case_u2 : Str
*
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.
VDM Class Library