<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2016-01-27 21:01 GMT+01:00 Anthony Walter <span dir="ltr"><<a href="mailto:sysrpl@gmail.com" target="_blank">sysrpl@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><span></span>I've just like to point out that with Svens new support for generic functions, we actually have template like functionality in Free Pascal. You can now write functions which will verify at compile time the support of a method or operator for a particular type. This somewhat obviates the need to register or pass compare or equal functions or interfaces.<div><br></div></div></div></blockquote><div><br><div></div>You don't need to pass any compare nor equal functions in the Generics.Collections.<br></div><div>Mentioned in your post kind of usage of operators was possible long before "new generic functions":<br><br></div><div>class procedure TGArray<T>.Sort(var Items: TArray<T>);<br></div><div>{ ... identical code here ...}<br></div><div></div><br><div>In previous version of Generics.Collections library was possible to use two kinds of all collections (one kind with operators and one kind with manual interfaces) for example : TFastList (with operators verified at compile time) and TList (more Delphi compatible with manual interfaces). Approach with operators is weak in many points:<br><br></div><div>* is not much faster than manual interfaces (it is even slower in many cases (!), that was shock for me)<br></div><div>* low level of encapsulation<br></div><div>* lack of support for more advanced collections (for example with usage of cuckoo hashing)<br></div><div>* you need to define operators for all non trivial types (and that is not always possible in simple way, for example: external library)<br></div><div>* Delphi/C# incompatible way of handling collections<br></div><div>* is harder for customization (case sensitive/insensitive)<br></div><div>* MOST IMPORTANT: it is only friendly for author of those collections, for daily user it is hell - especially for advanced collections like "dictionary/hashmap"<br></div><div><br></div><div>fpc-stl is implemented with usage of operators. look below (just declaration example, problems with usage of operators grows exponentially :).<br><br>Example code for <span class="">Generics</span>.<span class="">Collections</span>:<br><br>=== code begin ===<br><div>type<br></div><div>  TRec = record<br></div><div>    ID1, ID2: Int64;<br></div><div>  end;<br></div><div>var<br></div><div>  d1: THashMap<TRec, TSome1>;<br></div><div>  d2: THashMap<string, TSome2>;<br></div><div>  d3: THashMap<Int64, TSome3>;<br>=== code end ===<br><br></div><div>fpc-stl equivalent:<br></div><div><br></div><div>=== <span id="result_box" class="" lang="en"><span class="">reduced</span> (!) <span class="">code example</span></span> begin ===<br><div>type<br></div><div>  TRec = record<br></div><div>    ID1, ID2: Int64;<br>    class operator Equal(a: TRec; b: TRec) : Boolean;<br></div>  end;<br><br></div><div> class operator TRec.Equal(a: TRec; b: TRec) : Boolean;<br></div><div>begin<br></div><div>  Result := (a.ID1 = b.ID1) and (a.ID2 = b.ID2);<br></div><div>end;<br></div><div><br></div><div>type<br>  THash_TRec = record<br>    class function Hash(A: TObject; B: SizeUInt): SizeUInt; static;<br>  end;<br><br>  THash_String = record<br>    class function Hash(A: string; B: SizeUInt): SizeUInt; static;<br>  end;<br><br>  THash_Int64 = record<br>    class function Hash(A: Int64; B: SizeUInt): SizeUInt; static;<br>  end;<br><br>class function THash_TRec.Hash(A: TObject; B: SizeUInt): SizeUInt;<br>begin<br>   { <br><div>   some hash function for TRec... you need to provide<br>   }<br></div>end; <br><br>class function THash_String.Hash(A: TObject; B: SizeUInt): SizeUInt;<br>begin<br>   { <br></div><div>   some hash function for string ... you need to provide<br>   }<br></div><div>end; <br><br>class function THash_Int64.Hash(A: TObject; B: SizeUInt): SizeUInt;<br>begin<br>   { <br>   some hash function for Int64 ... you need to provide<br>   }<br>end; <br><br></div>d1: THashmap<TRec, TSome1, THash_TRec>;  <br>d2: THashmap<string, TSome2, THash_String>;  <br>d2: THashmap<Int64, TSome3, THash_Int64>; <br>=== code end === <br></div><div><br></div><div> -- <br></div></div><div><div dir="ltr"><div>Best regards,<br>Maciej Izak</div></div></div>
</div></div>