summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Smith <git@kismith.co.uk>2010-04-18 18:03:21 (GMT)
committerKevin Smith <git@kismith.co.uk>2010-04-18 18:03:21 (GMT)
commit427f6b307aa35fc921aa8d8538b8c653219bb065 (patch)
treebc195c8f2fef00401d934bedc4605105abaf6544 /Swiften/Roster/Roster.cpp
parentb63315fa2b1a6f571dc0fa09a9d5ec0c6392372f (diff)
downloadswift-427f6b307aa35fc921aa8d8538b8c653219bb065.zip
swift-427f6b307aa35fc921aa8d8538b8c653219bb065.tar.bz2
Improve roster performance through map lookups on operations
Diffstat (limited to 'Swiften/Roster/Roster.cpp')
-rw-r--r--Swiften/Roster/Roster.cpp17
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();