summaryrefslogtreecommitdiff
path: root/include/services.h
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2011-08-25 16:21:21 -0400
committerAdam <Adam@anope.org>2011-09-10 01:58:38 -0400
commitf025d1b495cee3aadb6b7b45652d1cab3b7b7b6d (patch)
tree02df5a3f12104996af87d1b6c5ec9db9d45b6bde /include/services.h
parent8c4417cad180f3c5448c5b7509b1bf2235e3077e (diff)
Made service_reference type safe
Diffstat (limited to 'include/services.h')
-rw-r--r--include/services.h33
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"