On Monday, 21 October 2013 at 05:40:13 UTC, Agustin wrote:
On Monday, 21 October 2013 at 05:17:01 UTC, Jonathan M Davis
wrote:
On Monday, October 21, 2013 05:53:46 Agustin wrote:
On Monday, 21 October 2013 at 03:50:24 UTC, Agustin wrote:
> On Monday, 21 October 2013 at 03:46:33 UTC, Jonathan M Davis
>
> wrote:
>> On Monday, October 21, 2013 05:07:02 Agustin wrote:
>>> What about constructor?. My current code is:
>>> T allocate(T : Object, A...)(auto ref A arguments) {
>>>
>>> auto pMemory = rawAllocate(__traits(classInstanceSize,
>>> T),
>>>
>>> T.alignof); // Return void*
>>>
>>> emplace!T(cast(T *)pMemory, arguments);
>>> return cast(T) pMemory;
>>>
>>> }
>>>
>>> Doesn't seems to work, and i can't find any good
>>> documentation
>>> about it.
>>
>> IIRC, the constructor should be name __ctor.
>>
>> - Jonathan M Davis
>
> no property 'opCall' for type 'Main.MyClass' :(
Trait allMember return "__ctor", but seems like i cannot call
it
directly:
(cast(T)pMemory).__ctor(arguments); // Being pMemory void*
If you want to see how to use emplace, I'd advise looking at
std.typecons.RefCounted's implementation:
https://github.com/D-Programming-Language/phobos/blob/master/std/typecons.d#L3505
emplace calls the constructor for you, so I don't know why
you'd be trying to
call it. But you can look at emplace's implementation if you
want to see how
to call __ctor.
For structs:
https://github.com/D-Programming-Language/phobos/blob/master/std/conv.d#L3976
For classes:
https://github.com/D-Programming-Language/phobos/blob/master/std/conv.d#L4716
I don't think that it'll work if the constructor is private
though, so maybe
that's your problem.
- Jonathan M Davis
I'm silly the issue was at this line
auto pMemory = rawAllocate(__traits(classInstanceSize, T),
T.alignof);
emplace(pMemory, arguments);
Correct was
auto pMemory = rawAllocate(__traits(classInstanceSize, T),
T.alignof);
emplace(&pMemory, arguments);
Thanks guys
That didn't work, but after reading how emplace works, i had to
make some changes.
public T allocate(T : Object, A...)(auto ref A arguments) {
auto pMemory = rawAllocate(__traits(classInstanceSize, T),
T.alignof);
assert(pMemory !is null, "Not enought memory on the allocator");
byte[] * pByteMemory = cast(byte[] *) pMemory;
*pByteMemory = typeid(T).init[];
auto pObject = cast(T) pMemory;
static if (is(typeof(pObject.__ctor(arguments))))
{
pObject.__ctor(arguments);
}
return pObject;
}
That would work.