On Thursday, 3 September 2015 at 19:45:48 UTC, bitwise wrote:
Any interest in having these in Phobos?

https://github.com/bitwise-github/d-containers

Phobos doesn't currently have a Queue(T), and Array(T) leaves much to be desired. The containers I've built are very full featured, fast, and are unittested fairly thoroughly. I intend to add range checking to both containers as well. Inspiration was taken from C++'s vector and queue, C#'s generic List and Queue, and D's Array.

I'm not sure how the container's I've built would be integrated though. They do go against the current container spec, but for good reason.

The container spec says containers should be reference types, but I guess this clashed with the idea of Phobos being @nogc so someone tried to make Array(T) ref counted. The result is std.container.Array being a struct with an instance of RefCounted inside it, which is bad for performance, but also inflexible. Innocent looking code like the following will do 2 separate allocations: One for the RefCounted payload, and one for the Array's data. On top of being a performance hit, it doesn't allow the user to choose how they want to manage memory.

Array!int a = Array!int(1, 2, 3); // 2 allocations, or else! >:D

The containers I've built are simple value types with a postblit. Using this as a base, one can simply use the container as-is if they like(which I do), but it's also trivial to make either a ref-counted version, or GC version.

See here for example:
https://github.com/bitwise-github/d-containers/blob/master/main.d

    Bit

I think that std.allocators is a prerequisite to implement the some new std containers.

Examples:
- library array: gc_allocator for a "single shot" program is fine.
- library array: aligned_allocator if the array content has to be used with several SSE instructions. - linked list: could use malloctor to automatically manage its payloads life-time, but the final choice will be a parameter of the template instance. Inside the template, some 'static if' branches to adapt the code to the allocator used to make new payloads. Also a the free list to get available payloads instead of allocationg...etc.

New containers without std.mallocators would be an error. In this sense, EMSI allocators are a bit more compliant (they already use them, not exactly as required but templates have an optional param to indicate if the structures are GC-free or not).

Reply via email to