diff options
author | Kevin Smith <git@kismith.co.uk> | 2010-04-18 18:03:21 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2010-04-18 18:03:21 (GMT) |
commit | 427f6b307aa35fc921aa8d8538b8c653219bb065 (patch) | |
tree | bc195c8f2fef00401d934bedc4605105abaf6544 /Swiften/Roster/Roster.cpp | |
parent | b63315fa2b1a6f571dc0fa09a9d5ec0c6392372f (diff) | |
download | swift-contrib-427f6b307aa35fc921aa8d8538b8c653219bb065.zip swift-contrib-427f6b307aa35fc921aa8d8538b8c653219bb065.tar.bz2 |
Improve roster performance through map lookups on operations
Diffstat (limited to 'Swiften/Roster/Roster.cpp')
-rw-r--r-- | Swiften/Roster/Roster.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/Swiften/Roster/Roster.cpp b/Swiften/Roster/Roster.cpp index e6640e2..8c2aa0e 100644 --- a/Swiften/Roster/Roster.cpp +++ b/Swiften/Roster/Roster.cpp @@ -56,12 +56,14 @@ void Roster::handleUserAction(boost::shared_ptr<UserRosterAction> action) { void Roster::addContact(const JID& jid, const String& name, const String& group) { ContactRosterItem *item = new ContactRosterItem(jid, name, getGroup(group), widgetFactory_); items_.push_back(item); + itemMap_[jid.toBare()].push_back(item); item->onUserAction.connect(boost::bind(&Roster::handleUserAction, this, _1)); filterItem(item); } void Roster::removeContact(const JID& jid) { + itemMap_.erase(jid.toBare()); std::vector<RosterItem*>::iterator it = children_.begin(); while (it != children_.end()) { ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(*it); @@ -91,6 +93,21 @@ void Roster::removeContactFromGroup(const JID& jid, const String& groupName) { void Roster::applyOnItems(const RosterItemOperation& operation) { + if (operation.requiresLookup()) { + applyOnItem(operation, operation.lookupJID()); + } else { + applyOnAllItems(operation); + } +} + +void Roster::applyOnItem(const RosterItemOperation& operation, const JID& jid) { + foreach (RosterItem* item, itemMap_[jid]) { + operation(item); + filterItem(item); + } +} + +void Roster::applyOnAllItems(const RosterItemOperation& operation) { std::deque<RosterItem*> queue(children_.begin(), children_.end()); while (!queue.empty()) { RosterItem* item = *queue.begin(); |