D library projects
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Sun Nov 15 09:48:34 PST 2009
Steven Schveighoffer wrote:
> On Sun, 15 Nov 2009 11:49:18 -0500, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> wrote:
>
>> Michel Fortin wrote:
>>>> I think shoehorning containers that are graph based into value
>>>> types might be a little strenuous. All the builtin D container
>>>> types are essentially reference types (arrays are not exactly
>>>> reference types but behave mostly like reference types), I don't
>>>> see why we should change that.
>>>> Making them classes allows for interfaces which helps allow runtime
>>>> decisions for things like copying data between containers that are
>>>> of different types. See dcollections and how easy it is to copy
>>>> data from one type to another.
>>> I'm of the same opinion.
>>
>> I couldn't find the details on copying. How does dcollections solve
>> it? It's a double dispatch issue.
>
> I don't see how it's a double dispatch issue... If you want to copy
> data from one container to another, you simply pass the container to add:
>
> container1.add(container2);
>
> Because they implement interfaces, there is only one function generated
> for this (with templated structs, you'd need one implementation per
> container combination). I do *some* optimization in case container2 is
> the same type as container1. But for all containers, adding an element
> is a quick operation and traversing to the next element is a quick
> operation, so I don't see why you'd need special implementations for
> certain combinations of containers, necessitating double-dispatch.
Ok, thanks for clarifying. I thought the overhead of traversal is
considerable, which would make it advantageous to specialize add on
select pairs of containers.
>>> That said, I'm wondering if the container classes shouldn't also be
>>> made final (unlike dcollections). Being classes would make them easy
>>> to pass as interfaces, but them being
>>> final would help skip the virtual calls whenever you don't pass them
>>> as interfaces.
>>
>> Sounds nice.
>
> Yes, I intended to do that, but I wasn't sure if it made sense to
> prevent people from inheriting from the classes, so I went the safer
> route. My recent experiments have shown me that virtual calls actually
> aren't all that more expensive anyways than just normal calls...
I see. Now, in this brave new world, inheritance seems to be often
shunned in favor of composition, and I see it plausible that a
library-offered container fosters composition if you want to provide
your own container.
Andrei
More information about the Digitalmars-d
mailing list