automem v0.0.7 - C++ style smart pointers using std.experimental.allocator
Atila Neves via Digitalmars-d-announce
digitalmars-d-announce at puremagic.com
Mon Apr 10 01:11:37 PDT 2017
On Sunday, 9 April 2017 at 13:59:14 UTC, Andrei Alexandrescu
wrote:
> On 4/9/17 4:56 AM, Atila Neves wrote:
>> Using std.experimental.allocator? Tired of writing
>> `scope(exit) allocator.dispose(foo);` in a language with RAII?
>> Me too:
>>
>>
>>
>> http://code.dlang.org/packages/automem
>>
>> Example:
>>
>> I think the code in the README should be enough to understand
>> what's going on. Alpha stuff here but I think the main things
>> missing are weak pointers and a ref counted array. Given that
>> I've never had to use std::weak_ptr in C++, I'm not in a hurry
>> to implement the former.
>
> Nice work!
>
>> Notable design decisions / features:
>>
>> . The smart pointers are responsible for allocating the memory
>> for the container object using the allocator of choice. This
>> is to guarantee that one can't allocate and deallocate using
>> different allocators.
>
> Nice!
>
>> . The allocator has to be specified as part of the type: this
>> means the user can choose how to store it in the smart
>> pointer, which for singletons (e.g. Mallocator) or stateless
>> allocators means they can take up zero space. If a singleton
>> (or the default theAllocator), the allocator doesn't need to
>> be passed in to the constructor, otherwise it does.
>> Specifying, e.g. Mallocator also means the relevant code can
>> be marked @nogc.
>
> After extensively studying how C++ allocator framework works, I
> got to the notion that making the allocator part of the type is
> an antipattern.
I was aware of this, but here we have a crucial workaround -
theAllocator, which is the default anyway. It's probably the best
of both worlds, since you can still specify the type if needed,
which also means the guarantee of @nogc if needed.
>
>> . RefCounted only increments/decrements the ref count
>> atomically if the contained type is `shared`
>
> Great. Can RefCounted itself be shared? I learned this is
> important for composition, i.e. you want to make a RefCounted a
> field in another object that is itself shared, immutable etc.
Since it has a destructor, no:
http://forum.dlang.org/post/sqazguejrcdtjimtjxtz@forum.dlang.org
The only way to do that would be to split it into two. Which I
guess I could with a template mixin implementing the guts.
>
>> . RefCounted!(shared T) can be sent to other threads.
>
> Awes.
>
>> . UniqueArray behaves nearly like a normal array. You can even
>> append to it, but it won't use GC memory (unless, of course,
>> you chose to use GCAllocator)!
>
> This may be a great candidate for the standard library.
I think this needs to be used in production first, and having it
as a dub package makes it easy for people to do so.
Atila
More information about the Digitalmars-d-announce
mailing list