X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fbase.cpp;h=2e2dbfb287d365c78e3022e8c5c5089dca02884d;hb=9db7af579c46a9f0379fdf71fb773a0a76a94846;hp=76e469482d56759798f86860b02653691d9a2d32;hpb=d5e36aa2b2ca26fe689ae9e29c74b3565dd018c7;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/base.cpp b/src/base.cpp index 76e469482..2e2dbfb28 100644 --- a/src/base.cpp +++ b/src/base.cpp @@ -18,73 +18,29 @@ #include #include "inspircd.h" -const int bitfields[] = {1,2,4,8,16,32,64,128}; -const int inverted_bitfields[] = {~1,~2,~4,~8,~16,~32,~64,~128}; -std::map Extensible::extension_types; - classbase::classbase() { } -void classbase::cull() +CullResult classbase::cull() { + return CullResult(); } classbase::~classbase() { } -void BoolSet::Set(int number) +CullResult::CullResult() { - this->bits |= bitfields[number]; } -void BoolSet::Unset(int number) +refcountbase::refcountbase() : refcount(0) { - this->bits &= inverted_bitfields[number]; } -void BoolSet::Invert(int number) +refcountbase::~refcountbase() { - this->bits ^= bitfields[number]; -} - -bool BoolSet::Get(int number) -{ - return ((this->bits | bitfields[number]) > 0); -} - -bool BoolSet::operator==(BoolSet other) -{ - return (this->bits == other.bits); -} - -BoolSet BoolSet::operator|(BoolSet other) -{ - BoolSet x(this->bits | other.bits); - return x; -} - -BoolSet BoolSet::operator&(BoolSet other) -{ - BoolSet x(this->bits & other.bits); - return x; -} - -BoolSet::BoolSet() -{ - this->bits = 0; -} - -BoolSet::BoolSet(char bitmask) -{ - this->bits = bitmask; -} - -bool BoolSet::operator=(BoolSet other) -{ - this->bits = other.bits; - return true; } ExtensionItem::ExtensionItem(const std::string& Key, Module* mod) : key(Key), owner(mod) @@ -95,9 +51,10 @@ ExtensionItem::~ExtensionItem() { } -void* ExtensionItem::get_raw(const Extensible* container) +void* ExtensionItem::get_raw(const Extensible* container) const { - ExtensibleStore::const_iterator i = container->extensions.find(key); + Extensible::ExtensibleStore::const_iterator i = + container->extensions.find(const_cast(this)); if (i == container->extensions.end()) return NULL; return i->second; @@ -105,8 +62,8 @@ void* ExtensionItem::get_raw(const Extensible* container) void* ExtensionItem::set_raw(Extensible* container, void* value) { - std::pair rv = - container->extensions.insert(std::make_pair(key, value)); + std::pair rv = + container->extensions.insert(std::make_pair(this, value)); if (rv.second) { return NULL; @@ -121,7 +78,7 @@ void* ExtensionItem::set_raw(Extensible* container, void* value) void* ExtensionItem::unset_raw(Extensible* container) { - ExtensibleStore::iterator i = container->extensions.find(key); + Extensible::ExtensibleStore::iterator i = container->extensions.find(this); if (i == container->extensions.end()) return NULL; void* rv = i->second; @@ -129,50 +86,59 @@ void* ExtensionItem::unset_raw(Extensible* container) return rv; } -bool Extensible::Register(ExtensionItem* item) +void ExtensionManager::Register(ExtensionItem* item) { - return Extensible::extension_types.insert(std::make_pair(item->key, item)).second; + types.insert(std::make_pair(item->key, item)); } -std::vector Extensible::BeginUnregister(Module* module) +void ExtensionManager::BeginUnregister(Module* module, std::vector& list) { - std::vector rv; - ExtensibleTypes::iterator i = extension_types.begin(); - while (i != extension_types.end()) + std::map::iterator i = types.begin(); + while (i != types.end()) { - ExtensibleTypes::iterator c = i++; - if (c->second->owner == module) + std::map::iterator me = i++; + ExtensionItem* item = me->second; + if (item->owner == module) { - rv.push_back(c->second); - extension_types.erase(c); + list.push_back(item); + types.erase(me); } } - return rv; +} + +ExtensionItem* ExtensionManager::GetItem(const std::string& name) +{ + std::map::iterator i = types.find(name); + if (i == types.end()) + return NULL; + return i->second; } void Extensible::doUnhookExtensions(const std::vector& toRemove) { - for(std::vector::const_iterator i = toRemove.begin(); i != toRemove.end(); i++) + for(std::vector::const_iterator i = toRemove.begin(); i != toRemove.end(); ++i) { - ExtensibleStore::iterator e = extensions.find((**i).key); + ExtensionItem* item = *i; + ExtensibleStore::iterator e = extensions.find(item); if (e != extensions.end()) { - (**i).free(e->second); + item->free(e->second); extensions.erase(e); } } } -Extensible::~Extensible() +CullResult Extensible::cull() { for(ExtensibleStore::iterator i = extensions.begin(); i != extensions.end(); ++i) { - ExtensionItem* type = GetItem(i->first); - if (type) - type->free(i->second); - else if (ServerInstance && ServerInstance->Logs) - ServerInstance->Logs->Log("BASE", ERROR, "Extension type %s is not registered", i->first.c_str()); + i->first->free(i->second); } + return classbase::cull(); +} + +Extensible::~Extensible() +{ } LocalExtItem::LocalExtItem(const std::string& Key, Module* mod) : ExtensionItem(Key, mod) @@ -183,7 +149,7 @@ LocalExtItem::~LocalExtItem() { } -std::string LocalExtItem::serialize(SerializeFormat format, const Extensible* container, void* item) +std::string LocalExtItem::serialize(SerializeFormat format, const Extensible* container, void* item) const { return ""; } @@ -199,7 +165,7 @@ LocalStringExt::~LocalStringExt() { } -std::string LocalStringExt::serialize(SerializeFormat format, const Extensible* container, void* item) +std::string LocalStringExt::serialize(SerializeFormat format, const Extensible* container, void* item) const { if (item && format == FORMAT_USER) return *static_cast(item); @@ -214,14 +180,14 @@ LocalIntExt::~LocalIntExt() { } -std::string LocalIntExt::serialize(SerializeFormat format, const Extensible* container, void* item) +std::string LocalIntExt::serialize(SerializeFormat format, const Extensible* container, void* item) const { if (format != FORMAT_USER) return ""; return ConvToStr(reinterpret_cast(item)); } -intptr_t LocalIntExt::get(const Extensible* container) +intptr_t LocalIntExt::get(const Extensible* container) const { return reinterpret_cast(get_raw(container)); } @@ -246,12 +212,12 @@ StringExtItem::~StringExtItem() { } -std::string* StringExtItem::get(const Extensible* container) +std::string* StringExtItem::get(const Extensible* container) const { return static_cast(get_raw(container)); } -std::string StringExtItem::serialize(SerializeFormat format, const Extensible* container, void* item) +std::string StringExtItem::serialize(SerializeFormat format, const Extensible* container, void* item) const { return item ? *static_cast(item) : ""; }