turning an array of structs into a struct of arrays
Artur Skawina via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Jul 4 11:01:37 PDT 2015
On 07/03/15 12:52, Laeeth Isharc via Digitalmars-d-learn wrote:
> I have an array of structs eg
>
> struct PriceBar
> {
> DateTime date;
> double open;
> double high;
> double low;
> double close;
> }
>
> (which fields are present in this particular struct will depend on template arguments).
>
> what is the best way to turn these at compile time into a struct of arrays? eg
>
> struct PriceBars
> {
> DateTime[] dates;
> double[] opens;
> double[] highs;
> double[] lows;
> double[] closes;
> }
>
> I can use FieldTypeTuple and FieldNameTuple, but I am a bit lost as to how without static foreach to loop through these in order to generate a mixin to declare the new type. I can turn it into a string, but what is the better option?
The simplest solution is something like:
template SOA(Struct, size_t LENGTH) {
struct SOA {
enum MEMBERNAME(size_t N) = __traits(identifier, Struct.tupleof[N]);
static __gentypes() {
string ret;
foreach (I, TYPE; typeof(Struct.tupleof))
ret ~= "align(16) typeof(Struct.tupleof["~I.stringof~"])["~LENGTH.stringof~"] "
~ MEMBERNAME!I ~ ";";
return ret;
}
mixin(__gentypes());
}
}
alias PriceBars = SOA!(PriceBar, 8);
which you'll have to adjust to your requirements (eg drop the
'"~LENGTH.stringof~"' part to get a struct-of-slices, which
is what your example above shows).
artur
More information about the Digitalmars-d-learn
mailing list