Discussion:
[fpc-announce] ANN: Generics.Collections 2.0
Maciej Izak
2018-03-09 00:01:56 UTC
Permalink
I'm pleased to finally announce next release of rtl-generics aka
Generics.Collections 2.0

version for trunk available in trunk ;)
version for 3.0.4 available at :
https://github.com/maciej-izak/generics.collections

What is new:
* New collections:
- TSortedList<T>
- THashSet<T>
- TAVLTreeMap<TKey, TValue>
- TIndexedAVLTreeMap<TKey, TValue>
- TAVLTree<T>
- TIndexedAVLTree<T>
- TSortedSet<T>
- TSortedHashSet<T> (this one collection is especially interesting -
optimized mix of dictionary and AVL tree)
* New hash functions (the optimal hash function for collections is selected
depending on environment)
* Bug fixes
* Tests
* My favorite and related to my compiler stuff like management operators
(also related to all managed types) : new Ptr property for all collections.
How it works and what is the gain? Simple example:

====== code begin ======
type
TIntfObject = class(TInterfacedObject, IUnknown)
protected
function _AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
function _Release : longint;{$IFNDEF
WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
end;

function TIntfObject._AddRef: longint; stdcall;
begin
Writeln('_AddRef');
Result := inherited;
end;

function TIntfObject._Release: longint; stdcall;
begin
Result := inherited;
Writeln('_Release');
end;

procedure Test;
var
List: TList<IInterface>;
item: IInterface;
itemPtr: ^IInterface;
begin
WriteLn('--- initialization ---');
List := TList<IInterface>.Create;
List.Add(TIntfObject.Create);
List.Add(TIntfObject.Create);
List.Add(TIntfObject.Create);
WriteLn('--- ptr loop ---');
for itemPtr in List.Ptr^ do
{ something };
WriteLn('--- loop ---');
for item in List do
{ something };
WriteLn('--- finalization ---');
List.Free;
end;

begin
Test;
WriteLn('--- end ---');
end.
====== code end ======

Output:

--- initialization ---
_AddRef
_AddRef
_AddRef
--- ptr loop ---
--- loop ---
_AddRef
_AddRef
_Release
_AddRef
_Release
--- finalization ---
_Release
_Release
_Release
_Release
--- end ---

by usage pointer as enumerator was possible to omit all _AddRef & _Release
calls. The optimization is highly visible for extensive usage of managed
types.

Acknowledgment / credits:

Thanks to Sphere 10 Software (http://sphere10.com) for sponsoring many new
types and major refactoring of entire library

Thanks to mORMot (http://synopse.info) project for the best implementations
of hashing functions like crc32c and xxHash32 :)
--
Best regards,
Maciej Izak
Loading...