Add option to specify synonyms for Factory model names

This commit is contained in:
Ray Speth 2017-02-13 23:52:06 -05:00
parent 04cac2b277
commit c28ca48cf8
3 changed files with 23 additions and 7 deletions

View file

@ -13,6 +13,7 @@
#include <mutex>
#include <unordered_map>
#include "cantera/base/ctexceptions.h"
#include "cantera/base/global.h"
namespace Cantera
{
@ -72,11 +73,19 @@ public:
//! Create an object using the object construction function corresponding to
//! "name" and the provided constructor arguments
T* create(const std::string& name, Args... args) {
T* create(std::string name, Args... args) {
try {
return m_creators.at(name)(args...);
} catch (std::out_of_range&) {
throw CanteraError("Factory::create", "No such type: '{}'", name);
if (m_synonyms.find(name) != m_synonyms.end()) {
return m_creators.at(m_synonyms.at(name))(args...);
} else if (m_deprecated_names.find(name) != m_deprecated_names.end()) {
warn_deprecated(name,
fmt::format("Use '{}' instead.", m_deprecated_names.at(name)));
return m_creators.at(m_deprecated_names.at(name))(args...);
} else {
throw CanteraError("Factory::create", "No such type: '{}'", name);
}
}
}
@ -87,6 +96,13 @@ public:
protected:
std::unordered_map<std::string, std::function<T*(Args...)>> m_creators;
//! Map of synonyms to canonical names
std::unordered_map<std::string, std::string> m_synonyms;
//! Map of deprecated synonyms to canonical names. Use of these names will
//! show a deprecation warning.
std::unordered_map<std::string, std::string> m_deprecated_names;
};
}

View file

@ -77,7 +77,7 @@ ThermoFactory::ThermoFactory()
reg("DebyeHuckel", []() { return new DebyeHuckel(); });
reg("IdealMolalSolution", []() { return new IdealMolalSoln(); });
reg("IdealGasVPSS", []() { return new IdealSolnGasVPSS(); });
reg("IdealSolnVPSS", []() { return new IdealSolnGasVPSS(); });
m_synonyms["IdealGasVPSS"] = "IdealSolnVPSS";
reg("MineralEQ3", []() { return new MineralEQ3(); });
reg("MetalSHEelectrons", []() { return new MetalSHEelectrons(); });
reg("Margules", []() { return new MargulesVPSSTP(); });
@ -87,7 +87,7 @@ ThermoFactory::ThermoFactory()
reg("MolarityIonicVPSSTP", []() { return new MolarityIonicVPSSTP(); });
reg("Redlich-Kister", []() { return new RedlichKisterVPSSTP(); });
reg("RedlichKwong", []() { return new RedlichKwongMFTP(); });
reg("RedlichKwongMFTP", []() { return new RedlichKwongMFTP(); });
m_synonyms["RedlichKwongMFTP"] = "RedlichKwong";
reg("MaskellSolidSolnPhase", []() { return new MaskellSolidSolnPhase(); });
}

View file

@ -45,11 +45,11 @@ public:
TransportFactory::TransportFactory()
{
reg("", []() { return new Transport(); });
reg("None", []() { return new Transport(); });
m_synonyms["None"] = "";
reg("Mix", []() { return new MixTransport(); });
reg("Multi", []() { return new MultiTransport(); });
reg("CK_Mix", []() { return new MixTransport(); });
reg("CK_Multi", []() { return new MultiTransport(); });
m_synonyms["CK_Mix"] = "Mix";
m_synonyms["CK_Multi"] = "Multi";
reg("HighP", []() { return new HighPressureGasTransport(); });
m_CK_mode["CK_Mix"] = true;
m_CK_mode["CK_Multi"] = true;