summaryrefslogtreecommitdiffstats
path: root/src/Common/UserLists/UserList.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common/UserLists/UserList.cpp')
-rw-r--r--src/Common/UserLists/UserList.cpp129
1 files changed, 129 insertions, 0 deletions
diff --git a/src/Common/UserLists/UserList.cpp b/src/Common/UserLists/UserList.cpp
new file mode 100644
index 0000000..a14111d
--- /dev/null
+++ b/src/Common/UserLists/UserList.cpp
@@ -0,0 +1,129 @@
+/*
+ * UserList.cpp
+ *
+ * Copyright (C) 2009 Matthias Schiffer <matthias@gamezock.de>
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "UserList.h"
+
+namespace Mad {
+namespace Common {
+namespace UserLists {
+
+std::list<UserListEntry>::iterator UserList::findEntry(const std::string &name) {
+ for(std::list<UserListEntry>::iterator it = list.begin(); it != list.end(); ++it) {
+ if(it->getName() == name) {
+ return it;
+ }
+ }
+
+ return list.end();
+}
+
+std::list<UserListEntry>::const_iterator UserList::findEntry(const std::string &name) const {
+ for(std::list<UserListEntry>::const_iterator it = list.begin(); it != list.end(); ++it) {
+ if(it->getName() == name) {
+ return it;
+ }
+ }
+
+ return list.end();
+}
+
+UserList::iterator UserList::find(const std::string &name) {
+ if(!names.count(name))
+ return end();
+
+ return iterator(findEntry(name));
+}
+
+UserList::const_iterator UserList::find(const std::string &name) const {
+ if(!names.count(name))
+ return end();
+
+ return const_iterator(findEntry(name));
+}
+
+void UserList::registerEntry(const UserListEntry &entry) {
+ std::set<std::string> details = entry.getDetailList();
+
+ for(std::set<std::string>::iterator detail = details.begin(); detail != details.end(); ++detail) {
+ std::map<std::string, unsigned>::iterator it = detailCounts.find(*detail);
+ if(it == detailCounts.end())
+ detailCounts.insert(make_pair(*detail, 1));
+ else
+ ++it->second;
+ }
+}
+
+void UserList::unregisterEntry(const UserListEntry &entry) {
+ std::set<std::string> details = entry.getDetailList();
+
+ for(std::set<std::string>::iterator detail = details.begin(); detail != details.end(); ++detail) {
+ std::map<std::string, unsigned>::iterator it = detailCounts.find(*detail);
+ // TODO Assert
+ if(it == detailCounts.end())
+ continue;
+
+ if(it->second > 1)
+ --it->second;
+ else
+ detailCounts.erase(it);
+ }
+}
+
+
+bool UserList::addUser(const UserListEntry &entry) {
+ return insertUser(entry, end());
+}
+
+bool UserList::insertUser(const UserListEntry &entry, iterator after) {
+ if(!names.insert(entry.getName()).second)
+ return false;
+
+ list.insert(after.it, entry);
+ registerEntry(entry);
+ return true;
+}
+
+bool UserList::removeUser(const std::string &name) {
+ if(!names.erase(name))
+ return false;
+
+ std::list<UserListEntry>::iterator it = findEntry(name);
+ // TODO Assert
+
+ unregisterEntry(*it);
+ list.erase(it);
+ return true;
+}
+
+bool UserList::updateUser(const UserListEntry &entry) {
+ if(!names.count(entry.getName()))
+ return false;
+
+ std::list<UserListEntry>::iterator it = findEntry(entry.getName());
+ // TODO Assert
+
+ unregisterEntry(*it);
+ *it = entry;
+ registerEntry(entry);
+ return true;
+}
+
+}
+}
+}