Mir ist bewusst dass der Fragende sich hier auf D7 bezog. Dennoch:
Nennt mich Ketzer aber ich löse das bei neueren Delphis inzwischen in etwa so (aus dem Gedächtnis, da kein Delphi zur Hand, deshalb als Pseudocode betrachten)
Delphi-Quellcode:
type
PBigSetOf = ^TBigSetOf; // Ich arbeite meist mit Zeigern um Speicherkuddelmuddel zu vermeiden
TBigSetOf = record
FElements: TArray<word>;
class operator implicit(A: TBigSetOf): TArray<word>;
class operator implicit(A: TArray<word>): TBigSetOf;
class operator in(A: Word, B: TBigSetOf): Boolean;
end;
implementation
const
// Für die Erzeugung der Konstanten habe ich mir ein kleines Tool geschrieben
m0 = 0;
{...}
m1024 = 1024;
class operator implicit(A: TBigSetOf): TArray<word>;
begin
Self.FElements := A.FElements:
Result := Self.FElements;
end;
class operator implicit(A: TArray<word>): TBigSetOf;
var
LElement: Word;
begin
for LElement in A do begin
if not LElement in Self then begin
Self.FElements := Self.FElements + [LElement];
end else begin
raise // Irgendwas wegen nicht eindeutig
// deswegen auch der Umweg über einen Record
// anstatt einfach nur ein array of Word zu benutzen
end;
end;
Result := Self;
end;
class operator in(A: Word, B: TBigSetOf): Boolean;
var
LElement: Word;
begin
Result := False;
for LElement in B.FElements do begin
if LElement = A then begin
Result := True;
Break;
end;
end;
end;
procedure Test;
var
LBigSetOf: TBigSetOf;
begin
LBigSetOf := [m0, m128, m256, m512, m1024];
if m96 in LBigSetOf then begin
// Nein
end else if m512 in LBigSetOf then begin
// Ja
end;
end;
Die Performance kommt mit Sicherheit nicht an set of heran, kommt daher auf den Einzelfall an. In meinem Fall sind die implicit-Operatoren deutlich umfangreicher, weshalb die Prüfung auf Eindeutigkeit wichtig ist.