On 10/20/2013 10:59 PM, Agustin wrote:

> 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);

Does rawAllocate still return void*? For classes, emplace requires (or at least "also accepts" a slice).

Your code will be simpler if rawAllocate returned a slice:

import std.conv;

void[] rawAllocate(size_t, size_t)
{
    static ubyte[1000] buffer;
    return buffer;
}

T allocate(T : Object, A...)(auto ref A arguments) {
    auto pMemory = rawAllocate(__traits(classInstanceSize, T), T.alignof);

    return emplace!T(pMemory, arguments);
}

class C
{
    this(int i, double d)
    {}
}

void main()
{
    auto c = allocate!C(42, 1.5);
}

If it has to return void*, you can make a slice from a plain pointer with the following syntax:

void * rawAllocate(size_t, size_t)
{
    static ubyte[1000] buffer;
    return buffer.ptr;
}

import std.stdio;

void main()
{
    enum requiredLength = 42;
    auto rawPtr = rawAllocate(requiredLength, 16);
auto slice = rawPtr[0..requiredLength]; // <-- slice from plain pointer
    writeln(slice);
}

Ali

Reply via email to