D library projects

Steven Schveighoffer schveiguy at yahoo.com
Sat Nov 14 21:09:43 PST 2009


On Sat, 14 Nov 2009 22:08:23 -0500, Andrei Alexandrescu  
<SeeWebsiteForEmail at erdani.org> wrote:

> dsimcha wrote:
>> Tango has a bunch of
>> collections.
>
> Are those following Java's collection design?

The original collections in Tango were ported from Doug Lea's original  
code, not the Java design (which was also based on Doug Lea's design).   
The newer ones are rewritten from scratch, but in the same feel.

dcollections have some Java feel in that they are classes and interfaces,  
but also add C++ style iterators (cursors).

>> I think what we really need is to define what paradigm we're using for
>> collections.  Here are some questions that really need to be answered  
>> before we
>> can start implementing a std.collections:
>>  1.  How do we prioritize the following when tradeoffs have to be made:
>>      a.  Safety
>>     b.  Flexibility
>>     c.  Performance
>>     d.  Simplicity/Ease of use
>>  STL, for example, primarily focuses on performance and flexibility at  
>> the expense
>> of simplicity and safety.  We might not want that tradeoff.
>
> I think policies should decide here. Let the user make the choice and  
> offer a good set of defaults.

I agree -- it should be possible with the metaprogramming power of D to  
allow for the user to choose his weapon -- power and speed vs. safe.  I  
think simplicity is a given.

For example, it could be a version statement that decides whether ranges  
of a container do runtime checks for safety.

>> 2.  Should we use an OO flavor w/ classes and explicit Interface  
>> interfaces or a
>> more template-y flavor with structs and compile-time interfaces?
>
> I'd be leaning more towards classes, but I'm still waiting for a killer  
> argument one way or another.

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.

> 6.  Should we allow custom allocators?  I would actually say no,
>> because based on
>> my experience with my TempAlloc collections, if you're using a custom  
>> allocator,
>> you probably want to design the implementation with the details of that  
>> allocator
>> in mind.  Furthermore, it may be hard to make things safe without  
>> knowing
>> something about how the memory allocator works.
>
> Good question. Would love to, but I don't know how to design a good  
> solution.

In dcollections, the custom allocator is a template argument for the  
collection class.

Using a custom allocator has brought tremendous speedups, because you go  
through fewer collection cycles, and waste much less space.

I think it's possible to design a custom allocator framework that is  
hidden completely from the API.  dcollections has 2 different allocators  
-- the default is a custom allocator I wrote to cut down on the GC  
collection cycles (which I also contributed to Tango and is now their  
default allocator), and the alternative is an allocator which simply uses  
the GC to allocate all nodes with 'new'.  The code to use such containers  
does not change if you change the allocator.

Tango does have an allocator that ONLY works for pure value types (types  
that have no pointers in them), and it is even faster than my custom  
allocator, but it requires you "know what you are doing."  I think with  
the power of D2 we should be able to come up with some template magic that  
disallows such an allocator from being used with the wrong types.

-Steve



More information about the Digitalmars-d mailing list