diff options
author | Matthias Schiffer <matthias@gamezock.de> | 2009-09-24 21:50:11 +0200 |
---|---|---|
committer | Matthias Schiffer <matthias@gamezock.de> | 2009-09-24 21:50:11 +0200 |
commit | 9f962123be30da94add3f966bb46962f8bfdea88 (patch) | |
tree | ed1a210da3d5ba5d8d7d0807dd4e6ed4de4172f4 /src/Common/UserLists/UserList.h | |
parent | 1cf531a5949cad1f68575188cf00d147478e029c (diff) | |
download | mad-9f962123be30da94add3f966bb46962f8bfdea88.tar mad-9f962123be30da94add3f966bb46962f8bfdea88.zip |
UserList: Encapsulate list
Diffstat (limited to 'src/Common/UserLists/UserList.h')
-rw-r--r-- | src/Common/UserLists/UserList.h | 125 |
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() {} }; |