summaryrefslogtreecommitdiffstats
path: root/src/Common/UserLists/UserListDiff.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common/UserLists/UserListDiff.h')
-rw-r--r--src/Common/UserLists/UserListDiff.h27
1 files changed, 18 insertions, 9 deletions
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 <Core/Exception.h>
+#include <boost/bimap.hpp>
#include <set>
namespace Mad {
@@ -34,14 +35,16 @@ namespace UserLists {
class UserList;
class MAD_COMMON_EXPORT UserListDiff {
+ public:
+ typedef boost::bimap<boost::bimaps::set_of<UserListEntry>, boost::bimaps::set_of<UserListEntry> > EntryListMap;
+
private:
std::set<UserListEntry> addedUsers;
std::set<UserListEntry> deletedUsers;
- std::set<UserListEntry> 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<UserListEntry>& 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;
}
};