#include "IdManager.h" #include bool IdManager::add(const std::string &id) { if(!valid(id)) return false; return usedIds.insert(id).second; } bool IdManager::remove(const std::string &id) { return (usedIds.erase(id) > 0); } bool IdManager::isValid(const std::string &id) const { if(id.empty()) return false; if(id[0] >= '0' && id[0] <= '9') return false; if(id.size() >= 3) { if(std::tolower(id[0]) == 'x' && std::tolower(id[1]) == 'm' && std::tolower(id[2]) == 'l') return false; } for(std::string::const_iterator c = id.begin(); c != id.end(); c++) { if(!(*c >= '0' && *c <= '9') && !(*c >= 'A' && *c <= 'Z') && !(*c >= 'a' && *c <= 'z') && *c != '_' && *c != '-' && *c != '.') return false; } return true; } bool IdManager::unique(const std::string &id) const { return (usedIds.find(id) == usedIds.end()); } bool IdManager::valid(const std::string &id) const { return isValid(id) && unique(id); } std::string IdManager::generate(const std::string &prefix) { if(!isValid(prefix)) return std::string(); unsigned long n = 0; std::map::iterator it = prefixMap.find(prefix); if(it != prefixMap.end()) { n = it->second + 1; prefixMap.erase(it); } std::ostringstream id; do { id.str(std::string()); id << prefix << n++; } while(!unique(id.str())); prefixMap.insert(std::make_pair(prefix, n-1)); usedIds.insert(id.str()); return id.str(); }