Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > design woes ... confused on an implementation approach

Reply
Thread Tools

design woes ... confused on an implementation approach

 
 
ma740988@pegasus.cc.ucf.edu
Guest
Posts: n/a
 
      08-01-2005
Select parameters in a vendors API file is as follows:

#ifdef __cplusplus
typedef void (*VOIDFUNCPTR)(...); /* ptr to function returning void
*/
#else
typedef void (*VOIDFUNCPTR)(); /* ptr to function returning void
*/
#endif /* __cplusplus */

enum CAUSE { CHAN0_COMPLETE, CHAN0_MISS, CHAN0_HIT, CHAN0_ISM };
bool IntConnect( CAUSE c, VOIDFUNCPTR p, int idx, int jdx);
// end vendors file

The member function IntConnect that takes a cause; a VOIDFUNCPTR; and
a two integer variables.

The basic premise: You'll pass your desired - static/global - member
function + cause, etc .. to the vendors IntConnect member function.

To bypass the 'procedural approach' I have a class transfer that takes
a map and a function pointer.

class transfer {
static std::auto_ptr<cb_base> user_cb;
map<CAUSE, VOIDFUNCPTR> myMap;
static void callback_mem_func1(...) {
// call user function passed in via connect_interrupt
cb_base &cb = *user_cb;
}
static void callback_mem_func2(...) {
// call user function passed in via connect_interrupt
cb_base &cb = *user_cb;
}
/// more

public:
transfer() {
myMap[CHAN0_COMPLETE] = &transfer::callback_mem_func1;
myMap[CHAN0_MISS] = &transfer::callback_mem_func2;
// more
}

template <typename T>
bool connect_interrupt(
CAUSE c,
int param1,
int param2,
T& t,
void (T::*f)(...) ) )
{
map<CAUSE, VOIDFUNCPTR>::iterator it = myMap.begin();
for (; it != myMap.end(); ++it)
{
if ( it->first == c )
{
bool success = IntConnect(
(*it).first,
(*it).second,
param1,
param2
);

if ( success ) {
user_cb.reset(new cb_derived<T>(t, f));
}
break;
}
} // end for
};
With this approach I'll register with IntConnect a static member
function. The static member function will - in turn - call user
desired member function.

At issue: The current approach to user_cb WONT work. I need to have
vector or something similar .. This way within the member functions
callback_mem_func1, etc. I could do:

void callback_mem_func1(...) {
// call user function passed in via connect_interrupt
cb_base &cb = *user_cb[0]; // <<<<NOTE HERE>>>
}
void callback_mem_func2(...) {
// call user function passed in via connect_interrupt
cb_base &cb = *user_cb[1]; // <<<<NOTE HERE>>>
}
or ... I'm open to a re-design worse case.

// cb_base:

# include <iostream>
# include <memory>
# include <string>

using namespace std;
class cb_base
{
public:
virtual void operator()(...) const {};
virtual ~cb_base() = 0;
};

inline cb_base::~cb_base() {}

template <typename T>
class cb_derived : public cb_base
{
public:
typedef void (T::*F)(...);
cb_derived( T& t, F f) : t_(&t), f_(f) {}
void operator()(...) const
{
(t_->*f_)();
}

private:
T* t_;
F f_;
};

template <typename T>
cb_derived<T> make_callback (T& t, void (T::*f)(...) )
{
return cb_derived<T>(t, f);
}

template <class T>
std::auto_ptr<cb_base> new_callback(T& t, void (T::*f)(...))
{
return std::auto_ptr<cb_base>(new cb_derived<T>(t, f));
}


Thanks in advance

 
Reply With Quote
 
 
 
 
Maxim Yegorushkin
Guest
Posts: n/a
 
      08-01-2005
http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:
> Select parameters in a vendors API file is as follows:
>
> #ifdef __cplusplus
> typedef void (*VOIDFUNCPTR)(...); /* ptr to function returning void
> */
> #else
> typedef void (*VOIDFUNCPTR)(); /* ptr to function returning void
> */
> #endif /* __cplusplus */
>
> enum CAUSE { CHAN0_COMPLETE, CHAN0_MISS, CHAN0_HIT, CHAN0_ISM };
> bool IntConnect( CAUSE c, VOIDFUNCPTR p, int idx, int jdx);
> // end vendors file


Are you sure that VOIDFUNCPTR takes no arguments before the ellipsis?
Because as it's declared now there is no way to get arguments from
inside VOIDFUNCPTR callback.

 
Reply With Quote
 
 
 
 
ma740988@pegasus.cc.ucf.edu
Guest
Posts: n/a
 
      08-01-2005
I'm sure. That is the way VOIDFUNCPTR is declared. It was a surprise
to me when I encountered it. I never understood the need for the
ellipsis.

 
Reply With Quote
 
Maxim Yegorushkin
Guest
Posts: n/a
 
      08-01-2005
(E-Mail Removed) wrote:
> I'm sure. That is the way VOIDFUNCPTR is declared. It was a surprise
> to me when I encountered it. I never understood the need for the
> ellipsis.


Then it seems to be no way to pass any data to the callback, the
callback has to operate on global data.

 
Reply With Quote
 
ma740988@pegasus.cc.ucf.edu
Guest
Posts: n/a
 
      08-01-2005
Yeah but the more important questions is what's teh workaround for
'user_cb'?. user_cb needs to reflect a list/vector or .......... How
would you achieve this?

 
Reply With Quote
 
Maxim Yegorushkin
Guest
Posts: n/a
 
      08-02-2005

(E-Mail Removed) wrote:
> Yeah but the more important questions is what's teh workaround for
> 'user_cb'?. user_cb needs to reflect a list/vector or .......... How
> would you achieve this?


I'd do something along these lines:

typedef void (*VOIDFUNCPTR)();

enum CAUSE { CHAN0_COMPLETE, CHAN0_MISS, CHAN0_HIT, CHAN0_ISM };
bool IntConnect( CAUSE c, VOIDFUNCPTR p, int idx, int jdx);

template<int N> struct int_ {};

template<int N>
void the_callback(int_<N>); // implement it
// alternatively
// void the_callback(int_<CHAN0_COMPLETE>);
// void the_callback(int_<CHAN0_MISS>);

template<int N>
void callback_thunk()
{
the_callback(int_<N>());
}

void f()
{
IntConnect(CHAN0_COMPLETE, callback_thunk<CHAN0_COMPLETE>, 0, 0);
IntConnect(CHAN0_MISS, callback_thunk<CHAN0_MISS>, 0, 0);
// ...
}

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
confused about .h and .cpp definition vs implementation michael.goossens@gmail.com C++ 11 01-28-2008 07:18 AM
implementation approach .. ma740988@pegasus.cc.ucf.edu C++ 4 08-29-2005 11:47 AM
Best Design approach Jason Mauss ASP .Net 0 03-24-2005 07:48 AM
Looking for feedback on implementation approach Bijoy Naick ASP .Net 1 11-17-2004 11:54 PM
Advice on design approach and principles Mr Gordonz ASP .Net 1 08-04-2003 10:08 PM



Advertisments