Initializing static array with contents of (static and dynamic) arrays
ZombineDev via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Jul 4 10:24:20 PDT 2016
On Monday, 4 July 2016 at 14:31:41 UTC, Johannes Loher wrote:
> 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!
You should be able to use
http://dlang.org/phobos-prerelease/std_meta#aliasSeqOf for this.
I think it should work with the same syntax as expand, but with
added bonus that it also handles ranges like those in std.range
and std.algorithm.
More information about the Digitalmars-d-learn
mailing list