Initializing static array with contents of (static and dynamic) arrays
Johannes Loher via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Jul 4 07:31:41 PDT 2016
In a project I am currently working on, I have lot's of code of the
following form:
static immutable ubyte[4] sigma0 = [101, 120, 112, 97];
static immutable ubyte[4] sigma1 = [110, 100, 32, 51];
static immutable ubyte[4] sigma2 = [ 50, 45, 98, 121];
static immutable ubyte[4] sigma3 = [116, 101, 32, 107];
void func(in ubyte[32] key, in ubyte[16] n)
{
ubyte[64] buf;
buf[0..4] = sigma0;
buf[4..20] = key[0..16];
buf[20..24] = sigma1;
buf[24..40] = n;
buf[40..44] = sigma2;
buf[44..60] = key[16..$];
buf[60..64] = sigma3;
/* do something with buf */
}
This looks really bad to me. I would like to initialize buf with the
corresponding values (the way it's done now, it is impossible to make
buf immutable...).
One option for this would be to use ~ to concatenate the arrays. But
this obviously results in GC allocations, which I want to avoid here,
because the functions get called very often.
Another option would be to to manually expand the arrays and initialize
buf with that:
ubyte[64] buf = [sigma0[0], sigma0[1], /* ... */, sigma3[3]];
This is obviously very annoying and error prone.
Whe searching for a solution, I found this thread about automatic
expanding of arrays:
http://forum.dlang.org/thread/hwellpcaomwbpnpofzlx@forum.dlang.org?page=1
This would result in the following code for me:
ubyte[64] buf = [
expand!sigma0,
expand!key[0..16],
expand!sigma1,
expand!n,
expand!sigma2,
expand!key[16..$],
expand!sigma3
];
Is this the suggested solution (is it robust)? Is there anything like
this in Phobos?
Thanks for your help!
More information about the Digitalmars-d-learn
mailing list