Semantics of toString
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Thu Nov 12 13:19:39 PST 2009
Steven Schveighoffer wrote:
> On Thu, 12 Nov 2009 14:40:12 -0500, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> wrote:
>
>> Steven Schveighoffer wrote:
>>> On Thu, 12 Nov 2009 13:46:08 -0500, Andrei Alexandrescu
>>> <SeeWebsiteForEmail at erdani.org> wrote:
>>>
>>>>> From my C++ book, it appears to only use virtual inheritance. I
>>>>> don't know enough about virtual inheritance to know how that
>>>>> changes function calls.
>>>>> As far as virtual functions, only the destructor is virtual, so
>>>>> there is no issue there.
>>>>
>>>> You're right, but there is an issue because as far as I can recall
>>>> these functions' implementation do end up calling a virtual function
>>>> per char; that might be streambuf.overflow. I'm not keen on
>>>> investigating this any further, but I'd be grateful if you shared
>>>> any related knowledge.
>>> Yep, you are right. It appears the reason they do this is so the
>>> conversion to the appropriate width can be done per character (and is
>>> a no-op for char).
>>>
>>>> At the end of the day, there seem to be violent agreement that we
>>>> don't want one virtual call per character or one delegate call per
>>>> character.
>>> After running my tests, it appears the virtual call vs. delegate is
>>> so negligible, and the virtual call vs. direct call is only slightly
>>> less negligible, I think the virtualness may not matter. However, I
>>> think avoiding one *call* per character is a worthy goal.
>>> This doesn't mean I change my mind :) I still think there is little
>>> benefit to having to conjure up an entire object just to convert
>>> something to a string vs. writing a simple inner function.
>>> One way to find out is to support only char[], and see who complains
>>> :) It'd be much easier to go from supporting char[] to supporting
>>> all the widths than going from supporting all to just one.
>>
>> One problem I just realized is that, if we e.g. offer only put(in
>> char[]) or a delegate to that effect, we make it impossible to output
>> one character efficiently. The (&c)[0 .. 1] trick will not work in
>> safe mode. You'd have to allocate a one-element array dynamically.
>
> char[1] buf;
> buf[0] = c;
> put(buf);
This would not compile in SafeD.
> Although it would be a useful feature to be able to convert a value type
> to an array of one element reference, especially since that should be as
> safe as taking a slice of a static array.
>
> Another solution, although I'm unaware of the added costs:
>
> void toString(void delegate(in char[]...) put, string fmt);
>
>> Also, many OSs adopted UTF-16 as their standard format. It may be wise
>> to design for compatibility.
>
> So you want toString's to look like this?
>
> version(utf16isdefault)
> {
> textobj.put("Array: "w);
> ...
> }
> else
> {
> textobj.put("Array: ");
> ...
> }
>
> -Steve
I was just thinking of offering an interface that offers utf8 and utf16
and utf32.
Andrei
More information about the Digitalmars-d
mailing list