<div dir="ltr"><br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">






<p></p>
<p>I don't see a reason to use hacks for such code.</p></blockquote><div>It is hard to explain. You will see it soon in all its glory ;). It's very important construction (I use this construction very often - generics, serialization, script languages binding...). A short introduction:</div>

<div><br></div><div><span style="font-family:arial,sans-serif">===begin code===</span><br></div><div>// I need universal non generic method to compare arrays without knowledge of its TypeInfo...</div><div><div>class function TEquals.DynArray(constref ALeft, ARight: Pointer): Boolean;</div>

<div>var</div><div>  _self: TAbstractHashCode.PSpoofInterfacedTypeSizeObject absolute Self; // few more tricks...</div><div>  LLength: Integer;</div><div>begin</div><div>  LLength := DynArraySize(ALeft);</div><div>  if LLength <> DynArraySize(ARight) then</div>

<div>    Exit(False);</div><div><br></div><div>  Result := CompareMem(ALeft, ARight, LLength * _self.Size);</div><div>end;</div></div><div>===end code===<br></div><div><br></div>
<div>you wrote earlier in my other topic:<br>
</div><div></div><div> </div><div><span style="font-family:arial,sans-serif;font-size:13px">"</span><span style="font-family:arial,sans-serif;font-size:13px">You can't do things as equality tests in a general way anyway (best example: case sensitive vs. case insensitive comparison of strings)."</span></div>



<div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><font face="arial, sans-serif">So... I just finished writing something theoretically impossible to write O_o. Now I do</font><span style="font-size:13px;font-family:arial,sans-serif"> equality tests in a general way (</span><font face="arial, sans-serif">partially because the construction like in Foo)</font><font face="arial, sans-serif">.</font></div>



<div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">To get:</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">===begin code===</font></div>

<div>

<font face="arial, sans-serif"> </font>  IEqualityComparer<T> = interface</div><div>    function Equals(constref ALeft, ARight: T): Boolean;</div><div>    function GetHashCode(constref AValue: T): UInt32; overload;</div>



<div>    function GetHashCode(constref AValue: T; out APrimaryHash: UInt32): UInt32; overload; // for double hashing</div><div>  end;</div><div>===end code===</div><div><br></div><div>for any type (seriously any type supported by FPC except file type - Error: File types must be var parameters), just call TEqualityComparer<T>.Default:</div>



<div><br></div><div><font face="arial, sans-serif">===begin code===</font></div><div>var</div><div>  ec_array: IEqualityComparer<TIntegerDynArray>;</div><div>  ec_string: IEqualityComparer<string>; </div><div>

begin</div><div>  ec_array := TEqualityComparer<TIntegerDynArray>.Default;</div><div>  ec_array := TEqualityComparer<TIntegerDynArray>.Default(TOptionalNonDefaultHashFactory);</div><div><br></div><div>  // case insensitive comparer</div>

<div>  ec_string := TEqualityComparer<string>.Construct(MyNonCaseSensitiveComparerMethod);</div><div>  // or soon with anonymous methods</div><div>  ec_string := TEqualityComparer<string>.Construct(</div><div>

      function(constref ALeft, ARight: string): Integer);</div><div>      begin</div><div>        Result := SameText(ALeft, ARight);<br></div><div>      end, TOptionalNonDefaultHashFactory);</div><div><div>===end code===</div>

</div><div><br></div><div>At this moment you can use dictionary (with any custom IEqualityComparer) in FPC with any type (used type don't need to implement any additional operators):</div><div><br></div><div><span style="font-family:arial,sans-serif">===begin code===</span><br>
</div><div>var</div><div>  dr: TDictionary<TMyRecord, string>;</div><div>  dp: TDictionary<PAnyPointer, Variant>;</div>
<div>  dcr: TDictionary<TClass, TArrayOfObjects>;</div><div>  da: TDictionary<TIntegerDynArray, Single>;<br></div><div>  dCaseInsensitive: TDictionary<string, TObject>; </div><div>  dCaseSensitive: TDictionary<string, TObject>; </div>
<div>  {... and so on...}<br></div><div><div>  dCaseInsensitive := TDictionary<string, TObject>(StringC<span style="font-family:arial,sans-serif;font-size:13px">aseInsensitiveEqualityComparer)</span>;</div></div><div>
  dCaseSensitive := TDictionary<string, TObject>.Create; // default case sensitive</div><div>===end code===</div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">If you need to use default freepascal operators for comparisons there is also </font>TFastDictionary - for some optimizations.</div>
<div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">Btw. I proposed the creation of the new system functions: </font>GetReferenceToValue and GetValueSize (I think it's still a good idea). This would simplify some things...</div>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">




<p>I wonder why this combination compiles at all O.o</p></blockquote><div> comfortable for my tricks ^_^</div><div><br></div><div>Regards,</div><div>HNB</div></div></div></div>