On 2017-07-21 00:02, Walter Bright wrote:
On 7/20/2017 2:21 PM, Stefan Koch wrote:
Please tell me this is not going to get into dmd :)
templates are so much more expensive then macros.
(Well, for now :) )

Those templates can and should be replaced by CTFE.

If you like, present the CTFE solution. Should be fun!

Here's my solution. It sill uses templates for the implementation of "map":

auto map(alias func)(const(Row)[] array)
{
    alias R = typeof(func(Row.init));
    R[] result;

    foreach (e ; array)
        result ~= func(e);

    return result;
}

struct Row
{
    string id;
    int reg;
    int mask;
    int ty;
}

immutable Row[2] table = [
    Row("AH", 4, mAX, TYuchar),
    Row("AL", 0, mAX, TYuchar)
];

alias regm_t = int;
alias tym_t = int;

enum mAX = 1;
enum TYuchar = 1;
enum mTYvolatile = 2;

private __gshared const(char)*[table.length] pseudotab = table.map!(row => row.id);
__gshared ubyte[table.length] pseudoreg = table.map!(row => row.reg);
__gshared int[table.length] pseudomask = table.map!(row => row.mask);
private __gshared const(tym_t)[table.length] pseudoty = table.map!(row => mTYvolatile | row.ty);

I added some type aliases and enums to be able to run the code self contained without DMD. Some advantages:

* Less use of templates
* More readable since there's a specific type (Row) with named fields, no need to write the fields in comments
* Easier to update when the length of the arrays are not hard coded

--
/Jacob Carlborg

Reply via email to