From a158d1f367759bf0c110b2fdb21d7c00f5a9cea6 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 30 Sep 2009 01:51:01 +0200 Subject: UserListDiff: Extended diffs to handle user renames; fixed a XmlData::List bug --- src/Common/UserLists/UserListDiff.h | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'src/Common/UserLists/UserListDiff.h') diff --git a/src/Common/UserLists/UserListDiff.h b/src/Common/UserLists/UserListDiff.h index 41b8e81..5000adf 100644 --- a/src/Common/UserLists/UserListDiff.h +++ b/src/Common/UserLists/UserListDiff.h @@ -25,6 +25,7 @@ #include "UserListEntry.h" #include +#include #include namespace Mad { @@ -34,14 +35,16 @@ namespace UserLists { class UserList; class MAD_COMMON_EXPORT UserListDiff { + public: + typedef boost::bimap, boost::bimaps::set_of > EntryListMap; + private: std::set addedUsers; std::set deletedUsers; - std::set unchangedUsers; + EntryListMap updatedUsers; public: UserListDiff() {} - UserListDiff(const UserList *oldList, const UserList *newList); void invert() { addedUsers.swap(deletedUsers); @@ -55,29 +58,35 @@ class MAD_COMMON_EXPORT UserListDiff { return deletedUsers; } - const std::set& getUnchangedUsers() const { - return unchangedUsers; + const EntryListMap& getUpdatedUsers() const { + return updatedUsers; } bool insertAddedUser(UserListEntry user) { - if(deletedUsers.count(user) || unchangedUsers.count(user)) + if(updatedUsers.right.count(user)) return false; return addedUsers.insert(user).second; } bool insertDeletedUser(UserListEntry user) { - if(addedUsers.count(user) || unchangedUsers.count(user)) + if(updatedUsers.left.count(user)) return false; return deletedUsers.insert(user).second; } - bool insertUnchangedUser(UserListEntry user) { - if(addedUsers.count(user) || deletedUsers.count(user)) + bool insertUpdatedUser(UserListEntry oldUser, UserListEntry newUser) { + if(deletedUsers.count(oldUser) || addedUsers.count(newUser)) + return false; + + // this won't allow exchanging two users, but that's ok for now... + if(updatedUsers.left.count(oldUser) || updatedUsers.right.count(newUser)) + return false; + if(updatedUsers.right.count(oldUser) || updatedUsers.left.count(newUser)) return false; - return unchangedUsers.insert(user).second; + return updatedUsers.left.insert(std::make_pair(oldUser, newUser)).second; } }; -- cgit v1.2.3