Fixed size array initialization
rumbu
rumbu at rumbu.ro
Sun Feb 11 14:40:36 UTC 2018
On Sunday, 11 February 2018 at 14:06:32 UTC, rjframe wrote:
> On Sat, 10 Feb 2018 10:55:30 +0000, rumbu wrote:
>
> If you separate initialization to a static this, you'll get a
> compile error:
>
> ```
> immutable uint256[78] pow10_256;
>
> static this() {
> // Error: mismatched array lengths, 78 and 2
> pow10_256 = [
> uint256(1UL),
> uint256(10UL)
> ];
> }
> ```
Yes, this was in fact the idea of
https://github.com/dlang/phobos/pull/4936
Didn't like it, sorry.
>
> Or if you know that no element should be the object's init
> value, you could do a static foreach to validate that at
> compile-time.
Nice idea too, but this will significantly increase compilation
time.
>
> You could also generate the elements at compile-time (this
> could use some improvement, and should be generalized so a
> single function can generate fillers for your other arrays as
> well):
>
> ```
> immutable uint256[78] pow10_256;
>
> static this() {
> // Uncomment this to view the generated code. Helpful for
> debugging.
> //pragma(msg, GenPow10_256Initializer);
> mixin(GenPow10_256Initializer);
> }
>
> static string GenPow10_256Initializer() {
> import std.range : repeat;
> import std.conv : text;
>
> string code = "pow10_256 = [\n";
> foreach(i; 0..78) {
> code ~= ` uint256("1` ~ '0'.repeat(i).text ~ `")` ~
> ",\n";
> }
> code = code[0..$-2]; // Remove trailing comma.
> code ~= "\n];";
> return code;
> }
> ```
As I said in my previous comments, this was the initial approach
for all the arrays there (I'm a very lazy person, believe me) but
the compiler complained with a nice "Out of memory" error, that's
why I ended writing the array elements by hand.
More information about the Digitalmars-d-learn
mailing list