Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-announce / 2018-03

ANN: Generics.Collections 2.0

1 message · 1 person ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Maciej Izak

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

Reply by email