/* * UserList.cpp * * Copyright (C) 2009 Matthias Schiffer * * 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 . */ #include "UserList.h" namespace Mad { namespace Common { namespace UserLists { std::list::iterator UserList::findEntry(const std::string &name) { for(std::list::iterator it = list.begin(); it != list.end(); ++it) { if(it->getName() == name) { return it; } } return list.end(); } std::list::const_iterator UserList::findEntry(const std::string &name) const { for(std::list::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 details = entry.getDetailList(); for(std::set::iterator detail = details.begin(); detail != details.end(); ++detail) { std::map::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 details = entry.getDetailList(); for(std::set::iterator detail = details.begin(); detail != details.end(); ++detail) { std::map::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::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::iterator it = findEntry(entry.getName()); // TODO Assert unregisterEntry(*it); *it = entry; registerEntry(entry); return true; } } } }