From aa7cc18468f4b16bf79cd1788cad0cbf0d926817 Mon Sep 17 00:00:00 2001 From: danieldg Date: Mon, 19 Oct 2009 20:12:12 +0000 Subject: Fix implementation of reference to const, use reference counting for ExtensibleItem git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11924 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/base.h | 17 +++++++++++------ include/extensible.h | 10 +++++----- 2 files changed, 16 insertions(+), 11 deletions(-) (limited to 'include') diff --git a/include/base.h b/include/base.h index 856cd64c2..13efdd2dd 100644 --- a/include/base.h +++ b/include/base.h @@ -76,7 +76,7 @@ class CoreExport interfacebase */ class CoreExport refcountbase { - unsigned int refcount; + mutable unsigned int refcount; public: refcountbase(); virtual ~refcountbase(); @@ -102,7 +102,7 @@ class reference : public reference_base public: reference() : value(0) { } reference(T* v) : value(v) { if (value) inc(value); } - reference(const reference& v) : value(v.value) { if (value) inc(value); } + reference(const reference& v) : value(v.value) { if (value) inc(value); } reference& operator=(const reference& other) { if (other.value) @@ -121,12 +121,17 @@ class reference : public reference_base delete value; } } - inline const T* operator->() const { return value; } - inline const T& operator*() const { return *value; } - inline T* operator->() { return value; } - inline T& operator*() { return *value; } inline operator bool() const { return value; } inline operator T*() const { return value; } + inline T* operator->() const { return value; } + inline T& operator*() const { return *value; } + inline bool operator<(const reference& other) const { return value < other.value; } + inline bool operator>(const reference& other) const { return value > other.value; } + inline bool operator==(const reference& other) const { return value == other.value; } + inline bool operator!=(const reference& other) const { return value != other.value; } + private: + void* operator new(size_t); + void operator delete(void*); }; /** This class can be used on its own to represent an exception, or derived to represent a module-specific exception. diff --git a/include/extensible.h b/include/extensible.h index 62edb8896..e77c1cc30 100644 --- a/include/extensible.h +++ b/include/extensible.h @@ -15,7 +15,7 @@ enum SerializeFormat /** Class represnting an extension of some object */ -class CoreExport ExtensionItem +class CoreExport ExtensionItem : public refcountbase { public: const std::string key; @@ -57,7 +57,7 @@ class CoreExport ExtensionItem class CoreExport Extensible : public classbase { public: - typedef std::map ExtensibleStore; + typedef std::map,void*> ExtensibleStore; // Friend access for the protected getter/setter friend class ExtensionItem; @@ -75,15 +75,15 @@ class CoreExport Extensible : public classbase Extensible(); virtual CullResult cull(); virtual ~Extensible(); - void doUnhookExtensions(const std::vector& toRemove); + void doUnhookExtensions(const std::vector >& toRemove); }; class CoreExport ExtensionManager { - std::map types; + std::map > types; public: void Register(ExtensionItem* item); - void BeginUnregister(Module* module, std::vector& list); + void BeginUnregister(Module* module, std::vector >& list); ExtensionItem* GetItem(const std::string& name); }; -- cgit v1.2.3