From: Gonzalo A. <ga...@us...> - 2006-09-08 14:27:51
|
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 |