From 38b318a57f0a713eb2aa8407893eea142e57427e Mon Sep 17 00:00:00 2001 From: neoraider Date: Fri, 28 Sep 2007 21:41:00 +0000 Subject: zoomedit: IdManager implementiert. --- IdManager.cpp | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 IdManager.cpp (limited to 'IdManager.cpp') diff --git a/IdManager.cpp b/IdManager.cpp new file mode 100644 index 0000000..a610036 --- /dev/null +++ b/IdManager.cpp @@ -0,0 +1,57 @@ +#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::valid(const std::string &id) const { + if(id.empty()) return false; + if(id[0] >= '0' && id[0] <= '9') 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 { + if(!valid(id)) return false; + + return (usedIds.find(id) == usedIds.end()); +} + +std::string IdManager::generate(const std::string &prefix) { + if(!valid(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(); +} -- cgit v1.2.3