*/
class CoreExport refcountbase
{
- unsigned int refcount;
+ mutable unsigned int refcount;
public:
refcountbase();
virtual ~refcountbase();
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<T>& v) : value(v.value) { if (value) inc(value); }
reference<T>& operator=(const reference<T>& other)
{
if (other.value)
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<T>& other) const { return value < other.value; }
+ inline bool operator>(const reference<T>& other) const { return value > other.value; }
+ inline bool operator==(const reference<T>& other) const { return value == other.value; }
+ inline bool operator!=(const reference<T>& 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.
/** Class represnting an extension of some object
*/
-class CoreExport ExtensionItem
+class CoreExport ExtensionItem : public refcountbase
{
public:
const std::string key;
class CoreExport Extensible : public classbase
{
public:
- typedef std::map<ExtensionItem*,void*> ExtensibleStore;
+ typedef std::map<reference<ExtensionItem>,void*> ExtensibleStore;
// Friend access for the protected getter/setter
friend class ExtensionItem;
Extensible();
virtual CullResult cull();
virtual ~Extensible();
- void doUnhookExtensions(const std::vector<ExtensionItem*>& toRemove);
+ void doUnhookExtensions(const std::vector<reference<ExtensionItem> >& toRemove);
};
class CoreExport ExtensionManager
{
- std::map<std::string, ExtensionItem*> types;
+ std::map<std::string, reference<ExtensionItem> > types;
public:
void Register(ExtensionItem* item);
- void BeginUnregister(Module* module, std::vector<ExtensionItem*>& list);
+ void BeginUnregister(Module* module, std::vector<reference<ExtensionItem> >& list);
ExtensionItem* GetItem(const std::string& name);
};
refcountbase::~refcountbase()
{
+ if (refcount && ServerInstance && ServerInstance->Logs)
+ ServerInstance->Logs->Log("CULLLIST", DEBUG, "refcountbase::~ @%p with refcount %d",
+ (void*)this, refcount);
}
ExtensionItem::ExtensionItem(const std::string& Key, Module* mod) : key(Key), owner(mod)
types.insert(std::make_pair(item->key, item));
}
-void ExtensionManager::BeginUnregister(Module* module, std::vector<ExtensionItem*>& list)
+void ExtensionManager::BeginUnregister(Module* module, std::vector<reference<ExtensionItem> >& list)
{
- std::map<std::string, ExtensionItem*>::iterator i = types.begin();
+ std::map<std::string, reference<ExtensionItem> >::iterator i = types.begin();
while (i != types.end())
{
- std::map<std::string, ExtensionItem*>::iterator me = i++;
+ std::map<std::string, reference<ExtensionItem> >::iterator me = i++;
ExtensionItem* item = me->second;
if (item->owner == module)
{
ExtensionItem* ExtensionManager::GetItem(const std::string& name)
{
- std::map<std::string, ExtensionItem*>::iterator i = types.find(name);
+ std::map<std::string, reference<ExtensionItem> >::iterator i = types.find(name);
if (i == types.end())
return NULL;
return i->second;
}
-void Extensible::doUnhookExtensions(const std::vector<ExtensionItem*>& toRemove)
+void Extensible::doUnhookExtensions(const std::vector<reference<ExtensionItem> >& toRemove)
{
- for(std::vector<ExtensionItem*>::const_iterator i = toRemove.begin(); i != toRemove.end(); ++i)
+ for(std::vector<reference<ExtensionItem> >::const_iterator i = toRemove.begin(); i != toRemove.end(); ++i)
{
ExtensionItem* item = *i;
ExtensibleStore::iterator e = extensions.find(item);
user->WriteNumeric(RPL_INFO, "%s : Thomas Stagner, aquanight, <aquanight@inspircd.org>", user->nick.c_str());
user->WriteNumeric(RPL_INFO, "%s : Uli Schlachter, psychon, <psychon@inspircd.org>", user->nick.c_str());
user->WriteNumeric(RPL_INFO, "%s : Matt Smith, dz, <dz@inspircd.org>", user->nick.c_str());
- user->WriteNumeric(RPL_INFO, "%s : Daniel De Graaf danieldg, <danieldg@inspircd.org>", user->nick.c_str());
+ user->WriteNumeric(RPL_INFO, "%s : Daniel De Graaf, danieldg, <danieldg@inspircd.org>", user->nick.c_str());
user->WriteNumeric(RPL_INFO, "%s : ", user->nick.c_str());
user->WriteNumeric(RPL_INFO, "%s :\2Regular Contributors\2:", user->nick.c_str());
user->WriteNumeric(RPL_INFO, "%s : Majic MacGyver Namegduf Ankit", user->nick.c_str());
if (user->HasPrivPermission("servers/auspex"))
{
- std::string flags("SvscC");
+ std::string flags("SvcC");
int pos = 0;
for (int mult = 1; mult <= VF_OPTCOMMON; mult *= 2, ++pos)
if (!(V.Flags & mult))
{
std::map<std::string, Module*>::iterator modfind = Modules.find(mod->ModuleSourceFile);
- std::vector<ExtensionItem*> items;
+ std::vector<reference<ExtensionItem> > items;
ServerInstance->Extensions.BeginUnregister(modfind->second, items);
/* Give the module a chance to tidy out all its metadata */
for (chan_hash::iterator c = ServerInstance->chanlist->begin(); c != ServerInstance->chanlist->end(); c++)