"macro" expansion to build switch case code

kdevel kdevel at vogtner.de
Sun Jul 2 19:07:43 UTC 2023


On Sunday, 2 July 2023 at 17:02:44 UTC, Paul wrote:
> I have a struct similar to the following example.  I'd like to 
> build an adder method without having to code the whole method.  
> How do I use the D language to do this?  Template, mixins, 
> CTFE..all of them?
>
> ```d
> struct myS {
>     int a, b, c, d, e, f, g, h, i;
>     adder(string s, int n) {
>         final switch (s) {
>             case "aa" :
>                 a += n; break;
>             case "bb" :
>                 b += n; break;
>            ...
> ```
> Thanks for any assistance.

Thanks for your interesting question!

```
module mys;
import std.exception;

class UnknownRegister : Exception {
    mixin basicExceptionCtors;
}

enum string [] DefaultRegisterSet = [
       "a", "b", "c", "d", "e", "f", "g", "h", "i"
    ];

struct myS {
    int [string] registers;

    this (string [] register_names)
    {
       foreach (r; register_names)
          registers [r] = 0;
    }

    void adder (string s, int n)
    {
       auto p = s in registers;
       enforce!UnknownRegister (p);
       *p += n;
    }

    int opDispatch (string s) ()
    {
       auto p = s in registers;
       enforce!UnknownRegister (p);
       return *p;
    }
}

unittest {
    auto m = myS (DefaultRegisterSet);
    m.adder ("a", 7);
    m.adder ("a", 8);
    assert (m.a == 15);
    assertThrown!UnknownRegister (m.adder ("j", -1));
    assertThrown!UnknownRegister (m.j == 0);
}
```


More information about the Digitalmars-d-learn mailing list