diff options
| author | Adam <Adam@anope.org> | 2011-08-25 16:21:21 -0400 |
|---|---|---|
| committer | Adam <Adam@anope.org> | 2011-09-10 01:58:38 -0400 |
| commit | f025d1b495cee3aadb6b7b45652d1cab3b7b7b6d (patch) | |
| tree | 02df5a3f12104996af87d1b6c5ec9db9d45b6bde /include/services.h | |
| parent | 8c4417cad180f3c5448c5b7509b1bf2235e3077e (diff) | |
Made service_reference type safe
Diffstat (limited to 'include/services.h')
| -rw-r--r-- | include/services.h | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/include/services.h b/include/services.h index 9719ab13e..d6db4e9ed 100644 --- a/include/services.h +++ b/include/services.h @@ -347,17 +347,42 @@ template<typename T, size_t Size = 32> class Flags class Module; -class CoreExport Service : public Base +template<typename T> class CoreExport Service : public Base { + static Anope::map<T *> services; public: + static T* FindService(const Anope::string &n) + { + typename Anope::map<T *>::iterator it = Service<T>::services.find(n); + if (it != Service<T>::services.end()) + return it->second; + return NULL; + } + + static std::vector<Anope::string> GetServiceKeys() + { + std::vector<Anope::string> keys; + for (typename Anope::map<T *>::iterator it = Service<T>::services.begin(), it_end = Service<T>::services.end(); it != it_end; ++it) + keys.push_back(it->first); + return keys; + } + Module *owner; Anope::string name; - Service(Module *o, const Anope::string &n); + Service(Module *o, const Anope::string &n) : owner(o), name(n) + { + if (Service<T>::services.find(n) != Service<T>::services.end()) + throw ModuleException("Service with name " + n + " already exists"); + Service<T>::services[n] = static_cast<T *>(this); + } - virtual ~Service(); + virtual ~Service() + { + Service<T>::services.erase(this->name); + } }; - +template<typename T> Anope::map<T *> Service<T>::services; #include "sockets.h" #include "socketengine.h" |
