<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2016-04-18 11:42 GMT+02: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-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra">Do the source and dest types need to match? </div></div></blockquote><div><br></div><div>Yes.</div><div> </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"><div dir="ltr"><div class="gmail_extra">How about:"CopyFrom"? As it is right now you already have type parity between types such as floats <- integer and string <- char, so why not between TBar <- TFoo?</div><div class="gmail_extra"><br></div><div class="gmail_extra">class procedure TBar.CopyFrom(constref Source: TFoo; var Dest: TBar);<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Then this begs question, what's the difference between AutoCopy/CopyFrom and: </div><div class="gmail_extra"><br></div><div class="gmail_extra">class operator TBar.Implicit(const Value: TFoo): TBar;<br></div></div>
</blockquote></div><div class="gmail_extra"><br></div>Management operators works in different way than standard operators. Any of management operator is strictly related to RTL code (system.pp), for record with management operators is exclusively created small kind of VMT for RTL purposes. In generally set of management operators can't be changed. Existence of </div><div class="gmail_extra"><br></div><div class="gmail_extra">- class operator Initialize<span style="font-size:12.8px">(var aFoo: TFoo);</span></div><div class="gmail_extra">- class operator Finalize<span style="font-size:12.8px">(var aFoo: TFoo);</span></div><div class="gmail_extra">- class operator [Copy|OtherName]<span style="font-size:12.8px">(constref aSrc: TFoo; var aDst: TFoo);</span></div><div class="gmail_extra">- class operator [AddRef|OtherName]<span style="font-size:12.8px">(var aFoo: TFoo);</span></div><div class="gmail_extra"><br></div><div class="gmail_extra">is strictly required. That is because:</div><div class="gmail_extra"><br></div><div class="gmail_extra">1. Performance (especially AddRef operator for dynamic arrays - see my example for Florian)</div><div class="gmail_extra">2. Cooperation with RTL functions like New/Dispose, Initialize/Finalize, InitializeArray, FinalizeArray, <span style="color:rgb(0,0,0);font-family:sans-serif;font-size:13.3333px">TObject.InitInstance/</span><font color="#000000" face="sans-serif"><span style="font-size:13.3333px">TObject.CleanupInstance</span></font></div><div class="gmail_extra"><font color="#000000" face="sans-serif"><span style="font-size:13.3333px">3. Related to previous point: We need to cover actions for runtime, at compile time is impossible to cover all usages of records (like dynamically created instances of records, for example for scripts purposes).</span><br clear="all"></font><div><br></div>-- <br><div><div dir="ltr"><div>Best regards,<br>Maciej Izak</div></div></div>
</div></div>