[hackathon] An article about metaprogramming
bearophile via Digitalmars-d
digitalmars-d at puremagic.com
Wed Apr 29 09:55:57 PDT 2015
Mafi:
> https://marfisc.wordpress.com/2015/04/29/using-d-templates-for-gamedev/
>
> What do you think? Any remarks?
>The SDL_Event is a union. Accessing it is inherently unsafe for
>type consistency and memory safety. The SDL library mitigates
>this problem by adding a tag (the member type) which encodes
>which union-member is to be used.<
In Rust you use the built-in tagged unions and call it a day...
switch(polledEvent.type) {
mixin(caseOnEvent!("SDL_QUIT", "quit"));
mixin(caseOnEvent!("SDL_ACTIVEEVEENT", "active"));
mixin(caseOnEvent!("SDL_KEYDOWN", "eventKeyDown")); // (*)
mixin(caseOnEvent!("SDL_KEYUP", "eventKeyUp")); // (*)
mixin(caseOnEvent!("SDL_MOUSEMOTION", "motion"));
mixin(caseOnEvent!("SDL_MOUSEBUTTONUP",
"eventMouseButtonUp")); // (*)
mixin(caseOnEvent!("SDL_MOUSEBUTTONDOWN",
"eventMouseButtonDown")); // (*)
mixin(caseOnEvent!("SDL_JOYAXISMOTION", "jaxis"));
mixin(caseOnEvent!("SDL_JOYBALLMOTION", "jball"));
mixin(caseOnEvent!("SDL_JOYHATMOTION", "jhat"));
mixin(caseOnEvent!("SDL_JOYBUTTONDOWN",
"eventJoyButtonDown")); // (*)
mixin(caseOnEvent!("SDL_JOYBUTTONUP", "eventJoyButtonUp"));
// (*)
mixin(caseOnEvent!("SDL_USEREVENT", "user"));
mixin(caseOnEvent!("SDL_SYSWMEVENT", "syswm"));
default: //has to be there even if empty
static if(is(typeof(that.onOther(Event.init)))) {
that.onOther(polledEvent); break;
}
}
The default should be aligned just like the other cases. Often is
a good idea to use "final switch" with enumerations.
Probably there are ways to make that code more dry, using a
TypeTuple of pairs like ("SDL_QUIT", "quit").
Bye,
bearophile
More information about the Digitalmars-d
mailing list