{$mode objfpc}{$H+}
uses
types,
generics.collections;
type
PStringset = ^TStringset;
TStringSet = specialize THashSet<string>;
// symetric difference
operator ><(const a,b:TStringSet):TStringSet;
begin
Result := a;
Result.SymmetricExceptWith(b);
end;
// difference
operator -(const a,b:TStringSet):TStringSet;
begin
Result := a;
a.ExceptWith(b);
end;
// Union
operator +(const a,b:TStringSet):TStringSet;
begin
a.UnionWith(b);
Result := a;
end;
// Intersection
operator * (const a,b:TStringSet):TStringSet;
begin
a.IntersectWith(b);
Result := a;
end;
// in
operator in(const a:string;const b:TStringSet):Boolean;
begin
result := b.Contains(a);
end;
// operator contains
operator <=(constref a, b:TStringSet):Boolean;
var
s:string;
begin
Result := False;
for s in b do
begin
result := a.Contains(s);
if Result = False then break;
end;
end;
procedure include(const a,b:TStringSet);
begin
a.AddRange(b);
end;
procedure Exclude(const a:TStringSet;const b:string);
begin
a.Remove(b);
end;
procedure Include(const a:TStringSet;const b:string);
begin
a.Add(b);
end;
Type
testset = (test, me,too); // for comparison with standard pascal set.
var
a,b:TStringset;
sa:array of string = ('test','me','too');
sb:array of string = ('test');
s:string;
sas:set of testset = [test,me,too];
sbs:set of testset =[test];
scs:testset;
begin
writeln(HInstance);
a := TStringset.create;
a.addrange(sa);
b := TStringset.Create;
b.addrange(sb);
a:= a >< b;
for s in a do writeln(s);writeln('------');
b.free;
a.free;
for scs in (sas><sbs) do writeln(scs);
readln;
end.