Sign in Join

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

Catalog · How the catalog works
Anything · Lazarus or Delphi
Random projectRandom project

Rapid.Generics.v2

View on GitHub

Member rating

No ratings yet.

Sign in to rate this project.

README

Rapid.Generics.v2

What is this?

This is a modified fork of Rapid.Generics with improvements and fixes.

Github repository: https://github.com/Alexandre-Atozed/Rapid.Generics.v2

Why v2?

The original library could not be used in a real application due to several issues:

  • It contained a few bugs
  • No unit tests
  • The author doesn't seem to maintain it

What is different in v2?

✅ Unit Tests

  • 700+ new unit tests added for TArray<>, TDictionary<>, TObjectDictionary<>, TList<>, TObjectList<>, TQueue<>, TObjectQueue<>, TStack<>, TObjectStack<> and THashSet<> classes
  • All tests run memory leak free. Tested with FastMM4 in FullDebugMode
  • Most tests can also use standard System.Generics.Collections data structures, just disabling a directive (undefine TEST_RAPIDGENERICS), making it easy to compare unexpected behavior (except SortDescending methods which have no counterpart in System.Generics.Collections)
  • New tests added to the performance test (benchmark) application

🔧 General Changes

  • {$DEFINE HAS_INLINE} allows enabling/disabling inline for easier debugging
  • Exception handling refactored using functions similar to Delphi 12 RTL with better error messages
  • Local variables renamed for clarity (e.g., distinguishing them from properties like Count)
  • Unused code removed
  • Warnings silenced (most via {$WARNINGS OFF} when the compiler cannot detect variable initialization inside a case statement)
  • Fixed AV during interface clean up (Creating dictionaries/lists with interfaces would cause AV when destroying)
  • Fixed destruction of objects owned by TObjectDictionary<>, TObjectList<>, TObjectStack<>, TObjectQueue<> when a descendant class overrides Notify() method
  • Fixed TObjectStack Pop method
  • Fixed many bugs when using records as keys in dictionaries
  • THashSet implementation for all supported compilers

📌 TArray Improvements

  • Implemented missing methods: IndexOf<T> and Contains<T>
  • Fixed TArray.Copy<T> for certain sizes of T
  • Fixed TArray.InternalSearch when the array is empty
  • New comprehensive unit test suite for TArray<>
  • Sorting:
    • Ascending (most common) sorting uses QuickSort and InsertionSort for small partitions (configured by INSERTION_SORT_THRESHOLD, default 16) for most data types
    • Use of InsertionSort for small partitions increase the performance around 30-40% for large data sets, and up to 500% for small data sets, compared to pure QuickSort
    • Descending sorting uses a pure QuickSort algorithm. Plans to also extend to use InsertionSort
    • New: Sorting uses Median of three pivot selection
    • QuickSort corner cases fixed, preventing infinite loops due to improper index bounds during pivot selection
    • Removed original RadixSort and Insertion routines (both failed basic unit tests).
    • Fixed SortDescending() methods
    • Fixed SetCapacity() (zero-initializing allocated memory)

📌 TDictionary<> Improvements

  • Implemented missing method: TryAdd

📌 TObjectDictionary<> Improvements

  • Fixed memory leaks when overriding KeyNotify()/ValueNotify() in descendant classes (doOwnsKeys or doOwnsValues)

📌 TList<> Improvements

  • Implemented missing methods: ExtractAt() and IsEmpty()
  • Fixed TList<>.InternalDelete method for managed types, which fixed memory leaks when adding records with managed types to lists
  • Sorting: See TArray sorting

📌 Compatibility

This has been tested with:

  • Delphi 10, 10.1, 10.2, 10.3, 10.4, 11, 12 and 13 (x86 and x64)
  • Not tested with any version of Lazarus/FPC yet
  • Other compiler versions will be tested in the near future

📌 Dependencies

  • No external dependencies
  • Unit test project requires DUnitX framework. (Included in 3rdParty folder)
  • Unit test memory leak check requires FastMM4 (also included in 3rdParty folder)

📌 How to Use

  1. Include Rapid.Generics.pas in your project.
  2. Replace System.Generics.Collections and System.Generics.Defaults with Rapid.Generics in your uses sections.

📌 TRapidDictionary/TRapidObjectDictionary

Rapid "inline" TDictionary / TObjectDictionary equivalents with default hash codes and comparers.

Code formatting

The Code is GExperts Code Formatter by GExperts.