diff options
Diffstat (limited to 'src/extensible.cpp')
-rw-r--r-- | src/extensible.cpp | 101 |
1 files changed, 34 insertions, 67 deletions
diff --git a/src/extensible.cpp b/src/extensible.cpp index 25fa7938c..9284bdbf2 100644 --- a/src/extensible.cpp +++ b/src/extensible.cpp @@ -10,96 +10,63 @@ #include "extensible.h" -Extensible::Extensible() : extension_items(NULL) -{ -} +static std::set<ExtensibleBase *> extensible_items; -Extensible::~Extensible() +ExtensibleBase::ExtensibleBase(Module *m, const Anope::string &n) : Service(m, "Extensible", n) { - if (extension_items) - { - for (extensible_map::iterator it = extension_items->begin(), it_end = extension_items->end(); it != it_end; ++it) - delete it->second; - delete extension_items; - } + extensible_items.insert(this); } -void Extensible::Extend(const Anope::string &key, ExtensibleItem *p) +ExtensibleBase::~ExtensibleBase() { - this->Shrink(key); - if (!extension_items) - extension_items = new extensible_map(); - (*this->extension_items)[key] = p; + extensible_items.erase(this); } -void Extensible::ExtendMetadata(const Anope::string &key, const Anope::string &value) +Extensible::~Extensible() { - this->Extend(key, new ExtensibleMetadata(!value.empty() ? value : "1")); + for (std::set<ExtensibleBase *>::iterator it = extension_items.begin(); it != extension_items.end(); ++it) + (*it)->Unset(this); } -bool Extensible::Shrink(const Anope::string &key) +bool Extensible::HasExt(const Anope::string &name) const { - if (!extension_items) - return false; - - extensible_map::iterator it = this->extension_items->find(key); - if (it != this->extension_items->end()) - { - delete it->second; - /* map::size_type map::erase( const key_type& key ); - * returns the number of elements removed, std::map - * is single-associative so this should only be 0 or 1 - */ - return this->extension_items->erase(key) > 0; - } + ExtensibleRef<void *> ref(name); + if (ref) + return ref->HasExt(this); + Log(LOG_DEBUG) << "HasExt for nonexistent type " << name << " on " << static_cast<const void *>(this); return false; } -bool Extensible::HasExt(const Anope::string &key) const +void Extensible::ExtensibleSerialize(const Extensible *e, const Serializable *s, Serialize::Data &data) { - return this->extension_items != NULL && this->extension_items->count(key) > 0; + for (std::set<ExtensibleBase *>::iterator it = e->extension_items.begin(); it != e->extension_items.end(); ++it) + { + ExtensibleBase *eb = *it; + eb->ExtensibleSerialize(e, s, data); + } } -void Extensible::GetExtList(std::deque<Anope::string> &list) const +void Extensible::ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) { - if (extension_items) - for (extensible_map::const_iterator it = extension_items->begin(), it_end = extension_items->end(); it != it_end; ++it) - list.push_back(it->first); -} + while (!e->extension_items.empty()) + (*e->extension_items.begin())->Unset(e); -void Extensible::ExtensibleSerialize(Serialize::Data &data) const -{ - if (extension_items) - for (extensible_map::const_iterator it = extension_items->begin(), it_end = extension_items->end(); it != it_end; ++it) - if (it->second && it->second->Serialize()) - data["extensible:" + it->first] << *it->second->Serialize(); -} - -void Extensible::ExtensibleUnserialize(Serialize::Data &data) -{ - /* Shrink existing extensible metadata items */ - std::deque<Anope::string> list; - this->GetExtList(list); - for (unsigned i = 0; i < list.size(); ++i) + for (std::set<ExtensibleBase *>::iterator it = extensible_items.begin(); it != extensible_items.end(); ++it) { - ExtensibleItem *item = extension_items->at(list[i]); - if (item && item->Serialize()) - this->Shrink(list[i]); + ExtensibleBase *eb = *it; + eb->ExtensibleUnserialize(e, s, data); } - - std::set<Anope::string> keys = data.KeySet(); - for (std::set<Anope::string>::iterator it = keys.begin(), it_end = keys.end(); it != it_end; ++it) - if (it->find("extensible:") == 0) - { - if (!extension_items) - extension_items = new extensible_map(); +} - Anope::string str; - data[*it] >> str; +template<> +bool* Extensible::Extend(const Anope::string &name, const bool &what) +{ + ExtensibleRef<bool> ref(name); + if (ref) + return ref->Set(this); - if (!str.empty()) - this->ExtendMetadata(it->substr(11), str); - } + Log(LOG_DEBUG) << "Shrink for nonexistant type " << name << " on " << static_cast<void *>(this); + return NULL; } |