diff --git a/include/cantera/base/FactoryBase.h b/include/cantera/base/FactoryBase.h index 64e919d3d..1a2ba656d 100644 --- a/include/cantera/base/FactoryBase.h +++ b/include/cantera/base/FactoryBase.h @@ -13,6 +13,7 @@ #include #include #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> m_creators; + + //! Map of synonyms to canonical names + std::unordered_map m_synonyms; + + //! Map of deprecated synonyms to canonical names. Use of these names will + //! show a deprecation warning. + std::unordered_map m_deprecated_names; }; } diff --git a/src/thermo/ThermoFactory.cpp b/src/thermo/ThermoFactory.cpp index cd6e55a7f..d0ca945d0 100644 --- a/src/thermo/ThermoFactory.cpp +++ b/src/thermo/ThermoFactory.cpp @@ -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(); }); } diff --git a/src/transport/TransportFactory.cpp b/src/transport/TransportFactory.cpp index 63309063e..f086a2ee0 100644 --- a/src/transport/TransportFactory.cpp +++ b/src/transport/TransportFactory.cpp @@ -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;