// マクロ
string makeHANDLE_MSG(alias hwnd, alias message, string fn)() @property
{
return "case " ~ message.stringof ~ ":"
"return HANDLE_" ~ message.stringof ~ "("
~ hwnd.stringof ~ ", wParam, lParam, "
~ "&" ~ fn ~ ");";
}
// ダミー:既にどこかで定義済みのはず
int HANDLE_WM_MSG1(void* h, int l, int w, int function(void* hwnd, int,int) fn)
{
return fn(h, l, w);
}
int HANDLE_WM_MSG2(void* h, int l, int w, int function(void* hwnd, int,int) fn)
{
return fn(h, l, w);
}
int HANDLE_WM_MSG3(void* h, int l, int w, int function(void* hwnd, int,int) fn)
{
return fn(h, l, w);
}
// メッセージごとに作成する?
const int WM_MSG1 = 1, WM_MSG2 = 2, WM_MSG3 = 3;
int handler1(void* h, int l, int w) {
return 0;
}
int handler2(void* h, int l, int w) {
return 0;
}
int handler3(void* h, int l, int w) {
return 0;
}
int main()
{
int msg = WM_MSG1;
void* hwnd;
int wParam, lParam; // makeHANDLE_MSG を展開した後で参照される
// 使用例
switch (msg) {
mixin( makeHANDLE_MSG!(hwnd, WM_MSG1, "handler1") ); // HANDLE_MSG(hwnd, message, fn)
// 複数行並べる場合はこっちのほうがマシ
mixin(
makeHANDLE_MSG!(hwnd, WM_MSG2, "handler2") ~
makeHANDLE_MSG!(hwnd, WM_MSG3, "handler3") ~
"" );
default:
assert(false);
}
}
Ly8g44Oe44Kv44OtCnN0cmluZyBtYWtlSEFORExFX01TRyhhbGlhcyBod25kLCBhbGlhcyBtZXNzYWdlLCBzdHJpbmcgZm4pKCkgQHByb3BlcnR5CnsgCiAgICByZXR1cm4gImNhc2UgIiB+IG1lc3NhZ2Uuc3RyaW5nb2YgfiAiOiIKICAgICAgICAgICAgInJldHVybiBIQU5ETEVfIiB+IG1lc3NhZ2Uuc3RyaW5nb2YgfiAiKCIKICAgICAgICAgICAgICAgIH4gaHduZC5zdHJpbmdvZiB+ICIsIHdQYXJhbSwgbFBhcmFtLCAiCiAgICAgICAgICAgICAgICB+ICImIiB+IGZuIH4gIik7IjsKfQoKLy8g44OA44Of44O877ya5pei44Gr44Gp44GT44GL44Gn5a6a576p5riI44G/44Gu44Gv44GaCmludCBIQU5ETEVfV01fTVNHMSh2b2lkKiBoLCBpbnQgbCwgaW50IHcsIGludCBmdW5jdGlvbih2b2lkKiBod25kLCBpbnQsaW50KSBmbikKewogICAgcmV0dXJuIGZuKGgsIGwsIHcpOwp9CmludCBIQU5ETEVfV01fTVNHMih2b2lkKiBoLCBpbnQgbCwgaW50IHcsIGludCBmdW5jdGlvbih2b2lkKiBod25kLCBpbnQsaW50KSBmbikKewogICAgcmV0dXJuIGZuKGgsIGwsIHcpOwp9CmludCBIQU5ETEVfV01fTVNHMyh2b2lkKiBoLCBpbnQgbCwgaW50IHcsIGludCBmdW5jdGlvbih2b2lkKiBod25kLCBpbnQsaW50KSBmbikKewogICAgcmV0dXJuIGZuKGgsIGwsIHcpOwp9CgovLyDjg6Hjg4Pjgrvjg7zjgrjjgZTjgajjgavkvZzmiJDjgZnjgovvvJ8KY29uc3QgaW50IFdNX01TRzEgPSAxLCBXTV9NU0cyID0gMiwgV01fTVNHMyA9IDM7CmludCBoYW5kbGVyMSh2b2lkKiBoLCBpbnQgbCwgaW50IHcpIHsKICAgIHJldHVybiAwOwp9CmludCBoYW5kbGVyMih2b2lkKiBoLCBpbnQgbCwgaW50IHcpIHsKICAgIHJldHVybiAwOwp9CmludCBoYW5kbGVyMyh2b2lkKiBoLCBpbnQgbCwgaW50IHcpIHsKICAgIHJldHVybiAwOwp9CgppbnQgbWFpbigpCnsKICAgIGludCBtc2cgPSBXTV9NU0cxOwogICAgdm9pZCogaHduZDsKICAgIGludCB3UGFyYW0sIGxQYXJhbTsgLy8gbWFrZUhBTkRMRV9NU0cg44KS5bGV6ZaL44GX44Gf5b6M44Gn5Y+C54Wn44GV44KM44KLCiAgICAKICAgIC8vIOS9v+eUqOS+iwogICAgc3dpdGNoIChtc2cpIHsKICAgICAgICBtaXhpbiggbWFrZUhBTkRMRV9NU0chKGh3bmQsIFdNX01TRzEsICJoYW5kbGVyMSIpICk7IC8vIEhBTkRMRV9NU0coaHduZCwgbWVzc2FnZSwgZm4pCiAgICAgICAgLy8g6KSH5pWw6KGM5Lim44G544KL5aC05ZCI44Gv44GT44Gj44Gh44Gu44G744GG44GM44Oe44K3CiAgICAgICAgbWl4aW4oCiAgICAgICAgICAgIG1ha2VIQU5ETEVfTVNHIShod25kLCBXTV9NU0cyLCAiaGFuZGxlcjIiKSB+CiAgICAgICAgICAgIG1ha2VIQU5ETEVfTVNHIShod25kLCBXTV9NU0czLCAiaGFuZGxlcjMiKSB+CiAgICAgICAgICAgICIiICk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICBhc3NlcnQoZmFsc2UpOwogICAgfQp9Cg==