diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/dynref.h | 93 | ||||
-rw-r--r-- | include/inspircd.h | 1 | ||||
-rw-r--r-- | include/modules.h | 68 |
3 files changed, 94 insertions, 68 deletions
diff --git a/include/dynref.h b/include/dynref.h new file mode 100644 index 000000000..e605ab794 --- /dev/null +++ b/include/dynref.h @@ -0,0 +1,93 @@ +/* + * InspIRCd -- Internet Relay Chat Daemon + * + * Copyright (C) 2013 Attila Molnar <attilamolnar@hush.com> + * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org> + * + * This file is part of InspIRCd. InspIRCd is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + +#pragma once + +#include "base.h" + +class CoreExport dynamic_reference_base : public interfacebase +{ + private: + std::string name; + void resolve(); + protected: + ServiceProvider* value; + public: + ModuleRef creator; + dynamic_reference_base(Module* Creator, const std::string& Name); + ~dynamic_reference_base(); + inline const std::string& GetProvider() { return name; } + void SetProvider(const std::string& newname); + void check(); + operator bool() { return (value != NULL); } + static void reset_all(); +}; + +inline void dynamic_reference_base::check() +{ + if (!value) + throw ModuleException("Dynamic reference to '" + name + "' failed to resolve"); +} + +template<typename T> +class dynamic_reference : public dynamic_reference_base +{ + public: + dynamic_reference(Module* Creator, const std::string& Name) + : dynamic_reference_base(Creator, Name) {} + + inline T* operator->() + { + check(); + return static_cast<T*>(value); + } + + T* operator*() + { + return operator->(); + } +}; + +template<typename T> +class dynamic_reference_nocheck : public dynamic_reference_base +{ + public: + dynamic_reference_nocheck(Module* Creator, const std::string& Name) + : dynamic_reference_base(Creator, Name) {} + + T* operator->() + { + return static_cast<T*>(value); + } + + T* operator*() + { + return operator->(); + } +}; + +class ModeHandler; +class ModeReference : public dynamic_reference_nocheck<ModeHandler> +{ + public: + ModeReference(Module* mod, const std::string& modename) + : dynamic_reference_nocheck<ModeHandler>(mod, "mode/" + modename) {} +}; + diff --git a/include/inspircd.h b/include/inspircd.h index a634eb2c8..ccb91070e 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -49,6 +49,7 @@ CoreExport extern InspIRCd* ServerInstance; #include "config.h" +#include "dynref.h" #include "consolecolors.h" #include "caller.h" #include "cull_list.h" diff --git a/include/modules.h b/include/modules.h index 1a88a0389..8ef646a08 100644 --- a/include/modules.h +++ b/include/modules.h @@ -245,74 +245,6 @@ class CoreExport DataProvider : public ServiceProvider : ServiceProvider(Creator, Name, SERVICE_DATA) {} }; -class CoreExport dynamic_reference_base : public interfacebase -{ - private: - std::string name; - void resolve(); - protected: - ServiceProvider* value; - public: - ModuleRef creator; - dynamic_reference_base(Module* Creator, const std::string& Name); - ~dynamic_reference_base(); - inline const std::string& GetProvider() { return name; } - void SetProvider(const std::string& newname); - void check(); - operator bool() { return (value != NULL); } - static void reset_all(); -}; - -inline void dynamic_reference_base::check() -{ - if (!value) - throw ModuleException("Dynamic reference to '" + name + "' failed to resolve"); -} - -template<typename T> -class dynamic_reference : public dynamic_reference_base -{ - public: - dynamic_reference(Module* Creator, const std::string& Name) - : dynamic_reference_base(Creator, Name) {} - - inline T* operator->() - { - check(); - return static_cast<T*>(value); - } - - T* operator*() - { - return operator->(); - } -}; - -template<typename T> -class dynamic_reference_nocheck : public dynamic_reference_base -{ - public: - dynamic_reference_nocheck(Module* Creator, const std::string& Name) - : dynamic_reference_base(Creator, Name) {} - - T* operator->() - { - return static_cast<T*>(value); - } - - T* operator*() - { - return operator->(); - } -}; - -class ModeReference : public dynamic_reference_nocheck<ModeHandler> -{ - public: - ModeReference(Module* mod, const std::string& modename) - : dynamic_reference_nocheck<ModeHandler>(mod, "mode/" + modename) {} -}; - /** Priority types which can be used by Module::Prioritize() */ enum Priority { PRIORITY_FIRST, PRIORITY_LAST, PRIORITY_BEFORE, PRIORITY_AFTER }; |