Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.046 Beiträge
Delphi 12 Athens
|
AW: TEdit + Steuerzeichen + XML = Exception
7. Jul 2025, 15:27
Na gut, es würde alles noch ein bisschen schneller gehen, wenn man bis zum Maximum optimiert:
Ginge das hier auch???
Ab wann wäre es sinnvoll?
Delphi-Quellcode:
Function BL_GE(const x,y:Integer):Integer;Inline;
Begin
Result := (x - y + 1) div (abs(x - y) + 1);
End;
Function BL_LE(const x,y:Integer):Integer;Inline;
Begin
Result := BL_GE(y,x);
End;
Function BL_E(const x,y:Integer):Integer;Inline;
Begin
Result := BL_GE(x, y) * BL_LE(x, y);
End;
Function BL_NE(const x,y:Integer):Integer;Inline;
Begin
Result := 1 - BL_E(x,y);
End;
Function BL_L(const x,y:Integer):Integer;Inline;
Begin
Result := 1 - BL_GE(x, y); // ODER BL_LE(x, y) - BL_E(x, y)
End;
Function BL_G(const x,y:Integer):Integer;Inline;
Begin
Result := 1 - BL_LE(x, y); // ODER BL_GE(x, y) - BL_E(x, y)
End;
function SanitizeXML_Branchless(const AValue: String): String;
var
Src, SrcEnd, Dest: PChar;
Len, Keep: Integer;
Ch: Integer;
begin
Len := Length(AValue);
SetLength(Result, Len);
Src := PChar(AValue);
Dest := PChar(Result);
SrcEnd := Src + Len;
while Src < SrcEnd do
begin
Ch := Ord(Src^);
// Prüfen, ob das Zeichen in einem der gültigen Bereiche liegt.
// Das Ergebnis ist 1 für gültige Zeichen, sonst 0.
Keep := BL_E(Ch, 9) or // #9
BL_E(Ch, 10) or // #10
BL_E(Ch, 13) or // #13
(BL_GE(Ch, 32) and BL_LE(Ch, $D7FF)) or // #32..#$D7FF
(BL_GE(Ch, $E000) and BL_LE(Ch, $FFFD)); // #$E000..#$FFFD
// Den Pointer nur dann erhöhen, wenn das Zeichen behalten wird.
// Anstatt einer bedingten Anweisung (if Keep = 1) wird der Pointer
// um den Wert von 'Keep' verschoben (entweder um 1 oder 0).
Dest^ := Src^;
Dest := Dest + Keep;
Inc(Src);
end;
SetLength(Result, Dest - PChar(Result));
end;
Andreas Nobody goes there anymore. It's too crowded!
Geändert von QuickAndDirty ( 7. Jul 2025 um 15:33 Uhr)
|
|
Zitat
|