#include "instanceStore.h" #include #include template const StoreType & InstanceStore::GetAll() { return *getInstances(); } template void InstanceStore::Add(const typename StoreType::value_type & p) { getInstances()->insert(p); } template void InstanceStore::prune() { auto & ps = getInstances(); if (ps->empty()) { delete ps; ps = NULL; } } template StoreType * & InstanceStore::getInstances() { static StoreType * instances = NULL; if (!instances) { instances = new StoreType(); } return instances; } template void InstanceMap::Add(const KeyType & k, Type * p) { BOOST_ASSERT(IStore::getInstances()->find(k) == IStore::getInstances()->end()); IStore::Add(Value(k, boost::shared_ptr(p))); } template void InstanceMap::Add(const KeyType & k, const boost::shared_ptr & p) { BOOST_ASSERT(IStore::getInstances()->find(k) == IStore::getInstances()->end()); IStore::Add(Value(k, p)); } template void InstanceMap::Remove(const KeyType & k) { IStore::getInstances()->erase(k); IStore::prune(); } template void InstanceMap::OnEach(const boost::function & func) { BOOST_FOREACH(const auto & l, IStore::GetAll()) { func(l); } IStore::prune(); } template void InstanceSet::OnAll(const boost::function & func) { BOOST_FOREACH(const auto & l, IStore::GetAll()) { func(l.get()); } IStore::prune(); } template void InstanceSet::Remove(const boost::shared_ptr & p) { IStore::getInstances()->erase(p); IStore::prune(); } #define INSTANTIATESTORE(K, T) \ template class InstanceStore>>; \ template class InstanceMap; \ template class InstanceStore>>; \ template class InstanceSet