📄 jclhashsets.pas
字号:
var
It: IJclStrIterator;
begin
Result := False;
if ACollection = nil then
Exit;
It := ACollection.First;
while It.HasNext do
Result := Add(It.Next) or Result;
end;
procedure TJclStrHashSet.Clear;
begin
FMap.Clear;
end;
function TJclStrHashSet.Clone: TObject;
var
NewSet: TJclStrHashSet;
begin
NewSet := TJclStrHashSet.Create;
NewSet.FMap := TJclStrHashMap(IJclCloneable(FMap).Clone);
Result := NewSet;
end;
function TJclStrHashSet.Contains(const AString: string): Boolean;
begin
Result := FMap.ContainsKey(AString);
end;
function TJclStrHashSet.ContainsAll(ACollection: IJclStrCollection): Boolean;
var
It: IJclStrIterator;
begin
Result := True;
if ACollection = nil then
Exit;
It := ACollection.First;
while Result and It.HasNext do
Result := Contains(It.Next);
end;
function TJclStrHashSet.Equals(ACollection: IJclStrCollection): Boolean;
var
It: IJclStrIterator;
ItMap: IJclStrIterator;
begin
Result := False;
if ACollection = nil then
Exit;
if FMap.Size <> ACollection.Size then
Exit;
It := ACollection.First;
ItMap := FMap.KeySet.First;
while ItMap.HasNext do
if ItMap.Next <> It.Next then
Exit;
Result := True;
end;
function TJclStrHashSet.First: IJclStrIterator;
begin
Result := FMap.KeySet.First;
end;
procedure TJclStrHashSet.Intersect(ACollection: IJclStrCollection);
begin
RetainAll(ACollection);
end;
function TJclStrHashSet.IsEmpty: Boolean;
begin
Result := FMap.IsEmpty;
end;
function TJclStrHashSet.Last: IJclStrIterator;
begin
Result := FMap.KeySet.Last;
end;
function TJclStrHashSet.Remove(const AString: string): Boolean;
begin
Result := FMap.Remove(AString) = RefUnique;
end;
function TJclStrHashSet.RemoveAll(ACollection: IJclStrCollection): Boolean;
var
It: IJclStrIterator;
begin
Result := True;
if ACollection = nil then
Exit;
It := ACollection.First;
while It.HasNext do
Result := Remove(It.Next) and Result;
end;
function TJclStrHashSet.RetainAll(ACollection: IJclStrCollection): Boolean;
var
It: IJclStrIterator;
begin
Result := False;
if ACollection = nil then
Exit;
It := ACollection.First;
while It.HasNext do
if not FMap.ContainsKey(It.Next) then
FMap.Remove(It.Next);
end;
function TJclStrHashSet.Size: Integer;
begin
Result := FMap.Size;
end;
procedure TJclStrHashSet.Subtract(ACollection: IJclStrCollection);
begin
RemoveAll(ACollection);
end;
procedure TJclStrHashSet.Union(ACollection: IJclStrCollection);
begin
AddAll(ACollection);
end;
//=== { TJclHashSet } ========================================================
constructor TJclHashSet.Create(ACapacity: Integer = DefaultContainerCapacity;
AOwnsObject: Boolean = False);
begin
inherited Create;
FMap := TJclHashMap.Create(ACapacity, AOwnsObject);
end;
destructor TJclHashSet.Destroy;
begin
Clear;
// (rom) no Free of FMap?
inherited Destroy;
end;
function TJclHashSet.Add(AObject: TObject): Boolean;
begin
Result := not FMap.ContainsKey(AObject);
if Result then
FMap.PutValue(AObject, RefUnique);
end;
function TJclHashSet.AddAll(ACollection: IJclCollection): Boolean;
var
It: IJclIterator;
begin
Result := False;
if ACollection = nil then
Exit;
It := ACollection.First;
while It.HasNext do
Result := Add(It.Next) or Result;
end;
procedure TJclHashSet.Clear;
begin
FMap.Clear;
end;
function TJclHashSet.Clone: TObject;
var
NewSet: TJclHashSet;
begin
NewSet := TJclHashSet.Create;
NewSet.FMap := TJclHashMap(IJclCloneable(FMap).Clone);
Result := NewSet;
end;
function TJclHashSet.Contains(AObject: TObject): Boolean;
begin
Result := FMap.ContainsKey(AObject);
end;
function TJclHashSet.ContainsAll(ACollection: IJclCollection): Boolean;
var
It: IJclIterator;
begin
Result := True;
if ACollection = nil then
Exit;
It := ACollection.First;
while Result and It.HasNext do
Result := Contains(It.Next);
end;
function TJclHashSet.Equals(ACollection: IJclCollection): Boolean;
var
It: IJclIterator;
ItMap: IJclIterator;
begin
Result := False;
if ACollection = nil then
Exit;
if FMap.Size <> ACollection.Size then
Exit;
It := ACollection.First;
ItMap := FMap.Values.First;
while ItMap.HasNext do
if ItMap.Next <> It.Next then
Exit;
Result := True;
end;
function TJclHashSet.First: IJclIterator;
begin
Result := FMap.KeySet.First;
end;
procedure TJclHashSet.Intersect(ACollection: IJclCollection);
begin
RetainAll(ACollection);
end;
function TJclHashSet.IsEmpty: Boolean;
begin
Result := FMap.IsEmpty;
end;
function TJclHashSet.Last: IJclIterator;
begin
Result := FMap.KeySet.Last;
end;
function TJclHashSet.Remove(AObject: TObject): Boolean;
begin
Result := FMap.Remove(AObject) = RefUnique;
end;
function TJclHashSet.RemoveAll(ACollection: IJclCollection): Boolean;
var
It: IJclIterator;
begin
Result := True;
if ACollection = nil then
Exit;
It := ACollection.First;
while It.HasNext do
Result := Remove(It.Next) and Result;
end;
function TJclHashSet.RetainAll(ACollection: IJclCollection): Boolean;
var
ItMap: IJclIterator;
begin
Result := False;
if ACollection = nil then
Exit;
ItMap := FMap.Values.First;
while ItMap.HasNext do
if not ACollection.Contains(ItMap.Next) then
ItMap.Remove;
end;
function TJclHashSet.Size: Integer;
begin
Result := FMap.Size;
end;
procedure TJclHashSet.Subtract(ACollection: IJclCollection);
begin
RemoveAll(ACollection);
end;
procedure TJclHashSet.Union(ACollection: IJclCollection);
begin
AddAll(ACollection);
end;
// History:
// $Log: JclHashSets.pas,v $
// Revision 1.7 2005/03/03 08:02:57 marquardt
// various style cleanings, bugfixes and improvements
//
// Revision 1.6 2005/03/02 17:51:24 rrossmair
// - removed DCLAppendDelimited from JclAlgorithms, changed uses clauses accordingly
//
// Revision 1.5 2005/03/02 09:59:30 dade2004
// Added
// -TJclStrCollection in JclContainerIntf
// Every common methods for IJclStrCollection are implemented here
//
// -Every class that implement IJclStrCollection now derive from TJclStrCollection instead of TJclAbstractContainer
// -Every abstract method in TJclStrCollection has been marked as "override" in descendent classes
//
// DCLAppendDelimited has been removed from JclAlgorothms, his body has been fixed for a bug and put into
// relative method in TJclStrCollection
//
// Revision 1.4 2005/02/27 11:36:20 marquardt
// fixed and secured Capacity/Grow mechanism, raise exceptions with efficient CreateResRec
//
// Revision 1.3 2005/02/27 07:27:47 marquardt
// changed interface names from I to IJcl, moved resourcestrings to JclResource.pas
//
// Revision 1.2 2005/02/24 07:36:24 marquardt
// resolved the compiler warnings, style cleanup, removed code from JclContainerIntf.pas
//
// Revision 1.1 2005/02/24 03:57:10 rrossmair
// - donated DCL code, initial check-in
//
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -