C++ MSG_MAP marcro -> Mixin

BLS nanali at nospam-wanadoo.fr
Thu Sep 20 00:29:53 PDT 2007


Daniel Keep schrieb:
> 
> BLS wrote:
>> BLS schrieb:
>>> Hi,
>>> MFC and wxWidgets are supporting MESSAGEMAPS macros. I would like to
>>> port them to D.
>>>
>>> class CMsg
>>> {
>>> public:
>>>
>>>     virtual BOOL NewMsgProc(HWND hWnd, UINT uID, WPARAM wParam, LPARAM
>>> lParam,LRESULT lResult)
>>>     {
>>>         return FALSE;
>>>     }
>>> };
>>>
>>> Okay, here iy goes ....
>>> #define BEGIN_MSG_MAP() \
>>> public: \
>>>     virtual BOOL NewMsgProc(HWND hWnd, UINT uID, WPARAM wParam, LPARAM
>>> lParam,LRESULT& lResult) \
>>>     { \
>>>        #define ON_MESSAGE(Msg, vfunc) \
>>>     if(uID == Msg) \
>>>     { \
>>>         vfunc(uID, wParam, lParam); \
>>>         lResult = 0; \
>>>         return TRUE; \
>>>     }
>>>
>>> #define ON_MESSAGE_RANGE(MsgF, MsgL, vfunc) \
>>>     if(uID >= MsgF && uID <= MsgL) \
>>>     { \
>>>         lResult=vfunc(uID, wParam, lParam); \
>>>         return TRUE; \
>>>     }
>>>
>>> #define ON_COMMAND_CONTROL(iControl, iEvent, vfunc) \
>>>     if(uID == WM_COMMAND && iControl == LOWORD(wParam) && iEvent ==
>>> HIWORD(wParam)) \
>>>     { \
>>>         vfunc(HIWORD(wParam), LOWORD(wParam), (HWND)lParam); \
>>>         lResult = 0; \
>>>         return TRUE; \
>>>     }
>>>
>>> and so on....
>>>
>>> Is it possible to replace this C++ Macros with D2 Mixins and compile
>>> time manipulation of strings ?
>>> How ?
>>> Thanks, Bjoern
>> And I really wonder myself how to (probabely) replace this stuff using
>> Tango's Signal Slot implementation.... but I guess I miss something;
> 
> With enough CTFE, you could do it.  I've actually been thinking about
> making a generator ctfe compiler (but haven't got *any* free time at the
> moment).
> 
> If I were doing this, I'd probably try something along these lines:
> 
> mixin(wxMsgMap(`
> 	on(id1) handler1;
> 	on(id2) handler2;
> 	on(id3..id6) handler3;
> `));
> 
> Parsing that shouldn't be too difficult.  Of course, there are other
> ways of constructing this:
> 
> mixin wxMsgMap!(
>     OnMessage!(id1, handler1),
>     OnMessage!(id2, handler2),
>     OnMessage!(id3, id6, handler3)
> );
> 
> Where wxMsgMap takes a tuple of templated OnMessage structs.
> 
> Just some ideas.
> 
> 	-- Daniel

Thanks Daniel,
I am afraid I am not able to follow your suggestion...Can you figure it 
out please ? // I mean your second solution

However, let's say I'll use D template mixins instead of C macros

// The known parameters as follows
virtual BOOL NewMsgProc(HWND hWnd, UINT uID, WPARAM wParam, LPARAM
lParam,LRESULT lResult)

So :
#define ON_MESSAGE_RANGE(MsgF, MsgL, vfunc) \
      if(uID >= MsgF && uID <= MsgL) \
      { \
         lResult=vfunc(uID, wParam, lParam); \
          return TRUE; \
      }


// Replaced with Template Mixin

Template ON_MESSAGE_RANGE(M1, M2, F) (M1 MsgF, M2 MsgL, F function(...) dg )
{
     typeof(dg) dg_m;
     if(uID >= MsgF && uID <= MsgL)
      {
         lResult = dg_m(uID, wParam, lParam);
          return TRUE;
      }
}

is a valid ?  I guess - F function(...) dg is not.
Bjoern


More information about the Digitalmars-d-learn mailing list