toString refactor in druntime

John Colvin via Digitalmars-d digitalmars-d at puremagic.com
Mon Nov 3 23:51:29 PST 2014


On Tuesday, 4 November 2014 at 04:34:09 UTC, Jonathan Marler 
wrote:
> On Tuesday, 4 November 2014 at 02:49:55 UTC, Steven 
> Schveighoffer wrote:
>> On 11/3/14 6:05 PM, Jonathan Marler wrote:
>>> In many cases templates are good because they provide the a 
>>> way for the
>>> programmer to use a library optimized for their particular 
>>> application.
>>> This is the case for the toString function.  An argument can 
>>> be made
>>> that using templates is dangerous because if they are used 
>>> incorrectly,
>>> the number of template instantiates can blow up.  But this 
>>> can always be
>>> solved by the programmer by changing all their template calls 
>>> to use the
>>> same template parameters.  This allows the template solution 
>>> to
>>> simultaneously support a sink that represents a real 
>>> function, or a
>>> delegate, or whatever the application needs.
>>
>> If we make toString a template, we precludes it as a virtual 
>> function, and we force the object to expose its inner workings.
>>
>> I think the template solution has advantages, one being the 
>> possibility for optimization. But I don't think the gains are 
>> significant enough. It's also more complex than necessary.
>>
>
> I was thinking you could have the best of both worlds with 
> templates.  For example, you could define the toString template 
> like this:
>
>   void toStringTemplate(T)(T sink) 
> if(isOutputRange!(T,const(char)[]))
>
> Then you could declare an alias like this:
>
>   alias toString = toStringTemplate!(void 
> delegate(const(char)[]));
>
> Which (correct me if I'm wrong) I believe is equivalent to the 
> original sink delegate function.  This allows programmers to 
> write the logic for toString once and allow a developer using 
> the library to choose whether they want to use the delegate 
> version or the generic output range version.
>
> This gives the user of the library the ability to choose the 
> best version for their own application.
>
> Note: I added this "alias" method to my dtostring.d test code 
> and it wasn't as fast as the delegate version.  I'm not sure 
> why as I thought the generated code would be identical.  If 
> anyone has any insight as to why this happened let me know.
>
> code is at http://marler.info/dtostring.d

I'm sure it's been mentioned before, but you should try ldc/gdc 
as they have much more capable optimisers.


More information about the Digitalmars-d mailing list