summaryrefslogtreecommitdiffstats
path: root/src/Common/UserLists/UserList.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common/UserLists/UserList.h')
-rw-r--r--src/Common/UserLists/UserList.h125
1 files changed, 124 insertions, 1 deletions
diff --git a/src/Common/UserLists/UserList.h b/src/Common/UserLists/UserList.h
index e80abaf..9c5985d 100644
--- a/src/Common/UserLists/UserList.h
+++ b/src/Common/UserLists/UserList.h
@@ -20,16 +20,139 @@
#ifndef MAD_COMMON_USERLISTS_USERLIST_H_
#define MAD_COMMON_USERLISTS_USERLIST_H_
+#include "../export.h"
+
#include "UserListEntry.h"
#include <list>
+#include <map>
+#include <set>
namespace Mad {
namespace Common {
namespace UserLists {
-class UserList : public std::list<UserListEntry> {
+class MAD_COMMON_EXPORT UserList {
+ private:
+ template <typename Type, typename IteratorType>
+ class iterator_base {
+ public:
+ friend class UserList;
+
+ typedef Type value_type;
+
+ typedef value_type &reference;
+ typedef value_type *pointer;
+
+ typedef long difference_type;
+
+ private:
+ IteratorType it;
+
+ iterator_base(IteratorType it0) : it(it0) {}
+
+ public:
+ iterator_base() {}
+
+ reference operator*() const {
+ return *it;
+ }
+
+ iterator_base operator++(int) {
+ return iterator(it++);
+ }
+
+ iterator_base& operator++() {
+ ++it;
+ return *this;
+ }
+
+ iterator_base operator--(int) {
+ return iterator(it--);
+ }
+
+ iterator_base& operator--() {
+ --it;
+ return *this;
+ }
+
+ bool operator==(const iterator_base &it2) {
+ return it2.it == it;
+ }
+
+ bool operator!=(const iterator_base &it2) {
+ return it2.it != it;
+ }
+
+ pointer operator->() const {
+ return &*it;
+ }
+ };
+
+ std::set<std::string> names;
+ std::list<UserListEntry> list;
+
+ std::map<std::string, unsigned> detailCounts;
+
+ void registerEntry(const UserListEntry &entry);
+ void unregisterEntry(const UserListEntry &entry);
+
+ std::list<UserListEntry>::iterator findEntry(const std::string &name);
+ std::list<UserListEntry>::const_iterator findEntry(const std::string &name) const;
+
public:
+ typedef iterator_base<const UserListEntry, std::list<UserListEntry>::iterator> iterator;
+ typedef iterator_base<const UserListEntry, std::list<UserListEntry>::const_iterator> const_iterator;
+
+ iterator find(const std::string &name);
+ const_iterator find(const std::string &name) const;
+
+ iterator begin() {
+ return iterator(list.begin());
+ }
+
+ const_iterator begin() const {
+ return const_iterator(list.begin());
+ }
+
+ iterator end() {
+ return list.end();
+ }
+
+ const_iterator end() const {
+ return const_iterator(list.end());
+ }
+
+ bool isEmpty() const {
+ return list.empty();
+ }
+
+ size_t getLength() const {
+ return list.size();
+ }
+
+ std::set<std::string> getDetails() const {
+ std::set<std::string> ret;
+
+ for(std::map<std::string, unsigned>::const_iterator it = detailCounts.begin(); it != detailCounts.end(); ++it)
+ ret.insert(it->first);
+
+ return ret;
+ }
+
+ unsigned getDetailUsage(const std::string &detail) const {
+ std::map<std::string, unsigned>::const_iterator it = detailCounts.find(detail);
+ if(it == detailCounts.end())
+ return 0;
+ else
+ return it->second;
+ }
+
+ bool addUser(const UserListEntry &entry);
+ bool insertUser(const UserListEntry &entry, iterator after);
+ bool removeUser(const std::string &name);
+ bool updateUser(const UserListEntry &entry);
+
UserList() {}
};