Replacing macros in code

E

eng

Hi, i have the following legacy code i need to rework to remove the
macros as
Can i do this with templates??

#define DECLARE_IOCTL_TABLE() \
virtual bool IOCTLUser (DWORD data, DWORD code, \
PBYTE bufIn, DWORD lenIn, PBYTE bufOut, DWORD lenOut, DWORD *out)


#define BEGIN_IOCTL_TABLE() \
bool IOCTLUser (DWORD data, DWORD code, \
PBYTE bufIn, DWORD lenIn, PBYTE bufOut, DWORD lenOut, DWORD *out) \
{ \
switch (aCode) \
{


#define IOCTL_HANDLER(IOCTL_CODE, IOCTLHandler) \
case IOCTL_CODE: \
return IOCTLHandler (data, code, bufIn, lenIn, bufOut, aLenOut,
out); \
break


#define END_IOCTL_TABLE \
default: \
return IOCTLNotHandled (data, code, bufIn, lenIn,
bufOut, lenOut, out); \
break; \
} \
}


used as follows:

BEGIN_IOCTL_TABLE()
IOCTL_HANDLER(IOCTL_GET_DATA, IOCTLGetData);
END_IOCTL_TABLE

Thanks
 
P

Pascal J. Bourguignon

eng said:
Hi, i have the following legacy code i need to rework to remove the
macros as
Can i do this with templates??

#define DECLARE_IOCTL_TABLE() \
virtual bool IOCTLUser (DWORD data, DWORD code, \
PBYTE bufIn, DWORD lenIn, PBYTE bufOut, DWORD lenOut, DWORD *out)


#define BEGIN_IOCTL_TABLE() \
bool IOCTLUser (DWORD data, DWORD code, \
PBYTE bufIn, DWORD lenIn, PBYTE bufOut, DWORD lenOut, DWORD *out) \
{ \
switch (aCode) \
{


#define IOCTL_HANDLER(IOCTL_CODE, IOCTLHandler) \
case IOCTL_CODE: \
return IOCTLHandler (data, code, bufIn, lenIn, bufOut, aLenOut,
out); \
break


#define END_IOCTL_TABLE \
default: \
return IOCTLNotHandled (data, code, bufIn, lenIn,
bufOut, lenOut, out); \
break; \
} \
}


used as follows:

BEGIN_IOCTL_TABLE()
IOCTL_HANDLER(IOCTL_GET_DATA, IOCTLGetData);
END_IOCTL_TABLE




class IOCTL {
public:
typedef boost::function<bool,DWORD,DWORD,PBYTE,DWORD,PBBYTE,DWORD,DWORD*> Handler;
typedef std::map<int,Handler> Table;

IOCTL(){};

template <class HANDLER>
void HANDLER(int code,HANDLER handler){
table
Code:
=boost::bind<bool>(handler,_1,_2,_3,_4,_5,_6,_7);
    };

    bool User(DWORD data,DWORD code,PBYTE bufIn,DWORD lenIn,PBYTE bufOut,DWORD lenOut,DWORD* out){
        Table::iterator it=table.find(code);
        if(it==table.end()){
            return(IOCTLNotHandled(data,code,bufIn,lenIn,bufOut,lenOut,out));
        }else{
            return(it->second(data,code,bufIn,lenIn,bufOut,lenOut,out));
        }
    }

protected:
    Table table;
}



{
    IOCTL ioctl;
    ioctl.HANDLER(IOCTL_GET_DATA,&IOCTLGetData);
    // ...
    bool processed=ioctl.User(data,code,bufIn,lenIn,bufOut,lenOut,out);
}
 
E

eng

eng said:
Hi, i have the following legacy code i need to rework to remove the
macros as
Can i do this with templates??
#define DECLARE_IOCTL_TABLE()      \
virtual bool IOCTLUser (DWORD data, DWORD code,    \
PBYTE bufIn, DWORD lenIn, PBYTE bufOut, DWORD lenOut, DWORD *out)
#define BEGIN_IOCTL_TABLE()    \
bool  IOCTLUser (DWORD data, DWORD code,  \
   PBYTE bufIn, DWORD lenIn, PBYTE bufOut, DWORD lenOut, DWORD *out)       \
   {                                                                       \
        switch (aCode)                                                     \
         {
#define IOCTL_HANDLER(IOCTL_CODE, IOCTLHandler)   \
   case IOCTL_CODE:                             \
       return IOCTLHandler (data, code, bufIn, lenIn, bufOut, aLenOut,
out);      \
   break
#define END_IOCTL_TABLE   \
                default:     \
                     return IOCTLNotHandled (data, code, bufIn, lenIn,
bufOut, lenOut, out);      \
                 break;       \
                  }                                        \
          }
