D needs emplacement new

weaselcat via Digitalmars-d digitalmars-d at puremagic.com
Sat Apr 25 12:16:02 PDT 2015


On Saturday, 25 April 2015 at 19:14:41 UTC, weaselcat wrote:
> On Saturday, 25 April 2015 at 19:09:15 UTC, Namespace wrote:
>> On Saturday, 25 April 2015 at 18:57:13 UTC, Adam D. Ruppe 
>> wrote:
>>> On Saturday, 25 April 2015 at 18:50:59 UTC, Namespace wrote:
>>>> Nice name, fits better. But that should be in phobos, don't 
>>>> you think?
>>>
>>> meh, it might be nice to have, but not being in phobos isn't 
>>> a big deal to me for little utilities like this
>> I'm sure newcomers (especially those coming from C++) would be 
>> delighted if they had the possibility to reuse their memory. 
>> In addition, it could be impossible for them to write such 
>> "hack" itself.
>> I already hear the cries: "D wasted memory" and: "I can not 
>> reuse my memory".
>> And then it would be less attractive for such people, to 
>> switch to D.
>>
>> I would suggest something like:
>> ----
>> T emplace(T, U...)(ref T obj, auto ref U args) if (is(T == 
>> class)) {
>>    if (!obj)
>>        return null;
>>
>>    import std.conv : emplace; // temporary, as long it is not 
>> in std.conv
>>
>>    enum ClassSizeOf = __traits(classInstanceSize, T);
>>
>>    void[] buf = (cast(void*) obj)[0 .. ClassSizeOf];
>>    return emplace!(T)(buf, args);
>> }
>>
>> T emplaceOrNew(T, U...)(ref T obj, auto ref U args) if (is(T 
>> == class)) {
>>    if (!obj)
>>        return new T(args);
>>    return emplace(obj, args);
>> }
>> ----
>
> hmm...
> http://dlang.org/phobos/std_conv.html#.emplace

woops, accidentally posted before finishing

I was going to say that this should probably just be an overload 
of emplace if it isn't already, seems odd if it isn't.


More information about the Digitalmars-d mailing list