Update of /cvsroot/mod-c/ehtml/include
In directory sc8-pr-cvs7.sourceforge.net:/tmp/cvs-serv14484/include
Added Files:
Plugin.h
Log Message:
Plugin<C>: a plug-in class framework (see SessionDriver for an example).
--- NEW FILE: Plugin.h ---
#ifndef __PLUGIN_H_
#define __PLUGIN_H_
#include <assert.h>
#include <string>
#include <map>
template <class C>
class Pluggable {
typedef std::map<std::string,C*> _map_t;
static _map_t _map;
std::string _name;
static C* _selected;
public:
Pluggable() { ; }
Pluggable(const char* name): _name(name) { ; }
virtual ~Pluggable() { ; }
const std::string& name() const { return _name; }
std::string& name() { return _name; }
void name(const std::string& __name) { _name = __name; }
static C* Selected() { return _selected; }
static C* Select(std::string name) { return _selected = getByName(name); }
static C* Select(C* c) { return _selected = getByName(c->name()); }
static C* getByName(std::string name) {
typename _map_t::iterator i = _map.find(name);
if (i == _map.end()) {
errno = ENOENT;
return NULL;
}
return i->second;
}
static bool Register(C* c) {
_map[c->name()] = c;
// this does not work ....
//std::pair<typename _map_t::iterator,bool> dev =
// _map.insert(_map_t::value_type(c->name(),c));
return true;
}
typedef C* (*Factory)();
};
#define DECLARE_PLUGIN(C) \
map<string,C*> Pluggable<C>::_map; \
C* Pluggable<C>::_selected = NULL;
//@TODO: write a plug-in registerer
#endif
|