used as follows:
BEGIN_IOCTL_TABLE()
                IOCTL_HANDLER(IOCTL_GET_DATA, IOCTLGetData);
END_IOCTL_TABLE

class IOCTL {
public:
    typedef boost::function<bool,DWORD,DWORD,PBYTE,DWORD,PBBYTE,DWORD,DWORD*> Handler;
    typedef std::map<int,Handler> Table;

    IOCTL(){};

    template <class HANDLER>
    void HANDLER(int code,HANDLER handler){
        table
Code:
=boost::bind<bool>(handler,_1,_2,_3,_4,_5,_6,_7);
    };

    bool User(DWORD data,DWORD code,PBYTE bufIn,DWORD lenIn,PBYTE bufOut,DWORD lenOut,DWORD* out){
        Table::iterator it=table.find(code);
        if(it==table.end()){
            return(IOCTLNotHandled(data,code,bufIn,lenIn,bufOut,lenOut,out));
        }else{
            return(it->second(data,code,bufIn,lenIn,bufOut,lenOut,out));
        }
    }

protected:
    Table table;

}

{
    IOCTL ioctl;
    ioctl.HANDLER(IOCTL_GET_DATA,&IOCTLGetData);
    // ...
    bool processed=ioctl.User(data,code,bufIn,lenIn,bufOut,lenOut,out);

}
[/QUOTE]

Hi , Thanks but i can't use Boost in this project, is there an
equivalent to boost::function in STL?
 
A

Alf P. Steinbach

* eng:
Hi, i have the following legacy code i need to rework to remove the
macros as
Can i do this with templates??

#define DECLARE_IOCTL_TABLE() \
virtual bool IOCTLUser (DWORD data, DWORD code, \
PBYTE bufIn, DWORD lenIn, PBYTE bufOut, DWORD lenOut, DWORD *out)


#define BEGIN_IOCTL_TABLE() \
bool IOCTLUser (DWORD data, DWORD code, \
PBYTE bufIn, DWORD lenIn, PBYTE bufOut, DWORD lenOut, DWORD *out) \
{ \
switch (aCode) \
{


#define IOCTL_HANDLER(IOCTL_CODE, IOCTLHandler) \
case IOCTL_CODE: \
return IOCTLHandler (data, code, bufIn, lenIn, bufOut, aLenOut,
out); \
break


#define END_IOCTL_TABLE \
default: \
return IOCTLNotHandled (data, code, bufIn, lenIn,
bufOut, lenOut, out); \
break; \
} \
}


used as follows:

BEGIN_IOCTL_TABLE()
IOCTL_HANDLER(IOCTL_GET_DATA, IOCTLGetData);
END_IOCTL_TABLE

Thanks

<code>
struct IoCtlArgs
{
DWORD data;
DWORD code;
PBYTE bufIn;
DWORD lenIn;
PBYTE bufOut;
DWORD lenOut;
DWORD* out;

IoCtlArgs(
DWORD data_,
DWORD code_,
PBYTE bufIn_,
DWORD lenIn_,
PBYTE bufOut_,
DWORD lenOut_,
DWORD* out_
)
: data( data_ )
, code( code_ )
, bufIn( bufIn_ )
, lenIn( lenIn_ )
, bufOut( bufOut_ )
, lenOut( lenOut_ )
, out( out_ )
{}
};

class Foo
{
private:
enum{ IOCTL_GET_DATA = 0 };

bool getData( IoCtlArgs const& args ) { return false; }
bool notHandled( IoCtlArgs const& args ) { return false; }

bool dispatch( DWORD aCode, IoCtlArgs const& args )
{
switch( aCode )
{
case IOCTL_GET_DATA: return getData( args );
}
return notHandled( args );
}
};
</code>

It might be an idea to abstract this a little, though.

For example, the raw pointers and lengths look like vectors.

For another example, it appears that the arguments are not const-correct.


Cheers & hth.,

- Alf
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,567
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top