"plugins/amoeba/openmmapi/vscode:/vscode.git/clone" did not exist on "887d4e18d12a51eba894f335c0da53c543d1b802"
Commit b3ee3b69 authored by Peter Eastman's avatar Peter Eastman
Browse files

Eliminated the potential for initialization order problems

parent 00874c4a
...@@ -103,8 +103,8 @@ public: ...@@ -103,8 +103,8 @@ public:
static const SerializationProxy& getProxy(const std::type_info& type); static const SerializationProxy& getProxy(const std::type_info& type);
private: private:
std::string typeName; std::string typeName;
static std::map<const std::string, const SerializationProxy*> proxiesByType; static std::map<const std::string, const SerializationProxy*>& getProxiesByType();
static std::map<const std::string, const SerializationProxy*> proxiesByName; static std::map<const std::string, const SerializationProxy*>& getProxiesByName();
}; };
} // namespace OpenMM } // namespace OpenMM
......
...@@ -36,8 +36,15 @@ ...@@ -36,8 +36,15 @@
using namespace OpenMM; using namespace OpenMM;
using namespace std; using namespace std;
map<const string, const SerializationProxy*> SerializationProxy::proxiesByType; map<const string, const SerializationProxy*>& SerializationProxy::getProxiesByType() {
map<const string, const SerializationProxy*> SerializationProxy::proxiesByName; static map<const string, const SerializationProxy*> proxies;
return proxies;
}
map<const string, const SerializationProxy*>& SerializationProxy::getProxiesByName() {
static map<const string, const SerializationProxy*> proxies;
return proxies;
}
SerializationProxy::SerializationProxy(const string& typeName) : typeName(typeName) { SerializationProxy::SerializationProxy(const string& typeName) : typeName(typeName) {
} }
...@@ -47,20 +54,20 @@ const string& SerializationProxy::getTypeName() const { ...@@ -47,20 +54,20 @@ const string& SerializationProxy::getTypeName() const {
} }
void SerializationProxy::registerProxy(const type_info& type, const SerializationProxy* proxy) { void SerializationProxy::registerProxy(const type_info& type, const SerializationProxy* proxy) {
proxiesByType[type.name()] = proxy; getProxiesByType()[type.name()] = proxy;
proxiesByName[proxy->getTypeName()] = proxy; getProxiesByName()[proxy->getTypeName()] = proxy;
} }
const SerializationProxy& SerializationProxy::getProxy(const string& typeName) { const SerializationProxy& SerializationProxy::getProxy(const string& typeName) {
map<const string, const SerializationProxy*>::const_iterator iter = proxiesByName.find(typeName); map<const string, const SerializationProxy*>::const_iterator iter = getProxiesByName().find(typeName);
if (iter == proxiesByName.end()) if (iter == getProxiesByName().end())
throw OpenMMException("There is no serialization proxy registered for type '"+string(typeName)+"'"); throw OpenMMException("There is no serialization proxy registered for type '"+string(typeName)+"'");
return *iter->second; return *iter->second;
} }
const SerializationProxy& SerializationProxy::getProxy(const type_info& type) { const SerializationProxy& SerializationProxy::getProxy(const type_info& type) {
map<const string, const SerializationProxy*>::const_iterator iter = proxiesByType.find(type.name()); map<const string, const SerializationProxy*>::const_iterator iter = getProxiesByType().find(type.name());
if (iter == proxiesByType.end()) if (iter == getProxiesByType().end())
throw OpenMMException("There is no serialization proxy registered for type "+string(type.name())); throw OpenMMException("There is no serialization proxy registered for type "+string(type.name()));
return *iter->second; return *iter->second;
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment