On Tuesday, 26 January 2016 at 14:55:53 UTC, Wilson wrote:
Just wondering how to create a dense multidimensional array with the GC free array container? I don't want to use an array of arrays but I do want the array[0][0] notation.

I suggest using std.experimental.ndslice [1] for multidimensional arrays and std.experimental.allocator [2] for GC-free allocation. For an introduction to the design ideas behind [2], you can also check Andrei's talk at DConf [3].

Here's an example:

import std.stdio : writeln;
import std.experimental.allocator : makeArray, dispose;
import std.experimental.allocator.mallocator : Mallocator;
import std.experimental.ndslice : sliced;

void main()
{
    ulong[] arr = Mallocator.instance.makeArray!ulong(36);
    scope (exit) Mallocator.instance.dispose(arr);

    // All of the below matrices refer to the same array
    // that was allocated above.
    auto matrix4x9 = arr.sliced(4, 9);      // 2D 4x9 matrix
    auto matrix6x6 = arr.sliced(6, 6);      // 2D 6x6 matrix
    auto matrix2x3x6 = arr.sliced(2, 3, 6); // 3D 2x3x6 matrix

// matrix.length!N - gets the number of elements in the Nth dimention
    foreach (rowIdx; 0 .. matrix6x6.length!0)
        foreach (columnIdx; 0 .. matrix6x6.length!1)
matrix6x6[rowIdx, columnIdx] = (rowIdx + 1) * 10 + columnIdx + 1;

    writeln (matrix6x6);
    writeln (matrix4x9);
    writeln (matrix2x3x6);
    // The memory allocated by arr will be freed implicitly here.
}

Which prints:
[[11, 12, 13, 14, 15, 16], [21, 22, 23, 24, 25, 26], [31, 32, 33, 34, 35, 36], [41, 42, 43, 44, 45, 46], [51, 52, 53, 54, 55, 56], [61, 62, 63, 64, 65, 66]]

[[11, 12, 13, 14, 15, 16, 21, 22, 23], [24, 25, 26, 31, 32, 33, 34, 35, 36], [41, 42, 43, 44, 45, 46, 51, 52, 53], [54, 55, 56, 61, 62, 63, 64, 65, 66]]

[[[11, 12, 13, 14, 15, 16], [21, 22, 23, 24, 25, 26], [31, 32, 33, 34, 35, 36]], [[41, 42, 43, 44, 45, 46], [51, 52, 53, 54, 55, 56], [61, 62, 63, 64, 65, 66]]]

[1]: http://dlang.org/phobos-prerelease/std_experimental_ndslice
[2]: http://dlang.org/phobos-prerelease/std_experimental_allocator
[3]: http://dconf.org/2015/talks/alexandrescu.html

Reply via email to