www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 12471] New: Struct of arrays in Phobos


           Summary: Struct of arrays in Phobos
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: bearophile_hugs eml.cc

--- Comment #0 from bearophile_hugs eml.cc 2014-03-25 15:36:07 PDT ---
I suggest to add to Phobos a struct constructor that could be named

Given a POD struct like:

struct Foo {
    int a, b, c;

You can use StructOfArrays to define:

StructOfArrays!Foo sfoo1;

A more complex usage example, using a first draft of API (an alternative usage
syntax is with mixins):

StructOfArrays!(Foo, "a", "b c") sfoo2;

void main() {
    sfoo2.a ~= 10;
    sfoo2.b ~= 20;
    sfoo2 ~= Foo(1, 2, 3);

The basic StructOfArrays!Foo usage is similar to defining a struct like this,
that contains dynamic arrays for each field of Foo:

struct __SOA {
    int[] soa_a;
    int[] soa_b;
    int[] soa_c;
    // Several iteration and access methods here.

While the grouping one:

StructOfArrays!(Foo, "a", "b c")


struct __SOA {
    int[] soa_a;
    Tuple!(int, int)[] soa_b_c;
    // Several iteration and access methods here.

The automatically defined "iteration methods" allow to iterate on fields,
assign/append a struct (like in the "sfoo2 ~= Foo(1, 2, 3);" example), and so

The template verifies all fields are specified in the strings. Duplicated
fields could be accepted for performance reasons, but a first implementation
doesn't need this feature.

An additional syntax could be used to ignore some fields from the struct: 

struct Bar {
    int a, b, c, d;

StructOfArrays!(Bar, "a", "b d") sbar1;

The assignment to the c field is of course statically forbidden. But assigning
a whole Bar could be accepted:

sbar1 ~= Bar(1, 2, 3, 4); // The value "3" is ignored and not copied.

More info on the performance advantages of using a struct of arrays instead of
an array of structs in some cases:

See for doing something similar in C++:

The ideas presented here are just a first draft. Probably something better
could be invented.

The struct suggested here is not meant to cover all use cases, it's a simple
mean to implement an efficient and simple data structure. More specialized data
structures are better implemented manually.

Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 25 2014