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.

Reply via email to