On Friday, 28 February 2020 at 10:20:03 UTC, Виталий Фадеев wrote:
On Friday, 28 February 2020 at 10:14:41 UTC, Виталий Фадеев
wrote:
On Friday, 28 February 2020 at 09:49:53 UTC, Simen Kjærås
wrote:
On Friday, 28 February 2020 at 09:25:58 UTC, Виталий Фадеев
wrote:
[...]
So let's create a template for that:
[...]
Cool!
Think!
I writing code generation. Like this:
void On( T, alias M )( T o )
{
// generate code in dispatcher
// get AllMembers()
// filter OnABC (ex: OnWM_KEYUP)
// on each
// writeCode(
// q{
// if ( message == WM_KEYUP )
// o.OnWM_KEYUP();
// }
// );
static ... foreach( ) ...
{
CB_MESSAGE = ...
CB_METHOD = ...
mixin (
"if ( message == CB_MESSAGE ) " ~ "o." ~ CB_METHOD
~ "();"
);
}
}
Thanks all !
I happy !
Check this one:
import core.sys.windows.windows;
import std.stdio;
import std.traits;
import std.algorithm.searching;
void On( T, M )( T o, M message )
{
// generate code in dispatcher
// get AllMembers()
// filter OnABC (ex: OnWM_KEYUP)
// on each
// writeCode(
// q{
// if ( message == WM_KEYUP )
// o.OnWM_KEYUP();
// }
// );
foreach( methodName; __traits( allMembers, T ) )
{
static if ( methodName.startsWith( "On" ) &&
methodName.length >= 3 )
{
mixin (
"if ( message == " ~ methodName[2..$] ~ " ) "
~ "o." ~ methodName ~ "();"
);
}
}
}
class Base
{
void Send( T, M )( T o, M message )
{
o.On!( T, M )( message );
}
}
class A : Base
{
void OnWM_KEYUP()
{
writeln( "A.OnWM_KEYUP()" );
}
void OnWM_KEYDOWN()
{
writeln( "A.OnWM_KEYDOWN()" );
}
}
void main()
{
auto a = new A();
a.Send( a, WM_KEYUP );
a.Send( a, WM_KEYDOWN );
}