CXI-Basis-Programmierreferenz / Version 2 / Datenspeicherung / CxiTree / Zusatzfunktionen /
CxiError CxiTree :: MergeTo (CxiTree& trgcxi, CxiLong options = 0) const
CxiError CxiTree :: MergeFrom (const CxiTree& srccxi, CxiLong options = 0)
CxiError cxiMerge (CxiHandle trgcxi, CxiHandle srccxi, CxiLong options)
Mischt Variablen zweier CXI-Bäume
trgcxi:
CXI-Baum, der die Variablen aufnehmen soll
srccxi:
CXI-Baum, der die zu mischenden Variablen enthält
options:
VERHALTEN, WENN ZIELVARIABLE SCHON EXISTIERT:
cxiOptMergeAdd (=0, Vorgabe): Zielvariable unverändert lassen
cxiOptMergeReplace: Zielvariablen außer cxiTypeSub ersetzen
cxiOptMergeForce: Zielvariable in jedem Fall ersetzen
BEARBEITUNG VON UNTERBÄUMEN:
cxiOptMergeSubTree (=0, Vorgabe): Unterbäume rekursiv bearbeiten
cxiOptMergeNoSubTree: Unterbäume nicht bearbeiten
return:
0 ok, sonst Fehler
Diese Funktion kopiert in einer Schleife alle Variablen des Quellblocks (srccxi) in den Zielblock (trgcxi), wobei die angegebenen Optionen berücksichtigt werden. Zum Kopieren einer Variablen wird jeweils CopyVar aufgerufen.
Der Quell- und Zielblock dürfen nicht identisch sein. Der Zielbaum darf kein direkter oder indirekter Unterbaum der Quelle sein.
Achtung! Die Option cxiOptMergeForce ersetzt auch Variablen vom Typ cxiTypeSub, so dass Unterbäume immer komplett ersetzt werden; es erfolgt in diesem Fall kein rekursiver Abgleich.
Die beiden Member-Funktionen benutzen den CXI-Baum, zu dem sie gehören, als Quelle (MergeTo) bzw. Ziel (MergeFrom).
Der Operator += entspricht einem Aufruf von MergeFrom mit den Optionen cxiOptMergeReplace und cxiOptMergeSubTree.
Um ausgewählte Variablen zu kopieren, kann MergeWild... verwendet werden.
Portabilität:
Diese Funktion ist in allen unterstützten Systemen verfügbar.
Siehe auch:
MergeWild...
CopyVar...
CopySubTree...
operator +=
Beispiel:
#include <stdio.h>
#include "cxib.h"
int main (void)
{
// Beispielbäume aufbauen
CxiTreeMem c = "VAR1=1;VAR2='Text';"
"VAR3={UNTER=19;VARY=Y;}VAR4={UNTER=92;}";
CxiTreeMem b = "VAR7=1;VAR2='noch ein Text';"
"VAR3={UNTER=17;VARX=X;}VAR4=9;";
CxiTreeMem a;
// Dump-Datei ist "testcopy.dmp"
unlink ("testcopy.dmp");
// Originalzustand ausgeben
c.DumpVars ("testcopy.dmp", "<Original>", 1);
b.DumpVars ("testcopy.dmp", "<Quellbaum>", 1);
// Test mit verschiedenen Optionen
a = c; // CxiTree::operator =
a.MergeFrom (b); // Default ist options==0
a.DumpVars ("testcopy.dmp", "0", 1);
a = c;
a.MergeFrom (b, cxiOptMergeReplace); // oder: a += b;
a.DumpVars ("testcopy.dmp", "cxiOptMergeReplace", 1);
a = c;
a.MergeFrom (b, cxiOptMergeReplace | cxiOptMergeNoSubTree);
a.DumpVars ("testcopy.dmp",
"cxiOptMergeReplace|cxiOptMergeNoSubTree", 1);
a = c;
a.MergeFrom (b, cxiOptMergeForce);
a.DumpVars ("testcopy.dmp", "cxiOptMergeForce", 1);
return 0;
}
Inhalt der Datei "testcopy.dmp":
***[1] 1995-10-28 19:58:33.560 *** <Original>
<*Window*> <Root> \
VAR1 Num 1
VAR2 Str "Text"
VAR3 Sub
VAR4 Sub
<Node> \VAR3
UNTER Num 19
VARY Str "Y"
<Node> \VAR4
UNTER Num 92
***[2] 1995-10-28 19:58:33.590 *** <Quellbaum>
<*Window*> <Root> \
VAR7 Num 1
VAR2 Str "noch ein Text"
VAR3 Sub
VAR4 Num 9
<Node> \VAR3
UNTER Num 17
VARX Str "X"
***[3] 1995-10-28 19:58:33.590 *** 0
<*Window*> <Root> \
VAR1 Num 1
VAR2 Str "Text"
VAR3 Sub
VAR4 Sub
VAR7 Num 1
<Node> \VAR3
UNTER Num 19
VARY Str "Y"
VARX Str "X"
<Node> \VAR4
UNTER Num 92
***[4] 1995-10-28 19:58:33.590 *** cxiOptMergeReplace
<*Window*> <Root> \
VAR1 Num 1
VAR3 Sub
VAR4 Sub
VAR7 Num 1
VAR2 Str "noch ein Text"
<Node> \VAR3
VARY Str "Y"
UNTER Num 17
VARX Str "X"
<Node> \VAR4
UNTER Num 92
***[5] 1995-10-28 19:58:33.620 *** cxiOptMergeReplace|cxiOptMergeNoSubTree
<*Window*> <Root> \
VAR1 Num 1
VAR3 Sub
VAR4 Sub
VAR7 Num 1
VAR2 Str "noch ein Text"
<Node> \VAR3
UNTER Num 19
VARY Str "Y"
<Node> \VAR4
UNTER Num 92
***[6] 1995-10-28 19:58:33.620 *** cxiOptMergeForce
<*Window*> <Root> \
VAR1 Num 1
VAR7 Num 1
VAR2 Str "noch ein Text"
VAR3 Sub
VAR4 Num 9
<Node> \VAR3
UNTER Num 17
VARX Str "X"
Das genaue Format der Dump-Ausgabe ist versionsabhängig und kann daher von diesem Beispiel abweichen.