"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