From 0abccb029e55326f9de99563e38ed4c9a87eb4d1 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Mon, 5 Jan 2015 00:14:57 +0100 Subject: Each Managed object now has an unique id that can be used as weak reference. --- src/core/managed/Manager.cpp | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'src/core/managed/Manager.cpp') diff --git a/src/core/managed/Manager.cpp b/src/core/managed/Manager.cpp index 823dc88..d92bbb5 100644 --- a/src/core/managed/Manager.cpp +++ b/src/core/managed/Manager.cpp @@ -154,7 +154,9 @@ void Manager::manage(Managed *o) #ifdef MANAGER_DEBUG_PRINT std::cout << "manage " << o << std::endl; #endif - objects.emplace(std::make_pair(o, ObjectDescriptor{})); + objects.emplace(o, ObjectDescriptor{nextUid}); + uids.emplace(nextUid, o); + nextUid++; } void Manager::addRef(Managed *tar, Managed *src) @@ -257,7 +259,8 @@ void Manager::deleteObject(Managed *o, ObjectDescriptor *descr) deleteRef(descr->refOut.begin()->first, o, true); } - // Remove the data store and the event store entry + // Remove the uid, data and event store entry + uids.erase(descr->uid); store.erase(o); events.erase(o); @@ -370,6 +373,26 @@ void Manager::sweep() } } +/* Class Managed: Unique IDs */ + +ManagedUid Manager::getUid(Managed *o) +{ + const auto it = objects.find(o); + if (it != objects.end()) { + return it->second.uid; + } + return 0; +} + +Managed *Manager::getManaged(ManagedUid uid) +{ + const auto it = uids.find(uid); + if (it != uids.end()) { + return it->second; + } + return nullptr; +} + /* Class Manager: Attached data */ void Manager::storeData(Managed *ref, const std::string &key, Managed *data) -- cgit v1.2.3