Commit 90a3343672c3c745efa698db810ef7beda72926f
1 parent
24794521
Simplify model registry classes
Remove the m_names members from the spatial, spectral and temporal registry classes and directly use the model type to find the appropriate model. The alloc() method now throws an exception if the model is not found. The new logic helped to reduced the code in the client classes (#1824)
Showing
15 changed files
with
246 additions
and
407 deletions
include/GModelSpatialRegistry.hpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GModelSpatialRegistry.hpp - Spatial model registry class * | 2 | * GModelSpatialRegistry.hpp - Spatial model registry class * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2011-2014 by Juergen Knoedlseder * | 4 | + * copyright (C) 2011-2016 by Juergen Knoedlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software: you can redistribute it and/or modify * | 7 | * This program is free software: you can redistribute it and/or modify * |
| @@ -30,7 +30,10 @@ | @@ -30,7 +30,10 @@ | ||
| 30 | /* __ Includes ___________________________________________________________ */ | 30 | /* __ Includes ___________________________________________________________ */ |
| 31 | #include <string> | 31 | #include <string> |
| 32 | #include "GRegistry.hpp" | 32 | #include "GRegistry.hpp" |
| 33 | -#include "GModelSpatial.hpp" | 33 | + |
| 34 | +/* __ Forward declarations _______________________________________________ */ | ||
| 35 | +class GXmlElement; | ||
| 36 | +class GModelSpatial; | ||
| 34 | 37 | ||
| 35 | 38 | ||
| 36 | /***********************************************************************//** | 39 | /***********************************************************************//** |
| @@ -40,8 +43,8 @@ | @@ -40,8 +43,8 @@ | ||
| 40 | * | 43 | * |
| 41 | * The registry class allows the registration of spatial models that are not | 44 | * The registry class allows the registration of spatial models that are not |
| 42 | * necessarily compiled into the GammaLib. It uses the static members | 45 | * necessarily compiled into the GammaLib. It uses the static members |
| 43 | - * m_number, m_names, and m_models which are allocated globally to keep track | ||
| 44 | - * of spatial models that are available throughout all linked libraries. To | 46 | + * m_number and m_models which are allocated globally to keep track of |
| 47 | + * spatial models that are available throughout all linked libraries. To | ||
| 45 | * register a spatial model it is sufficient to add | 48 | * register a spatial model it is sufficient to add |
| 46 | * | 49 | * |
| 47 | * const GModelSpatialXXX g_spatial_XXX_seed; | 50 | * const GModelSpatialXXX g_spatial_XXX_seed; |
| @@ -65,7 +68,7 @@ public: | @@ -65,7 +68,7 @@ public: | ||
| 65 | // Methods | 68 | // Methods |
| 66 | std::string classname(void) const; | 69 | std::string classname(void) const; |
| 67 | int size(void) const; | 70 | int size(void) const; |
| 68 | - GModelSpatial* alloc(const std::string& name) const; | 71 | + GModelSpatial* alloc(const GXmlElement& xml) const; |
| 69 | std::string name(const int& index) const; | 72 | std::string name(const int& index) const; |
| 70 | std::string print(const GChatter& chatter = NORMAL) const; | 73 | std::string print(const GChatter& chatter = NORMAL) const; |
| 71 | 74 | ||
| @@ -85,11 +88,6 @@ private: | @@ -85,11 +88,6 @@ private: | ||
| 85 | static int m_number = 0; | 88 | static int m_number = 0; |
| 86 | return m_number; | 89 | return m_number; |
| 87 | }; | 90 | }; |
| 88 | - // Model names | ||
| 89 | - static GRegistryPointer<std::string>& names() { | ||
| 90 | - static GRegistryPointer<std::string> m_names; | ||
| 91 | - return m_names; | ||
| 92 | - }; | ||
| 93 | // Pointer to seed models | 91 | // Pointer to seed models |
| 94 | static GRegistryPointer<const GModelSpatial*>& models() { | 92 | static GRegistryPointer<const GModelSpatial*>& models() { |
| 95 | static GRegistryPointer<const GModelSpatial*> m_models; | 93 | static GRegistryPointer<const GModelSpatial*> m_models; |
include/GModelSpectralRegistry.hpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GModelSpectralRegistry.hpp - Spectral model registry class * | 2 | * GModelSpectralRegistry.hpp - Spectral model registry class * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2011-2014 by Juergen Knoedlseder * | 4 | + * copyright (C) 2011-2016 by Juergen Knoedlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software: you can redistribute it and/or modify * | 7 | * This program is free software: you can redistribute it and/or modify * |
| @@ -30,7 +30,10 @@ | @@ -30,7 +30,10 @@ | ||
| 30 | /* __ Includes ___________________________________________________________ */ | 30 | /* __ Includes ___________________________________________________________ */ |
| 31 | #include <string> | 31 | #include <string> |
| 32 | #include "GRegistry.hpp" | 32 | #include "GRegistry.hpp" |
| 33 | -#include "GModelSpectral.hpp" | 33 | + |
| 34 | +/* __ Forward declarations _______________________________________________ */ | ||
| 35 | +class GXmlElement; | ||
| 36 | +class GModelSpectral; | ||
| 34 | 37 | ||
| 35 | 38 | ||
| 36 | /***********************************************************************//** | 39 | /***********************************************************************//** |
| @@ -40,8 +43,8 @@ | @@ -40,8 +43,8 @@ | ||
| 40 | * | 43 | * |
| 41 | * The registry class allows the registration of spectral models that are not | 44 | * The registry class allows the registration of spectral models that are not |
| 42 | * necessarily compiled into the GammaLib. It uses the static members | 45 | * necessarily compiled into the GammaLib. It uses the static members |
| 43 | - * m_number, m_names, and m_models which are allocated globally to keep track | ||
| 44 | - * of spectral models that are available throughout all linked libraries. To | 46 | + * m_number and m_models which are allocated globally to keep track of |
| 47 | + * spectral models that are available throughout all linked libraries. To | ||
| 45 | * register a spectral model it is sufficient to add | 48 | * register a spectral model it is sufficient to add |
| 46 | * | 49 | * |
| 47 | * const GModelSpectralXXX g_spectral_XXX_seed; | 50 | * const GModelSpectralXXX g_spectral_XXX_seed; |
| @@ -65,7 +68,7 @@ public: | @@ -65,7 +68,7 @@ public: | ||
| 65 | // Methods | 68 | // Methods |
| 66 | std::string classname(void) const; | 69 | std::string classname(void) const; |
| 67 | int size(void) const; | 70 | int size(void) const; |
| 68 | - GModelSpectral* alloc(const std::string& name) const; | 71 | + GModelSpectral* alloc(const GXmlElement& xml) const; |
| 69 | std::string name(const int& index) const; | 72 | std::string name(const int& index) const; |
| 70 | std::string print(const GChatter& chatter = NORMAL) const; | 73 | std::string print(const GChatter& chatter = NORMAL) const; |
| 71 | 74 | ||
| @@ -85,11 +88,6 @@ private: | @@ -85,11 +88,6 @@ private: | ||
| 85 | static int m_number = 0; | 88 | static int m_number = 0; |
| 86 | return m_number; | 89 | return m_number; |
| 87 | }; | 90 | }; |
| 88 | - // Model names | ||
| 89 | - static GRegistryPointer<std::string>& names() { | ||
| 90 | - static GRegistryPointer<std::string> m_names; | ||
| 91 | - return m_names; | ||
| 92 | - }; | ||
| 93 | // Pointer to seed models | 91 | // Pointer to seed models |
| 94 | static GRegistryPointer<const GModelSpectral*>& models() { | 92 | static GRegistryPointer<const GModelSpectral*>& models() { |
| 95 | static GRegistryPointer<const GModelSpectral*> m_models; | 93 | static GRegistryPointer<const GModelSpectral*> m_models; |
include/GModelTemporalRegistry.hpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GModelTemporalRegistry.hpp - Temporal model registry class * | 2 | * GModelTemporalRegistry.hpp - Temporal model registry class * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2011-2014 by Juergen Knoedlseder * | 4 | + * copyright (C) 2011-2016 by Juergen Knoedlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software: you can redistribute it and/or modify * | 7 | * This program is free software: you can redistribute it and/or modify * |
| @@ -30,7 +30,10 @@ | @@ -30,7 +30,10 @@ | ||
| 30 | /* __ Includes ___________________________________________________________ */ | 30 | /* __ Includes ___________________________________________________________ */ |
| 31 | #include <string> | 31 | #include <string> |
| 32 | #include "GRegistry.hpp" | 32 | #include "GRegistry.hpp" |
| 33 | -#include "GModelTemporal.hpp" | 33 | + |
| 34 | +/* __ Forward declarations _______________________________________________ */ | ||
| 35 | +class GXmlElement; | ||
| 36 | +class GModelTemporal; | ||
| 34 | 37 | ||
| 35 | 38 | ||
| 36 | /***********************************************************************//** | 39 | /***********************************************************************//** |
| @@ -40,8 +43,8 @@ | @@ -40,8 +43,8 @@ | ||
| 40 | * | 43 | * |
| 41 | * The registry class allows the registration of temporal models that are not | 44 | * The registry class allows the registration of temporal models that are not |
| 42 | * necessarily compiled into the GammaLib. It uses the static members | 45 | * necessarily compiled into the GammaLib. It uses the static members |
| 43 | - * m_number, m_names, and m_models which are allocated globally to keep track | ||
| 44 | - * of temporal models that are available throughout all linked libraries. To | 46 | + * m_number and m_models which are allocated globally to keep track of |
| 47 | + * temporal models that are available throughout all linked libraries. To | ||
| 45 | * register a temporal model it is sufficient to add | 48 | * register a temporal model it is sufficient to add |
| 46 | * | 49 | * |
| 47 | * const GModelTemporalXXX g_temporal_XXX_seed; | 50 | * const GModelTemporalXXX g_temporal_XXX_seed; |
| @@ -65,7 +68,7 @@ public: | @@ -65,7 +68,7 @@ public: | ||
| 65 | // Methods | 68 | // Methods |
| 66 | std::string classname(void) const; | 69 | std::string classname(void) const; |
| 67 | int size(void) const; | 70 | int size(void) const; |
| 68 | - GModelTemporal* alloc(const std::string& name) const; | 71 | + GModelTemporal* alloc(const GXmlElement& xml) const; |
| 69 | std::string name(const int& index) const; | 72 | std::string name(const int& index) const; |
| 70 | std::string print(const GChatter& chatter = NORMAL) const; | 73 | std::string print(const GChatter& chatter = NORMAL) const; |
| 71 | 74 | ||
| @@ -85,11 +88,6 @@ private: | @@ -85,11 +88,6 @@ private: | ||
| 85 | static int m_number = 0; | 88 | static int m_number = 0; |
| 86 | return m_number; | 89 | return m_number; |
| 87 | }; | 90 | }; |
| 88 | - // Model names | ||
| 89 | - static GRegistryPointer<std::string>& names() { | ||
| 90 | - static GRegistryPointer<std::string> m_names; | ||
| 91 | - return m_names; | ||
| 92 | - }; | ||
| 93 | // Pointer to seed models | 91 | // Pointer to seed models |
| 94 | static GRegistryPointer<const GModelTemporal*>& models() { | 92 | static GRegistryPointer<const GModelTemporal*>& models() { |
| 95 | static GRegistryPointer<const GModelTemporal*> m_models; | 93 | static GRegistryPointer<const GModelTemporal*> m_models; |
inst/cta/src/GCTAModelAeffBackground.cpp
| @@ -1107,33 +1107,18 @@ bool GCTAModelAeffBackground::valid_model(void) const | @@ -1107,33 +1107,18 @@ bool GCTAModelAeffBackground::valid_model(void) const | ||
| 1107 | 1107 | ||
| 1108 | 1108 | ||
| 1109 | /***********************************************************************//** | 1109 | /***********************************************************************//** |
| 1110 | - * @brief Construct spectral model from XML element | 1110 | + * @brief Return pointer to spectral model from XML element |
| 1111 | * | 1111 | * |
| 1112 | - * @param[in] spectral XML element containing spectral model information. | 1112 | + * @param[in] spectral XML element. |
| 1113 | + * @return Pointer to spectral model. | ||
| 1113 | * | 1114 | * |
| 1114 | - * @exception GException::model_invalid_spectral | ||
| 1115 | - * Invalid spectral model type encountered. | ||
| 1116 | - * | ||
| 1117 | - * Returns pointer to a spectral model that is defined in an XML element. | 1115 | + * Returns pointer to spectral model that is defined in an XML element. |
| 1118 | ***************************************************************************/ | 1116 | ***************************************************************************/ |
| 1119 | GModelSpectral* GCTAModelAeffBackground::xml_spectral(const GXmlElement& spectral) const | 1117 | GModelSpectral* GCTAModelAeffBackground::xml_spectral(const GXmlElement& spectral) const |
| 1120 | { | 1118 | { |
| 1121 | - // Get spectral model type | ||
| 1122 | - std::string type = spectral.attribute("type"); | ||
| 1123 | - | ||
| 1124 | // Get spectral model | 1119 | // Get spectral model |
| 1125 | GModelSpectralRegistry registry; | 1120 | GModelSpectralRegistry registry; |
| 1126 | - GModelSpectral* ptr = registry.alloc(type); | ||
| 1127 | - | ||
| 1128 | - // If model if valid then read model from XML file | ||
| 1129 | - if (ptr != NULL) { | ||
| 1130 | - ptr->read(spectral); | ||
| 1131 | - } | ||
| 1132 | - | ||
| 1133 | - // ... otherwise throw an exception | ||
| 1134 | - else { | ||
| 1135 | - throw GException::model_invalid_spectral(G_XML_SPECTRAL, type); | ||
| 1136 | - } | 1121 | + GModelSpectral* ptr = registry.alloc(spectral); |
| 1137 | 1122 | ||
| 1138 | // Return pointer | 1123 | // Return pointer |
| 1139 | return ptr; | 1124 | return ptr; |
| @@ -1141,33 +1126,18 @@ GModelSpectral* GCTAModelAeffBackground::xml_spectral(const GXmlElement& spectra | @@ -1141,33 +1126,18 @@ GModelSpectral* GCTAModelAeffBackground::xml_spectral(const GXmlElement& spectra | ||
| 1141 | 1126 | ||
| 1142 | 1127 | ||
| 1143 | /***********************************************************************//** | 1128 | /***********************************************************************//** |
| 1144 | - * @brief Construct temporal model from XML element | 1129 | + * @brief Return pointer to temporal model from XML element |
| 1145 | * | 1130 | * |
| 1146 | - * @param[in] temporal XML element containing temporal model information. | 1131 | + * @param[in] temporal XML element. |
| 1132 | + * @return Pointer to temporal model. | ||
| 1147 | * | 1133 | * |
| 1148 | - * @exception GException::model_invalid_temporal | ||
| 1149 | - * Invalid temporal model type encountered. | ||
| 1150 | - * | ||
| 1151 | - * Returns pointer to a temporal model that is defined in an XML element. | 1134 | + * Returns pointer to temporal model that is defined in an XML element. |
| 1152 | ***************************************************************************/ | 1135 | ***************************************************************************/ |
| 1153 | GModelTemporal* GCTAModelAeffBackground::xml_temporal(const GXmlElement& temporal) const | 1136 | GModelTemporal* GCTAModelAeffBackground::xml_temporal(const GXmlElement& temporal) const |
| 1154 | { | 1137 | { |
| 1155 | - // Get temporal model type | ||
| 1156 | - std::string type = temporal.attribute("type"); | ||
| 1157 | - | ||
| 1158 | // Get temporal model | 1138 | // Get temporal model |
| 1159 | GModelTemporalRegistry registry; | 1139 | GModelTemporalRegistry registry; |
| 1160 | - GModelTemporal* ptr = registry.alloc(type); | ||
| 1161 | - | ||
| 1162 | - // If model if valid then read model from XML file | ||
| 1163 | - if (ptr != NULL) { | ||
| 1164 | - ptr->read(temporal); | ||
| 1165 | - } | ||
| 1166 | - | ||
| 1167 | - // ... otherwise throw an exception | ||
| 1168 | - else { | ||
| 1169 | - throw GException::model_invalid_temporal(G_XML_TEMPORAL, type); | ||
| 1170 | - } | 1140 | + GModelTemporal* ptr = registry.alloc(temporal); |
| 1171 | 1141 | ||
| 1172 | // Return pointer | 1142 | // Return pointer |
| 1173 | return ptr; | 1143 | return ptr; |
inst/cta/src/GCTAModelCubeBackground.cpp
| @@ -841,33 +841,18 @@ bool GCTAModelCubeBackground::valid_model(void) const | @@ -841,33 +841,18 @@ bool GCTAModelCubeBackground::valid_model(void) const | ||
| 841 | 841 | ||
| 842 | 842 | ||
| 843 | /***********************************************************************//** | 843 | /***********************************************************************//** |
| 844 | - * @brief Construct spectral model from XML element | 844 | + * @brief Return pointer to spectral model from XML element |
| 845 | * | 845 | * |
| 846 | - * @param[in] spectral XML element containing spectral model information. | 846 | + * @param[in] spectral XML element. |
| 847 | + * @return Pointer to spectral model. | ||
| 847 | * | 848 | * |
| 848 | - * @exception GException::model_invalid_spectral | ||
| 849 | - * Invalid spectral model type encountered. | ||
| 850 | - * | ||
| 851 | - * Returns pointer to a spectral model that is defined in an XML element. | 849 | + * Returns pointer to spectral model that is defined in an XML element. |
| 852 | ***************************************************************************/ | 850 | ***************************************************************************/ |
| 853 | GModelSpectral* GCTAModelCubeBackground::xml_spectral(const GXmlElement& spectral) const | 851 | GModelSpectral* GCTAModelCubeBackground::xml_spectral(const GXmlElement& spectral) const |
| 854 | { | 852 | { |
| 855 | - // Get spectral model type | ||
| 856 | - std::string type = spectral.attribute("type"); | ||
| 857 | - | ||
| 858 | // Get spectral model | 853 | // Get spectral model |
| 859 | GModelSpectralRegistry registry; | 854 | GModelSpectralRegistry registry; |
| 860 | - GModelSpectral* ptr = registry.alloc(type); | ||
| 861 | - | ||
| 862 | - // If model if valid then read model from XML file | ||
| 863 | - if (ptr != NULL) { | ||
| 864 | - ptr->read(spectral); | ||
| 865 | - } | ||
| 866 | - | ||
| 867 | - // ... otherwise throw an exception | ||
| 868 | - else { | ||
| 869 | - throw GException::model_invalid_spectral(G_XML_SPECTRAL, type); | ||
| 870 | - } | 855 | + GModelSpectral* ptr = registry.alloc(spectral); |
| 871 | 856 | ||
| 872 | // Return pointer | 857 | // Return pointer |
| 873 | return ptr; | 858 | return ptr; |
| @@ -875,33 +860,18 @@ GModelSpectral* GCTAModelCubeBackground::xml_spectral(const GXmlElement& spectra | @@ -875,33 +860,18 @@ GModelSpectral* GCTAModelCubeBackground::xml_spectral(const GXmlElement& spectra | ||
| 875 | 860 | ||
| 876 | 861 | ||
| 877 | /***********************************************************************//** | 862 | /***********************************************************************//** |
| 878 | - * @brief Construct temporal model from XML element | 863 | + * @brief Return pointer to temporal model from XML element |
| 879 | * | 864 | * |
| 880 | - * @param[in] temporal XML element containing temporal model information. | 865 | + * @param[in] temporal XML element. |
| 866 | + * @return Pointer to temporal model. | ||
| 881 | * | 867 | * |
| 882 | - * @exception GException::model_invalid_temporal | ||
| 883 | - * Invalid temporal model type encountered. | ||
| 884 | - * | ||
| 885 | - * Returns pointer to a temporal model that is defined in an XML element. | 868 | + * Returns pointer to temporal model that is defined in an XML element. |
| 886 | ***************************************************************************/ | 869 | ***************************************************************************/ |
| 887 | GModelTemporal* GCTAModelCubeBackground::xml_temporal(const GXmlElement& temporal) const | 870 | GModelTemporal* GCTAModelCubeBackground::xml_temporal(const GXmlElement& temporal) const |
| 888 | { | 871 | { |
| 889 | - // Get temporal model type | ||
| 890 | - std::string type = temporal.attribute("type"); | ||
| 891 | - | ||
| 892 | // Get temporal model | 872 | // Get temporal model |
| 893 | GModelTemporalRegistry registry; | 873 | GModelTemporalRegistry registry; |
| 894 | - GModelTemporal* ptr = registry.alloc(type); | ||
| 895 | - | ||
| 896 | - // If model if valid then read model from XML file | ||
| 897 | - if (ptr != NULL) { | ||
| 898 | - ptr->read(temporal); | ||
| 899 | - } | ||
| 900 | - | ||
| 901 | - // ... otherwise throw an exception | ||
| 902 | - else { | ||
| 903 | - throw GException::model_invalid_temporal(G_XML_TEMPORAL, type); | ||
| 904 | - } | 874 | + GModelTemporal* ptr = registry.alloc(temporal); |
| 905 | 875 | ||
| 906 | // Return pointer | 876 | // Return pointer |
| 907 | return ptr; | 877 | return ptr; |
inst/cta/src/GCTAModelIrfBackground.cpp
| @@ -1098,33 +1098,18 @@ bool GCTAModelIrfBackground::valid_model(void) const | @@ -1098,33 +1098,18 @@ bool GCTAModelIrfBackground::valid_model(void) const | ||
| 1098 | 1098 | ||
| 1099 | 1099 | ||
| 1100 | /***********************************************************************//** | 1100 | /***********************************************************************//** |
| 1101 | - * @brief Construct spectral model from XML element | 1101 | + * @brief Return pointer to spectral model from XML element |
| 1102 | * | 1102 | * |
| 1103 | - * @param[in] spectral XML element containing spectral model information. | 1103 | + * @param[in] spectral XML element. |
| 1104 | + * @return Pointer to spectral model. | ||
| 1104 | * | 1105 | * |
| 1105 | - * @exception GException::model_invalid_spectral | ||
| 1106 | - * Invalid spectral model type encountered. | ||
| 1107 | - * | ||
| 1108 | - * Returns pointer to a spectral model that is defined in an XML element. | 1106 | + * Returns pointer to spectral model that is defined in an XML element. |
| 1109 | ***************************************************************************/ | 1107 | ***************************************************************************/ |
| 1110 | GModelSpectral* GCTAModelIrfBackground::xml_spectral(const GXmlElement& spectral) const | 1108 | GModelSpectral* GCTAModelIrfBackground::xml_spectral(const GXmlElement& spectral) const |
| 1111 | { | 1109 | { |
| 1112 | - // Get spectral model type | ||
| 1113 | - std::string type = spectral.attribute("type"); | ||
| 1114 | - | ||
| 1115 | // Get spectral model | 1110 | // Get spectral model |
| 1116 | GModelSpectralRegistry registry; | 1111 | GModelSpectralRegistry registry; |
| 1117 | - GModelSpectral* ptr = registry.alloc(type); | ||
| 1118 | - | ||
| 1119 | - // If model if valid then read model from XML file | ||
| 1120 | - if (ptr != NULL) { | ||
| 1121 | - ptr->read(spectral); | ||
| 1122 | - } | ||
| 1123 | - | ||
| 1124 | - // ... otherwise throw an exception | ||
| 1125 | - else { | ||
| 1126 | - throw GException::model_invalid_spectral(G_XML_SPECTRAL, type); | ||
| 1127 | - } | 1112 | + GModelSpectral* ptr = registry.alloc(spectral); |
| 1128 | 1113 | ||
| 1129 | // Return pointer | 1114 | // Return pointer |
| 1130 | return ptr; | 1115 | return ptr; |
| @@ -1132,33 +1117,18 @@ GModelSpectral* GCTAModelIrfBackground::xml_spectral(const GXmlElement& spectral | @@ -1132,33 +1117,18 @@ GModelSpectral* GCTAModelIrfBackground::xml_spectral(const GXmlElement& spectral | ||
| 1132 | 1117 | ||
| 1133 | 1118 | ||
| 1134 | /***********************************************************************//** | 1119 | /***********************************************************************//** |
| 1135 | - * @brief Construct temporal model from XML element | 1120 | + * @brief Return pointer to temporal model from XML element |
| 1136 | * | 1121 | * |
| 1137 | - * @param[in] temporal XML element containing temporal model information. | 1122 | + * @param[in] temporal XML element. |
| 1123 | + * @return Pointer to temporal model. | ||
| 1138 | * | 1124 | * |
| 1139 | - * @exception GException::model_invalid_temporal | ||
| 1140 | - * Invalid temporal model type encountered. | ||
| 1141 | - * | ||
| 1142 | - * Returns pointer to a temporal model that is defined in an XML element. | 1125 | + * Returns pointer to temporal model that is defined in an XML element. |
| 1143 | ***************************************************************************/ | 1126 | ***************************************************************************/ |
| 1144 | GModelTemporal* GCTAModelIrfBackground::xml_temporal(const GXmlElement& temporal) const | 1127 | GModelTemporal* GCTAModelIrfBackground::xml_temporal(const GXmlElement& temporal) const |
| 1145 | { | 1128 | { |
| 1146 | - // Get temporal model type | ||
| 1147 | - std::string type = temporal.attribute("type"); | ||
| 1148 | - | ||
| 1149 | // Get temporal model | 1129 | // Get temporal model |
| 1150 | GModelTemporalRegistry registry; | 1130 | GModelTemporalRegistry registry; |
| 1151 | - GModelTemporal* ptr = registry.alloc(type); | ||
| 1152 | - | ||
| 1153 | - // If model if valid then read model from XML file | ||
| 1154 | - if (ptr != NULL) { | ||
| 1155 | - ptr->read(temporal); | ||
| 1156 | - } | ||
| 1157 | - | ||
| 1158 | - // ... otherwise throw an exception | ||
| 1159 | - else { | ||
| 1160 | - throw GException::model_invalid_temporal(G_XML_TEMPORAL, type); | ||
| 1161 | - } | 1131 | + GModelTemporal* ptr = registry.alloc(temporal); |
| 1162 | 1132 | ||
| 1163 | // Return pointer | 1133 | // Return pointer |
| 1164 | return ptr; | 1134 | return ptr; |
inst/cta/src/GCTAModelRadialAcceptance.cpp
| @@ -979,33 +979,18 @@ GCTAModelRadial* GCTAModelRadialAcceptance::xml_radial(const GXmlElement& radial | @@ -979,33 +979,18 @@ GCTAModelRadial* GCTAModelRadialAcceptance::xml_radial(const GXmlElement& radial | ||
| 979 | 979 | ||
| 980 | 980 | ||
| 981 | /***********************************************************************//** | 981 | /***********************************************************************//** |
| 982 | - * @brief Construct spectral model from XML element | 982 | + * @brief Return pointer to spectral model from XML element |
| 983 | * | 983 | * |
| 984 | - * @param[in] spectral XML element containing spectral model information. | 984 | + * @param[in] spectral XML element. |
| 985 | + * @return Pointer to spectral model. | ||
| 985 | * | 986 | * |
| 986 | - * @exception GException::model_invalid_spectral | ||
| 987 | - * Invalid spectral model type encountered. | ||
| 988 | - * | ||
| 989 | - * Returns pointer to a spectral model that is defined in an XML element. | 987 | + * Returns pointer to spectral model that is defined in an XML element. |
| 990 | ***************************************************************************/ | 988 | ***************************************************************************/ |
| 991 | GModelSpectral* GCTAModelRadialAcceptance::xml_spectral(const GXmlElement& spectral) const | 989 | GModelSpectral* GCTAModelRadialAcceptance::xml_spectral(const GXmlElement& spectral) const |
| 992 | { | 990 | { |
| 993 | - // Get spectral model type | ||
| 994 | - std::string type = spectral.attribute("type"); | ||
| 995 | - | ||
| 996 | // Get spectral model | 991 | // Get spectral model |
| 997 | GModelSpectralRegistry registry; | 992 | GModelSpectralRegistry registry; |
| 998 | - GModelSpectral* ptr = registry.alloc(type); | ||
| 999 | - | ||
| 1000 | - // If model if valid then read model from XML file | ||
| 1001 | - if (ptr != NULL) { | ||
| 1002 | - ptr->read(spectral); | ||
| 1003 | - } | ||
| 1004 | - | ||
| 1005 | - // ... otherwise throw an exception | ||
| 1006 | - else { | ||
| 1007 | - throw GException::model_invalid_spectral(G_XML_SPECTRAL, type); | ||
| 1008 | - } | 993 | + GModelSpectral* ptr = registry.alloc(spectral); |
| 1009 | 994 | ||
| 1010 | // Return pointer | 995 | // Return pointer |
| 1011 | return ptr; | 996 | return ptr; |
| @@ -1013,33 +998,18 @@ GModelSpectral* GCTAModelRadialAcceptance::xml_spectral(const GXmlElement& spect | @@ -1013,33 +998,18 @@ GModelSpectral* GCTAModelRadialAcceptance::xml_spectral(const GXmlElement& spect | ||
| 1013 | 998 | ||
| 1014 | 999 | ||
| 1015 | /***********************************************************************//** | 1000 | /***********************************************************************//** |
| 1016 | - * @brief Construct temporal model from XML element | 1001 | + * @brief Return pointer to temporal model from XML element |
| 1017 | * | 1002 | * |
| 1018 | - * @param[in] temporal XML element containing temporal model information. | 1003 | + * @param[in] temporal XML element. |
| 1004 | + * @return Pointer to temporal model. | ||
| 1019 | * | 1005 | * |
| 1020 | - * @exception GException::model_invalid_temporal | ||
| 1021 | - * Invalid temporal model type encountered. | ||
| 1022 | - * | ||
| 1023 | - * Returns pointer to a temporal model that is defined in an XML element. | 1006 | + * Returns pointer to temporal model that is defined in an XML element. |
| 1024 | ***************************************************************************/ | 1007 | ***************************************************************************/ |
| 1025 | GModelTemporal* GCTAModelRadialAcceptance::xml_temporal(const GXmlElement& temporal) const | 1008 | GModelTemporal* GCTAModelRadialAcceptance::xml_temporal(const GXmlElement& temporal) const |
| 1026 | { | 1009 | { |
| 1027 | - // Get temporal model type | ||
| 1028 | - std::string type = temporal.attribute("type"); | ||
| 1029 | - | ||
| 1030 | // Get temporal model | 1010 | // Get temporal model |
| 1031 | GModelTemporalRegistry registry; | 1011 | GModelTemporalRegistry registry; |
| 1032 | - GModelTemporal* ptr = registry.alloc(type); | ||
| 1033 | - | ||
| 1034 | - // If model if valid then read model from XML file | ||
| 1035 | - if (ptr != NULL) { | ||
| 1036 | - ptr->read(temporal); | ||
| 1037 | - } | ||
| 1038 | - | ||
| 1039 | - // ... otherwise throw an exception | ||
| 1040 | - else { | ||
| 1041 | - throw GException::model_invalid_temporal(G_XML_TEMPORAL, type); | ||
| 1042 | - } | 1012 | + GModelTemporal* ptr = registry.alloc(temporal); |
| 1043 | 1013 | ||
| 1044 | // Return pointer | 1014 | // Return pointer |
| 1045 | return ptr; | 1015 | return ptr; |
pyext/GModelSpatialRegistry.i
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GModelSpatialRegistry.i - Spatial model registry class * | 2 | * GModelSpatialRegistry.i - Spatial model registry class * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2011-2015 by Juergen Knoedlseder * | 4 | + * copyright (C) 2011-2016 by Juergen Knoedlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software: you can redistribute it and/or modify * | 7 | * This program is free software: you can redistribute it and/or modify * |
| @@ -46,7 +46,7 @@ public: | @@ -46,7 +46,7 @@ public: | ||
| 46 | // Methods | 46 | // Methods |
| 47 | std::string classname(void) const; | 47 | std::string classname(void) const; |
| 48 | int size(void) const; | 48 | int size(void) const; |
| 49 | - GModelSpatial* alloc(const std::string& name) const; | 49 | + GModelSpatial* alloc(const GXmlElement& xml) const; |
| 50 | std::string name(const int& index) const; | 50 | std::string name(const int& index) const; |
| 51 | }; | 51 | }; |
| 52 | 52 |
pyext/GModelSpectralRegistry.i
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GModelSpectralRegistry.i - Spectral model registry class * | 2 | * GModelSpectralRegistry.i - Spectral model registry class * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2011-2015 by Juergen Knoedlseder * | 4 | + * copyright (C) 2011-2016 by Juergen Knoedlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software: you can redistribute it and/or modify * | 7 | * This program is free software: you can redistribute it and/or modify * |
| @@ -46,7 +46,7 @@ public: | @@ -46,7 +46,7 @@ public: | ||
| 46 | // Methods | 46 | // Methods |
| 47 | std::string classname(void) const; | 47 | std::string classname(void) const; |
| 48 | int size(void) const; | 48 | int size(void) const; |
| 49 | - GModelSpectral* alloc(const std::string& name) const; | 49 | + GModelSpectral* alloc(const GXmlElement& xml) const; |
| 50 | std::string name(const int& index) const; | 50 | std::string name(const int& index) const; |
| 51 | }; | 51 | }; |
| 52 | 52 |
pyext/GModelTemporalRegistry.i
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GModelTemporalRegistry.i - Temporal model registry class * | 2 | * GModelTemporalRegistry.i - Temporal model registry class * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2011-2015 by Juergen Knoedlseder * | 4 | + * copyright (C) 2011-2016 by Juergen Knoedlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software: you can redistribute it and/or modify * | 7 | * This program is free software: you can redistribute it and/or modify * |
| @@ -46,7 +46,7 @@ public: | @@ -46,7 +46,7 @@ public: | ||
| 46 | // Methods | 46 | // Methods |
| 47 | std::string classname(void) const; | 47 | std::string classname(void) const; |
| 48 | int size(void) const; | 48 | int size(void) const; |
| 49 | - GModelTemporal* alloc(const std::string& name) const; | 49 | + GModelTemporal* alloc(const GXmlElement& xml) const; |
| 50 | std::string name(const int& index) const; | 50 | std::string name(const int& index) const; |
| 51 | }; | 51 | }; |
| 52 | 52 |
src/model/GModelSky.cpp
| @@ -1170,32 +1170,18 @@ void GModelSky::set_type(void) | @@ -1170,32 +1170,18 @@ void GModelSky::set_type(void) | ||
| 1170 | 1170 | ||
| 1171 | 1171 | ||
| 1172 | /***********************************************************************//** | 1172 | /***********************************************************************//** |
| 1173 | - * @brief Construct spatial model from XML element | 1173 | + * @brief Return pointer to spatial model from XML element |
| 1174 | * | 1174 | * |
| 1175 | - * @param[in] spatial XML element containing spatial model information. | 1175 | + * @param[in] spatial XML element. |
| 1176 | * @return Pointer to spatial model. | 1176 | * @return Pointer to spatial model. |
| 1177 | * | 1177 | * |
| 1178 | - * @exception GException::model_invalid_spatial | ||
| 1179 | - * Invalid spatial model type encountered. | 1178 | + * Returns pointer to spatial model that is defined in an XML element. |
| 1180 | ***************************************************************************/ | 1179 | ***************************************************************************/ |
| 1181 | GModelSpatial* GModelSky::xml_spatial(const GXmlElement& spatial) const | 1180 | GModelSpatial* GModelSky::xml_spatial(const GXmlElement& spatial) const |
| 1182 | { | 1181 | { |
| 1183 | - // Get spatial model type | ||
| 1184 | - std::string type = spatial.attribute("type"); | ||
| 1185 | - | ||
| 1186 | // Get spatial model | 1182 | // Get spatial model |
| 1187 | GModelSpatialRegistry registry; | 1183 | GModelSpatialRegistry registry; |
| 1188 | - GModelSpatial* ptr = registry.alloc(type); | ||
| 1189 | - | ||
| 1190 | - // If model if valid then read model from XML file | ||
| 1191 | - if (ptr != NULL) { | ||
| 1192 | - ptr->read(spatial); | ||
| 1193 | - } | ||
| 1194 | - | ||
| 1195 | - // ... otherwise throw an exception | ||
| 1196 | - else { | ||
| 1197 | - throw GException::model_invalid_spatial(G_XML_SPATIAL, type); | ||
| 1198 | - } | 1184 | + GModelSpatial* ptr = registry.alloc(spatial); |
| 1199 | 1185 | ||
| 1200 | // Return pointer | 1186 | // Return pointer |
| 1201 | return ptr; | 1187 | return ptr; |
| @@ -1203,32 +1189,18 @@ GModelSpatial* GModelSky::xml_spatial(const GXmlElement& spatial) const | @@ -1203,32 +1189,18 @@ GModelSpatial* GModelSky::xml_spatial(const GXmlElement& spatial) const | ||
| 1203 | 1189 | ||
| 1204 | 1190 | ||
| 1205 | /***********************************************************************//** | 1191 | /***********************************************************************//** |
| 1206 | - * @brief Construct spectral model from XML element | 1192 | + * @brief Return pointer to spectral model from XML element |
| 1207 | * | 1193 | * |
| 1208 | - * @param[in] spectral XML element containing spectral model information. | 1194 | + * @param[in] spectral XML element. |
| 1209 | * @return Pointer to spectral model. | 1195 | * @return Pointer to spectral model. |
| 1210 | * | 1196 | * |
| 1211 | - * @exception GException::model_invalid_spectral | ||
| 1212 | - * Invalid spatial model type encountered. | 1197 | + * Returns pointer to spectral model that is defined in an XML element. |
| 1213 | ***************************************************************************/ | 1198 | ***************************************************************************/ |
| 1214 | GModelSpectral* GModelSky::xml_spectral(const GXmlElement& spectral) const | 1199 | GModelSpectral* GModelSky::xml_spectral(const GXmlElement& spectral) const |
| 1215 | { | 1200 | { |
| 1216 | - // Get spectral model type | ||
| 1217 | - std::string type = spectral.attribute("type"); | ||
| 1218 | - | ||
| 1219 | // Get spectral model | 1201 | // Get spectral model |
| 1220 | GModelSpectralRegistry registry; | 1202 | GModelSpectralRegistry registry; |
| 1221 | - GModelSpectral* ptr = registry.alloc(type); | ||
| 1222 | - | ||
| 1223 | - // If model if valid then read model from XML file | ||
| 1224 | - if (ptr != NULL) { | ||
| 1225 | - ptr->read(spectral); | ||
| 1226 | - } | ||
| 1227 | - | ||
| 1228 | - // ... otherwise throw an exception | ||
| 1229 | - else { | ||
| 1230 | - throw GException::model_invalid_spectral(G_XML_SPECTRAL, type); | ||
| 1231 | - } | 1203 | + GModelSpectral* ptr = registry.alloc(spectral); |
| 1232 | 1204 | ||
| 1233 | // Return pointer | 1205 | // Return pointer |
| 1234 | return ptr; | 1206 | return ptr; |
| @@ -1236,32 +1208,18 @@ GModelSpectral* GModelSky::xml_spectral(const GXmlElement& spectral) const | @@ -1236,32 +1208,18 @@ GModelSpectral* GModelSky::xml_spectral(const GXmlElement& spectral) const | ||
| 1236 | 1208 | ||
| 1237 | 1209 | ||
| 1238 | /***********************************************************************//** | 1210 | /***********************************************************************//** |
| 1239 | - * @brief Construct temporal model from XML element | 1211 | + * @brief Return pointer to temporal model from XML element |
| 1240 | * | 1212 | * |
| 1241 | - * @param[in] temporal XML element containing temporal model information. | 1213 | + * @param[in] temporal XML element. |
| 1242 | * @return Pointer to temporal model. | 1214 | * @return Pointer to temporal model. |
| 1243 | * | 1215 | * |
| 1244 | - * @exception GException::model_invalid_temporal | ||
| 1245 | - * Invalid spatial model type encountered. | 1216 | + * Returns pointer to temporal model that is defined in an XML element. |
| 1246 | ***************************************************************************/ | 1217 | ***************************************************************************/ |
| 1247 | GModelTemporal* GModelSky::xml_temporal(const GXmlElement& temporal) const | 1218 | GModelTemporal* GModelSky::xml_temporal(const GXmlElement& temporal) const |
| 1248 | { | 1219 | { |
| 1249 | - // Get temporal model type | ||
| 1250 | - std::string type = temporal.attribute("type"); | ||
| 1251 | - | ||
| 1252 | // Get temporal model | 1220 | // Get temporal model |
| 1253 | GModelTemporalRegistry registry; | 1221 | GModelTemporalRegistry registry; |
| 1254 | - GModelTemporal* ptr = registry.alloc(type); | ||
| 1255 | - | ||
| 1256 | - // If model if valid then read model from XML file | ||
| 1257 | - if (ptr != NULL) { | ||
| 1258 | - ptr->read(temporal); | ||
| 1259 | - } | ||
| 1260 | - | ||
| 1261 | - // ... otherwise throw an exception | ||
| 1262 | - else { | ||
| 1263 | - throw GException::model_invalid_temporal(G_XML_TEMPORAL, type); | ||
| 1264 | - } | 1222 | + GModelTemporal* ptr = registry.alloc(temporal); |
| 1265 | 1223 | ||
| 1266 | // Return pointer | 1224 | // Return pointer |
| 1267 | return ptr; | 1225 | return ptr; |
src/model/GModelSpatialRegistry.cpp
| @@ -28,11 +28,14 @@ | @@ -28,11 +28,14 @@ | ||
| 28 | #ifdef HAVE_CONFIG_H | 28 | #ifdef HAVE_CONFIG_H |
| 29 | #include <config.h> | 29 | #include <config.h> |
| 30 | #endif | 30 | #endif |
| 31 | +#include "GModelPar.hpp" | ||
| 32 | +#include "GModelSpatial.hpp" | ||
| 31 | #include "GModelSpatialRegistry.hpp" | 33 | #include "GModelSpatialRegistry.hpp" |
| 32 | #include "GException.hpp" | 34 | #include "GException.hpp" |
| 33 | #include "GTools.hpp" | 35 | #include "GTools.hpp" |
| 34 | 36 | ||
| 35 | /* __ Method name definitions ____________________________________________ */ | 37 | /* __ Method name definitions ____________________________________________ */ |
| 38 | +#define G_ALLOC "GModelSpatialRegistry::alloc(GXmlElement&)" | ||
| 36 | #define G_NAME "GModelSpatialRegistry::name(int&)" | 39 | #define G_NAME "GModelSpatialRegistry::name(int&)" |
| 37 | 40 | ||
| 38 | /* __ Macros _____________________________________________________________ */ | 41 | /* __ Macros _____________________________________________________________ */ |
| @@ -61,7 +64,7 @@ GModelSpatialRegistry::GModelSpatialRegistry(void) | @@ -61,7 +64,7 @@ GModelSpatialRegistry::GModelSpatialRegistry(void) | ||
| 61 | #if defined(G_DEBUG_REGISTRY) | 64 | #if defined(G_DEBUG_REGISTRY) |
| 62 | std::cout << "GModelSpatialRegistry(void): "; | 65 | std::cout << "GModelSpatialRegistry(void): "; |
| 63 | for (int i = 0; i < size(); ++i) { | 66 | for (int i = 0; i < size(); ++i) { |
| 64 | - std::cout << "\"" << names()[i] << "\" "; | 67 | + std::cout << "\"" << models()[i]->type() << "\" "; |
| 65 | } | 68 | } |
| 66 | std::cout << std::endl; | 69 | std::cout << std::endl; |
| 67 | #endif | 70 | #endif |
| @@ -91,21 +94,17 @@ GModelSpatialRegistry::GModelSpatialRegistry(const GModelSpatial* model) | @@ -91,21 +94,17 @@ GModelSpatialRegistry::GModelSpatialRegistry(const GModelSpatial* model) | ||
| 91 | #endif | 94 | #endif |
| 92 | 95 | ||
| 93 | // Allocate new registry | 96 | // Allocate new registry |
| 94 | - std::string* new_names = new std::string[size()+1]; | ||
| 95 | const GModelSpatial** new_models = new const GModelSpatial*[size()+1]; | 97 | const GModelSpatial** new_models = new const GModelSpatial*[size()+1]; |
| 96 | 98 | ||
| 97 | // Save old registry | 99 | // Save old registry |
| 98 | for (int i = 0; i < size(); ++i) { | 100 | for (int i = 0; i < size(); ++i) { |
| 99 | - new_names[i] = names()[i]; | ||
| 100 | new_models[i] = models()[i]; | 101 | new_models[i] = models()[i]; |
| 101 | } | 102 | } |
| 102 | 103 | ||
| 103 | // Add new model to registry | 104 | // Add new model to registry |
| 104 | - new_names[size()] = model->type(); | ||
| 105 | new_models[size()] = model; | 105 | new_models[size()] = model; |
| 106 | 106 | ||
| 107 | // Set pointers on new registry | 107 | // Set pointers on new registry |
| 108 | - names().assign(new_names); | ||
| 109 | models().assign(new_models); | 108 | models().assign(new_models); |
| 110 | 109 | ||
| 111 | // Increment number of models in registry | 110 | // Increment number of models in registry |
| @@ -115,7 +114,7 @@ GModelSpatialRegistry::GModelSpatialRegistry(const GModelSpatial* model) | @@ -115,7 +114,7 @@ GModelSpatialRegistry::GModelSpatialRegistry(const GModelSpatial* model) | ||
| 115 | #if defined(G_DEBUG_REGISTRY) | 114 | #if defined(G_DEBUG_REGISTRY) |
| 116 | std::cout << "GModelSpatialRegistry(const GModelSpatial*): "; | 115 | std::cout << "GModelSpatialRegistry(const GModelSpatial*): "; |
| 117 | for (int i = 0; i < size(); ++i) { | 116 | for (int i = 0; i < size(); ++i) { |
| 118 | - std::cout << "\"" << names()[i] << "\" "; | 117 | + std::cout << "\"" << models()[i]->type() << "\" "; |
| 119 | } | 118 | } |
| 120 | std::cout << std::endl; | 119 | std::cout << std::endl; |
| 121 | #endif | 120 | #endif |
| @@ -196,29 +195,47 @@ GModelSpatialRegistry& GModelSpatialRegistry::operator=(const GModelSpatialRegis | @@ -196,29 +195,47 @@ GModelSpatialRegistry& GModelSpatialRegistry::operator=(const GModelSpatialRegis | ||
| 196 | ==========================================================================*/ | 195 | ==========================================================================*/ |
| 197 | 196 | ||
| 198 | /***********************************************************************//** | 197 | /***********************************************************************//** |
| 199 | - * @brief Allocate spatial model of given name | 198 | + * @brief Allocate spatial model that is found in XML element |
| 200 | * | 199 | * |
| 201 | - * @param[in] name Model name. | ||
| 202 | - * @return Pointer to model (NULL if name is not registered). | 200 | + * @param[in] xml XML element. |
| 201 | + * @return Pointer to spatial model. | ||
| 203 | * | 202 | * |
| 204 | - * Returns a pointer to a void spatial model instance of the specified | ||
| 205 | - * name. If the name has not been found in the registry, a NULL pointer is | ||
| 206 | - * returned. | 203 | + * @exception GException::invalid_value |
| 204 | + * No appropriate spatial model found in XML element. | ||
| 205 | + * | ||
| 206 | + * Returns a pointer to a spatial model instance that corresponds to the | ||
| 207 | + * type found in an XML element. If no appropriate model is found the method | ||
| 208 | + * will throw an exception. | ||
| 207 | ***************************************************************************/ | 209 | ***************************************************************************/ |
| 208 | -GModelSpatial* GModelSpatialRegistry::alloc(const std::string& name) const | 210 | +GModelSpatial* GModelSpatialRegistry::alloc(const GXmlElement& xml) const |
| 209 | { | 211 | { |
| 210 | // Initialise spatial model | 212 | // Initialise spatial model |
| 211 | GModelSpatial* model = NULL; | 213 | GModelSpatial* model = NULL; |
| 212 | 214 | ||
| 213 | - // Search for model in registry | 215 | + // Search for model type in registry |
| 214 | for (int i = 0; i < size(); ++i) { | 216 | for (int i = 0; i < size(); ++i) { |
| 215 | - if (names()[i] == name) { | 217 | + if (models()[i]->type() == xml.attribute("type")) { |
| 216 | model = models()[i]->clone(); | 218 | model = models()[i]->clone(); |
| 217 | break; | 219 | break; |
| 218 | } | 220 | } |
| 219 | } | 221 | } |
| 220 | 222 | ||
| 221 | - // Return spatial model | 223 | + // If no model has been found then throw an exception |
| 224 | + if (model == NULL) { | ||
| 225 | + std::string msg = "Spatial model of type \""+xml.attribute("type")+ | ||
| 226 | + "\" not found in registry. Possible spatial model " | ||
| 227 | + "types are:"; | ||
| 228 | + for (int i = 0; i < size(); ++i) { | ||
| 229 | + msg += " \""+models()[i]->type()+"\""; | ||
| 230 | + } | ||
| 231 | + msg += "."; | ||
| 232 | + throw GException::invalid_value(G_ALLOC, msg); | ||
| 233 | + } | ||
| 234 | + | ||
| 235 | + // Read model from XML element | ||
| 236 | + model->read(xml); | ||
| 237 | + | ||
| 238 | + // Return spectral model | ||
| 222 | return model; | 239 | return model; |
| 223 | } | 240 | } |
| 224 | 241 | ||
| @@ -237,12 +254,13 @@ std::string GModelSpatialRegistry::name(const int& index) const | @@ -237,12 +254,13 @@ std::string GModelSpatialRegistry::name(const int& index) const | ||
| 237 | // Compile option: raise exception if index is out of range | 254 | // Compile option: raise exception if index is out of range |
| 238 | #if defined(G_RANGE_CHECK) | 255 | #if defined(G_RANGE_CHECK) |
| 239 | if (index < 0 || index >= size()) { | 256 | if (index < 0 || index >= size()) { |
| 240 | - throw GException::out_of_range(G_NAME, index, 0, size()-1); | 257 | + throw GException::out_of_range(G_NAME, "Spatial model index", index, |
| 258 | + size()); | ||
| 241 | } | 259 | } |
| 242 | #endif | 260 | #endif |
| 243 | 261 | ||
| 244 | // Return name | 262 | // Return name |
| 245 | - return (names()[index]); | 263 | + return (models()[index]->type()); |
| 246 | } | 264 | } |
| 247 | 265 | ||
| 248 | 266 | ||
| @@ -270,8 +288,15 @@ std::string GModelSpatialRegistry::print(const GChatter& chatter) const | @@ -270,8 +288,15 @@ std::string GModelSpatialRegistry::print(const GChatter& chatter) const | ||
| 270 | // NORMAL: Append models | 288 | // NORMAL: Append models |
| 271 | if (chatter >= NORMAL) { | 289 | if (chatter >= NORMAL) { |
| 272 | for (int i = 0; i < size(); ++i) { | 290 | for (int i = 0; i < size(); ++i) { |
| 273 | - result.append("\n"+gammalib::parformat(names()[i])); | ||
| 274 | - result.append(models()[i]->type()); | 291 | + result.append("\n"+gammalib::parformat(models()[i]->type())); |
| 292 | + for (int k = 0; k < models()[i]->size(); ++k) { | ||
| 293 | + if (k > 0) { | ||
| 294 | + result.append(", "); | ||
| 295 | + } | ||
| 296 | + result.append("\""); | ||
| 297 | + result.append((*(models()[i]))[k].name()); | ||
| 298 | + result.append("\""); | ||
| 299 | + } | ||
| 275 | } | 300 | } |
| 276 | } | 301 | } |
| 277 | 302 |
src/model/GModelSpectralRegistry.cpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GModelSpectralRegistry.cpp - Spectral model registry class * | 2 | * GModelSpectralRegistry.cpp - Spectral model registry class * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2011-2013 by Juergen Knoedlseder * | 4 | + * copyright (C) 2011-2016 by Juergen Knoedlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software: you can redistribute it and/or modify * | 7 | * This program is free software: you can redistribute it and/or modify * |
| @@ -28,11 +28,14 @@ | @@ -28,11 +28,14 @@ | ||
| 28 | #ifdef HAVE_CONFIG_H | 28 | #ifdef HAVE_CONFIG_H |
| 29 | #include <config.h> | 29 | #include <config.h> |
| 30 | #endif | 30 | #endif |
| 31 | +#include "GModelPar.hpp" | ||
| 32 | +#include "GModelSpectral.hpp" | ||
| 31 | #include "GModelSpectralRegistry.hpp" | 33 | #include "GModelSpectralRegistry.hpp" |
| 32 | #include "GException.hpp" | 34 | #include "GException.hpp" |
| 33 | #include "GTools.hpp" | 35 | #include "GTools.hpp" |
| 34 | 36 | ||
| 35 | /* __ Method name definitions ____________________________________________ */ | 37 | /* __ Method name definitions ____________________________________________ */ |
| 38 | +#define G_ALLOC "GModelSpectralRegistry::alloc(GXmlElement&)" | ||
| 36 | #define G_NAME "GModelSpectralRegistry::name(int&)" | 39 | #define G_NAME "GModelSpectralRegistry::name(int&)" |
| 37 | 40 | ||
| 38 | /* __ Macros _____________________________________________________________ */ | 41 | /* __ Macros _____________________________________________________________ */ |
| @@ -61,7 +64,7 @@ GModelSpectralRegistry::GModelSpectralRegistry(void) | @@ -61,7 +64,7 @@ GModelSpectralRegistry::GModelSpectralRegistry(void) | ||
| 61 | #if G_DEBUG_REGISTRY | 64 | #if G_DEBUG_REGISTRY |
| 62 | std::cout << "GModelSpectralRegistry(void): "; | 65 | std::cout << "GModelSpectralRegistry(void): "; |
| 63 | for (int i = 0; i < size(); ++i) { | 66 | for (int i = 0; i < size(); ++i) { |
| 64 | - std::cout << "\"" << names()[i] << "\" "; | 67 | + std::cout << "\"" << models()[i]->type() << "\" "; |
| 65 | } | 68 | } |
| 66 | std::cout << std::endl; | 69 | std::cout << std::endl; |
| 67 | #endif | 70 | #endif |
| @@ -75,6 +78,9 @@ GModelSpectralRegistry::GModelSpectralRegistry(void) | @@ -75,6 +78,9 @@ GModelSpectralRegistry::GModelSpectralRegistry(void) | ||
| 75 | * @brief Model constructor | 78 | * @brief Model constructor |
| 76 | * | 79 | * |
| 77 | * @param[in] model Model. | 80 | * @param[in] model Model. |
| 81 | + * | ||
| 82 | + * Construct registry by adding a model to the registry. This is the standard | ||
| 83 | + * constructor that is used to register a new model to GammaLib. | ||
| 78 | ***************************************************************************/ | 84 | ***************************************************************************/ |
| 79 | GModelSpectralRegistry::GModelSpectralRegistry(const GModelSpectral* model) | 85 | GModelSpectralRegistry::GModelSpectralRegistry(const GModelSpectral* model) |
| 80 | { | 86 | { |
| @@ -88,21 +94,17 @@ GModelSpectralRegistry::GModelSpectralRegistry(const GModelSpectral* model) | @@ -88,21 +94,17 @@ GModelSpectralRegistry::GModelSpectralRegistry(const GModelSpectral* model) | ||
| 88 | #endif | 94 | #endif |
| 89 | 95 | ||
| 90 | // Allocate new registry | 96 | // Allocate new registry |
| 91 | - std::string* new_names = new std::string[size()+1]; | ||
| 92 | const GModelSpectral** new_models = new const GModelSpectral*[size()+1]; | 97 | const GModelSpectral** new_models = new const GModelSpectral*[size()+1]; |
| 93 | 98 | ||
| 94 | // Save old registry | 99 | // Save old registry |
| 95 | for (int i = 0; i < size(); ++i) { | 100 | for (int i = 0; i < size(); ++i) { |
| 96 | - new_names[i] = names()[i]; | ||
| 97 | new_models[i] = models()[i]; | 101 | new_models[i] = models()[i]; |
| 98 | } | 102 | } |
| 99 | 103 | ||
| 100 | // Add new model to registry | 104 | // Add new model to registry |
| 101 | - new_names[size()] = model->type(); | ||
| 102 | new_models[size()] = model; | 105 | new_models[size()] = model; |
| 103 | 106 | ||
| 104 | // Set pointers on new registry | 107 | // Set pointers on new registry |
| 105 | - names().assign(new_names); | ||
| 106 | models().assign(new_models); | 108 | models().assign(new_models); |
| 107 | 109 | ||
| 108 | // Increment number of models in registry | 110 | // Increment number of models in registry |
| @@ -110,9 +112,9 @@ GModelSpectralRegistry::GModelSpectralRegistry(const GModelSpectral* model) | @@ -110,9 +112,9 @@ GModelSpectralRegistry::GModelSpectralRegistry(const GModelSpectral* model) | ||
| 110 | 112 | ||
| 111 | // Debug option: Show actual registry | 113 | // Debug option: Show actual registry |
| 112 | #if G_DEBUG_REGISTRY | 114 | #if G_DEBUG_REGISTRY |
| 113 | - std::cout << "GModelSpectralRegistry(const GModelSpatial*): "; | 115 | + std::cout << "GModelSpectralRegistry(const GModelSpectral*): "; |
| 114 | for (int i = 0; i < size(); ++i) { | 116 | for (int i = 0; i < size(); ++i) { |
| 115 | - std::cout << "\"" << names()[i] << "\" "; | 117 | + std::cout << "\"" << models()[i]->type() << "\" "; |
| 116 | } | 118 | } |
| 117 | std::cout << std::endl; | 119 | std::cout << std::endl; |
| 118 | #endif | 120 | #endif |
| @@ -165,7 +167,7 @@ GModelSpectralRegistry::~GModelSpectralRegistry(void) | @@ -165,7 +167,7 @@ GModelSpectralRegistry::~GModelSpectralRegistry(void) | ||
| 165 | * @param[in] registry Registry. | 167 | * @param[in] registry Registry. |
| 166 | * @return Reference to registry. | 168 | * @return Reference to registry. |
| 167 | ***************************************************************************/ | 169 | ***************************************************************************/ |
| 168 | -GModelSpectralRegistry& GModelSpectralRegistry::operator= (const GModelSpectralRegistry& registry) | 170 | +GModelSpectralRegistry& GModelSpectralRegistry::operator=(const GModelSpectralRegistry& registry) |
| 169 | { | 171 | { |
| 170 | // Execute only if object is not identical | 172 | // Execute only if object is not identical |
| 171 | if (this != ®istry) { | 173 | if (this != ®istry) { |
| @@ -193,28 +195,46 @@ GModelSpectralRegistry& GModelSpectralRegistry::operator= (const GModelSpectralR | @@ -193,28 +195,46 @@ GModelSpectralRegistry& GModelSpectralRegistry::operator= (const GModelSpectralR | ||
| 193 | ==========================================================================*/ | 195 | ==========================================================================*/ |
| 194 | 196 | ||
| 195 | /***********************************************************************//** | 197 | /***********************************************************************//** |
| 196 | - * @brief Allocate spectral model of given name | 198 | + * @brief Allocate spectral model that is found in XML element |
| 197 | * | 199 | * |
| 198 | - * @param[in] name Spectral model name. | ||
| 199 | - * @return Pointer to spectral model (NULL if name is not registered). | 200 | + * @param[in] xml XML element. |
| 201 | + * @return Pointer to spectral model. | ||
| 200 | * | 202 | * |
| 201 | - * Returns a pointer to a spectral model instance of the specified name. | ||
| 202 | - * If the name has not been found in the registry, a NULL pointer is | ||
| 203 | - * returned. | 203 | + * @exception GException::invalid_value |
| 204 | + * No appropriate spectral model found in XML element. | ||
| 205 | + * | ||
| 206 | + * Returns a pointer to a spectral model instance that corresponds to the | ||
| 207 | + * type and parameters found in an XML element. If no appropriate model is | ||
| 208 | + * found the method will throw an exception. | ||
| 204 | ***************************************************************************/ | 209 | ***************************************************************************/ |
| 205 | -GModelSpectral* GModelSpectralRegistry::alloc(const std::string& name) const | 210 | +GModelSpectral* GModelSpectralRegistry::alloc(const GXmlElement& xml) const |
| 206 | { | 211 | { |
| 207 | // Initialise spectral model | 212 | // Initialise spectral model |
| 208 | GModelSpectral* model = NULL; | 213 | GModelSpectral* model = NULL; |
| 209 | 214 | ||
| 210 | - // Search for model in registry | 215 | + // Search for model type in registry |
| 211 | for (int i = 0; i < size(); ++i) { | 216 | for (int i = 0; i < size(); ++i) { |
| 212 | - if (names()[i] == name) { | 217 | + if (models()[i]->type() == xml.attribute("type")) { |
| 213 | model = models()[i]->clone(); | 218 | model = models()[i]->clone(); |
| 214 | break; | 219 | break; |
| 215 | } | 220 | } |
| 216 | } | 221 | } |
| 217 | 222 | ||
| 223 | + // If no model has been found then throw an exception | ||
| 224 | + if (model == NULL) { | ||
| 225 | + std::string msg = "Spectral model of type \""+xml.attribute("type")+ | ||
| 226 | + "\" not found in registry. Possible spectral model " | ||
| 227 | + "types are:"; | ||
| 228 | + for (int i = 0; i < size(); ++i) { | ||
| 229 | + msg += " \""+models()[i]->type()+"\""; | ||
| 230 | + } | ||
| 231 | + msg += "."; | ||
| 232 | + throw GException::invalid_value(G_ALLOC, msg); | ||
| 233 | + } | ||
| 234 | + | ||
| 235 | + // Read model from XML element | ||
| 236 | + model->read(xml); | ||
| 237 | + | ||
| 218 | // Return spectral model | 238 | // Return spectral model |
| 219 | return model; | 239 | return model; |
| 220 | } | 240 | } |
| @@ -234,19 +254,20 @@ std::string GModelSpectralRegistry::name(const int& index) const | @@ -234,19 +254,20 @@ std::string GModelSpectralRegistry::name(const int& index) const | ||
| 234 | // Compile option: raise exception if index is out of range | 254 | // Compile option: raise exception if index is out of range |
| 235 | #if defined(G_RANGE_CHECK) | 255 | #if defined(G_RANGE_CHECK) |
| 236 | if (index < 0 || index >= size()) { | 256 | if (index < 0 || index >= size()) { |
| 237 | - throw GException::out_of_range(G_NAME, index, 0, size()-1); | 257 | + throw GException::out_of_range(G_NAME, "Spectral model index", index, |
| 258 | + size()); | ||
| 238 | } | 259 | } |
| 239 | #endif | 260 | #endif |
| 240 | 261 | ||
| 241 | // Return name | 262 | // Return name |
| 242 | - return (names()[index]); | 263 | + return (models()[index]->type()); |
| 243 | } | 264 | } |
| 244 | 265 | ||
| 245 | 266 | ||
| 246 | /***********************************************************************//** | 267 | /***********************************************************************//** |
| 247 | * @brief Print registry information | 268 | * @brief Print registry information |
| 248 | * | 269 | * |
| 249 | - * @param[in] chatter Chattiness (defaults to NORMAL). | 270 | + * @param[in] chatter Chattiness. |
| 250 | * @return Registry content. | 271 | * @return Registry content. |
| 251 | ***************************************************************************/ | 272 | ***************************************************************************/ |
| 252 | std::string GModelSpectralRegistry::print(const GChatter& chatter) const | 273 | std::string GModelSpectralRegistry::print(const GChatter& chatter) const |
| @@ -265,8 +286,15 @@ std::string GModelSpectralRegistry::print(const GChatter& chatter) const | @@ -265,8 +286,15 @@ std::string GModelSpectralRegistry::print(const GChatter& chatter) const | ||
| 265 | // NORMAL: Append models | 286 | // NORMAL: Append models |
| 266 | if (chatter >= NORMAL) { | 287 | if (chatter >= NORMAL) { |
| 267 | for (int i = 0; i < size(); ++i) { | 288 | for (int i = 0; i < size(); ++i) { |
| 268 | - result.append("\n"+gammalib::parformat(names()[i])); | ||
| 269 | - result.append(models()[i]->type()); | 289 | + result.append("\n"+gammalib::parformat(models()[i]->type())); |
| 290 | + for (int k = 0; k < models()[i]->size(); ++k) { | ||
| 291 | + if (k > 0) { | ||
| 292 | + result.append(", "); | ||
| 293 | + } | ||
| 294 | + result.append("\""); | ||
| 295 | + result.append((*(models()[i]))[k].name()); | ||
| 296 | + result.append("\""); | ||
| 297 | + } | ||
| 270 | } | 298 | } |
| 271 | } | 299 | } |
| 272 | 300 | ||
| @@ -276,6 +304,7 @@ std::string GModelSpectralRegistry::print(const GChatter& chatter) const | @@ -276,6 +304,7 @@ std::string GModelSpectralRegistry::print(const GChatter& chatter) const | ||
| 276 | return result; | 304 | return result; |
| 277 | } | 305 | } |
| 278 | 306 | ||
| 307 | + | ||
| 279 | /*========================================================================== | 308 | /*========================================================================== |
| 280 | = = | 309 | = = |
| 281 | = Private methods = | 310 | = Private methods = |
src/model/GModelTemporalRegistry.cpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GModelTemporalRegistry.cpp - Temporal model registry class * | 2 | * GModelTemporalRegistry.cpp - Temporal model registry class * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2011-2013 by Juergen Knoedlseder * | 4 | + * copyright (C) 2011-2016 by Juergen Knoedlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software: you can redistribute it and/or modify * | 7 | * This program is free software: you can redistribute it and/or modify * |
| @@ -28,11 +28,14 @@ | @@ -28,11 +28,14 @@ | ||
| 28 | #ifdef HAVE_CONFIG_H | 28 | #ifdef HAVE_CONFIG_H |
| 29 | #include <config.h> | 29 | #include <config.h> |
| 30 | #endif | 30 | #endif |
| 31 | +#include "GModelPar.hpp" | ||
| 32 | +#include "GModelTemporal.hpp" | ||
| 31 | #include "GModelTemporalRegistry.hpp" | 33 | #include "GModelTemporalRegistry.hpp" |
| 32 | #include "GException.hpp" | 34 | #include "GException.hpp" |
| 33 | #include "GTools.hpp" | 35 | #include "GTools.hpp" |
| 34 | 36 | ||
| 35 | /* __ Method name definitions ____________________________________________ */ | 37 | /* __ Method name definitions ____________________________________________ */ |
| 38 | +#define G_ALLOC "GModelTemporalRegistry::alloc(GXmlElement&)" | ||
| 36 | #define G_NAME "GModelTemporalRegistry::name(int&)" | 39 | #define G_NAME "GModelTemporalRegistry::name(int&)" |
| 37 | 40 | ||
| 38 | /* __ Macros _____________________________________________________________ */ | 41 | /* __ Macros _____________________________________________________________ */ |
| @@ -61,7 +64,7 @@ GModelTemporalRegistry::GModelTemporalRegistry(void) | @@ -61,7 +64,7 @@ GModelTemporalRegistry::GModelTemporalRegistry(void) | ||
| 61 | #if G_DEBUG_REGISTRY | 64 | #if G_DEBUG_REGISTRY |
| 62 | std::cout << "GModelTemporalRegistry(void): "; | 65 | std::cout << "GModelTemporalRegistry(void): "; |
| 63 | for (int i = 0; i < size(); ++i) { | 66 | for (int i = 0; i < size(); ++i) { |
| 64 | - std::cout << "\"" << names()[i] << "\" "; | 67 | + std::cout << "\"" << models()[i]->type() << "\" "; |
| 65 | } | 68 | } |
| 66 | std::cout << std::endl; | 69 | std::cout << std::endl; |
| 67 | #endif | 70 | #endif |
| @@ -75,6 +78,9 @@ GModelTemporalRegistry::GModelTemporalRegistry(void) | @@ -75,6 +78,9 @@ GModelTemporalRegistry::GModelTemporalRegistry(void) | ||
| 75 | * @brief Model constructor | 78 | * @brief Model constructor |
| 76 | * | 79 | * |
| 77 | * @param[in] model Model. | 80 | * @param[in] model Model. |
| 81 | + * | ||
| 82 | + * Construct registry by adding a model to the registry. This is the standard | ||
| 83 | + * constructor that is used to register a new model to GammaLib. | ||
| 78 | ***************************************************************************/ | 84 | ***************************************************************************/ |
| 79 | GModelTemporalRegistry::GModelTemporalRegistry(const GModelTemporal* model) | 85 | GModelTemporalRegistry::GModelTemporalRegistry(const GModelTemporal* model) |
| 80 | { | 86 | { |
| @@ -88,21 +94,17 @@ GModelTemporalRegistry::GModelTemporalRegistry(const GModelTemporal* model) | @@ -88,21 +94,17 @@ GModelTemporalRegistry::GModelTemporalRegistry(const GModelTemporal* model) | ||
| 88 | #endif | 94 | #endif |
| 89 | 95 | ||
| 90 | // Allocate new registry | 96 | // Allocate new registry |
| 91 | - std::string* new_names = new std::string[size()+1]; | ||
| 92 | const GModelTemporal** new_models = new const GModelTemporal*[size()+1]; | 97 | const GModelTemporal** new_models = new const GModelTemporal*[size()+1]; |
| 93 | 98 | ||
| 94 | // Save old registry | 99 | // Save old registry |
| 95 | for (int i = 0; i < size(); ++i) { | 100 | for (int i = 0; i < size(); ++i) { |
| 96 | - new_names[i] = names()[i]; | ||
| 97 | new_models[i] = models()[i]; | 101 | new_models[i] = models()[i]; |
| 98 | } | 102 | } |
| 99 | 103 | ||
| 100 | // Add new model to registry | 104 | // Add new model to registry |
| 101 | - new_names[size()] = model->type(); | ||
| 102 | new_models[size()] = model; | 105 | new_models[size()] = model; |
| 103 | 106 | ||
| 104 | // Set pointers on new registry | 107 | // Set pointers on new registry |
| 105 | - names().assign(new_names); | ||
| 106 | models().assign(new_models); | 108 | models().assign(new_models); |
| 107 | 109 | ||
| 108 | // Increment number of models in registry | 110 | // Increment number of models in registry |
| @@ -112,7 +114,7 @@ GModelTemporalRegistry::GModelTemporalRegistry(const GModelTemporal* model) | @@ -112,7 +114,7 @@ GModelTemporalRegistry::GModelTemporalRegistry(const GModelTemporal* model) | ||
| 112 | #if G_DEBUG_REGISTRY | 114 | #if G_DEBUG_REGISTRY |
| 113 | std::cout << "GModelTemporalRegistry(const GModelTemporal*): "; | 115 | std::cout << "GModelTemporalRegistry(const GModelTemporal*): "; |
| 114 | for (int i = 0; i < size(); ++i) { | 116 | for (int i = 0; i < size(); ++i) { |
| 115 | - std::cout << "\"" << names()[i] << "\" "; | 117 | + std::cout << "\"" << models()[i]->type() << "\" "; |
| 116 | } | 118 | } |
| 117 | std::cout << std::endl; | 119 | std::cout << std::endl; |
| 118 | #endif | 120 | #endif |
| @@ -193,28 +195,46 @@ GModelTemporalRegistry& GModelTemporalRegistry::operator=(const GModelTemporalRe | @@ -193,28 +195,46 @@ GModelTemporalRegistry& GModelTemporalRegistry::operator=(const GModelTemporalRe | ||
| 193 | ==========================================================================*/ | 195 | ==========================================================================*/ |
| 194 | 196 | ||
| 195 | /***********************************************************************//** | 197 | /***********************************************************************//** |
| 196 | - * @brief Allocate temporal model of given name | 198 | + * @brief Allocate temporal model that is found in XML element |
| 199 | + * | ||
| 200 | + * @param[in] xml XML element. | ||
| 201 | + * @return Pointer to temporal model. | ||
| 197 | * | 202 | * |
| 198 | - * @param[in] name Temporal model name. | ||
| 199 | - * @return Pointer to temporal model (NULL if name is not registered). | 203 | + * @exception GException::invalid_value |
| 204 | + * No appropriate temporal model found in XML element. | ||
| 200 | * | 205 | * |
| 201 | - * Returns a pointer to a temporal model instance of the specified name. | ||
| 202 | - * If the name has not been found in the registry, a NULL pointer is | ||
| 203 | - * returned. | 206 | + * Returns a pointer to a temporal model instance that corresponds to the |
| 207 | + * type found in an XML element. If no appropriate model is found the method | ||
| 208 | + * will throw an exception. | ||
| 204 | ***************************************************************************/ | 209 | ***************************************************************************/ |
| 205 | -GModelTemporal* GModelTemporalRegistry::alloc(const std::string& name) const | 210 | +GModelTemporal* GModelTemporalRegistry::alloc(const GXmlElement& xml) const |
| 206 | { | 211 | { |
| 207 | // Initialise temporal model | 212 | // Initialise temporal model |
| 208 | GModelTemporal* model = NULL; | 213 | GModelTemporal* model = NULL; |
| 209 | 214 | ||
| 210 | - // Search for model in registry | 215 | + // Search for model type in registry |
| 211 | for (int i = 0; i < size(); ++i) { | 216 | for (int i = 0; i < size(); ++i) { |
| 212 | - if (names()[i] == name) { | 217 | + if (models()[i]->type() == xml.attribute("type")) { |
| 213 | model = models()[i]->clone(); | 218 | model = models()[i]->clone(); |
| 214 | break; | 219 | break; |
| 215 | } | 220 | } |
| 216 | } | 221 | } |
| 217 | 222 | ||
| 223 | + // If no model has been found then throw an exception | ||
| 224 | + if (model == NULL) { | ||
| 225 | + std::string msg = "Temporal model of type \""+xml.attribute("type")+ | ||
| 226 | + "\" not found in registry. Possible temporal model " | ||
| 227 | + "types are:"; | ||
| 228 | + for (int i = 0; i < size(); ++i) { | ||
| 229 | + msg += " \""+models()[i]->type()+"\""; | ||
| 230 | + } | ||
| 231 | + msg += "."; | ||
| 232 | + throw GException::invalid_value(G_ALLOC, msg); | ||
| 233 | + } | ||
| 234 | + | ||
| 235 | + // Read model from XML element | ||
| 236 | + model->read(xml); | ||
| 237 | + | ||
| 218 | // Return temporal model | 238 | // Return temporal model |
| 219 | return model; | 239 | return model; |
| 220 | } | 240 | } |
| @@ -234,19 +254,20 @@ std::string GModelTemporalRegistry::name(const int& index) const | @@ -234,19 +254,20 @@ std::string GModelTemporalRegistry::name(const int& index) const | ||
| 234 | // Compile option: raise exception if index is out of range | 254 | // Compile option: raise exception if index is out of range |
| 235 | #if defined(G_RANGE_CHECK) | 255 | #if defined(G_RANGE_CHECK) |
| 236 | if (index < 0 || index >= size()) { | 256 | if (index < 0 || index >= size()) { |
| 237 | - throw GException::out_of_range(G_NAME, index, 0, size()-1); | 257 | + throw GException::out_of_range(G_NAME, "Temporal model index", index, |
| 258 | + size()); | ||
| 238 | } | 259 | } |
| 239 | #endif | 260 | #endif |
| 240 | 261 | ||
| 241 | // Return name | 262 | // Return name |
| 242 | - return (names()[index]); | 263 | + return (models()[index]->type()); |
| 243 | } | 264 | } |
| 244 | 265 | ||
| 245 | 266 | ||
| 246 | /***********************************************************************//** | 267 | /***********************************************************************//** |
| 247 | * @brief Print registry information | 268 | * @brief Print registry information |
| 248 | * | 269 | * |
| 249 | - * @param[in] chatter Chattiness (defaults to NORMAL). | 270 | + * @param[in] chatter Chattiness. |
| 250 | * @return Registry content. | 271 | * @return Registry content. |
| 251 | ***************************************************************************/ | 272 | ***************************************************************************/ |
| 252 | std::string GModelTemporalRegistry::print(const GChatter& chatter) const | 273 | std::string GModelTemporalRegistry::print(const GChatter& chatter) const |
| @@ -267,8 +288,15 @@ std::string GModelTemporalRegistry::print(const GChatter& chatter) const | @@ -267,8 +288,15 @@ std::string GModelTemporalRegistry::print(const GChatter& chatter) const | ||
| 267 | // NORMAL: Append models | 288 | // NORMAL: Append models |
| 268 | if (chatter >= NORMAL) { | 289 | if (chatter >= NORMAL) { |
| 269 | for (int i = 0; i < size(); ++i) { | 290 | for (int i = 0; i < size(); ++i) { |
| 270 | - result.append("\n"+gammalib::parformat(names()[i])); | ||
| 271 | - result.append(models()[i]->type()); | 291 | + result.append("\n"+gammalib::parformat(models()[i]->type())); |
| 292 | + for (int k = 0; k < models()[i]->size(); ++k) { | ||
| 293 | + if (k > 0) { | ||
| 294 | + result.append(", "); | ||
| 295 | + } | ||
| 296 | + result.append("\""); | ||
| 297 | + result.append((*(models()[i]))[k].name()); | ||
| 298 | + result.append("\""); | ||
| 299 | + } | ||
| 272 | } | 300 | } |
| 273 | } | 301 | } |
| 274 | 302 |
test/test_GModel.cpp
| @@ -2604,16 +2604,6 @@ void TestGModel::test_models(void) | @@ -2604,16 +2604,6 @@ void TestGModel::test_models(void) | ||
| 2604 | ***************************************************************************/ | 2604 | ***************************************************************************/ |
| 2605 | void TestGModel::test_model_registry(void) | 2605 | void TestGModel::test_model_registry(void) |
| 2606 | { | 2606 | { |
| 2607 | - // Test GModelRegistry void constructor | ||
| 2608 | - test_try("Test GModelRegistry void constructor"); | ||
| 2609 | - try { | ||
| 2610 | - GModelRegistry registry; | ||
| 2611 | - test_try_success(); | ||
| 2612 | - } | ||
| 2613 | - catch (std::exception &e) { | ||
| 2614 | - test_try_failure(e); | ||
| 2615 | - } | ||
| 2616 | - | ||
| 2617 | // Test GModelRegistry allocators | 2607 | // Test GModelRegistry allocators |
| 2618 | test_try("Test GModelRegistry model allocation"); | 2608 | test_try("Test GModelRegistry model allocation"); |
| 2619 | try { | 2609 | try { |
| @@ -2641,110 +2631,45 @@ void TestGModel::test_model_registry(void) | @@ -2641,110 +2631,45 @@ void TestGModel::test_model_registry(void) | ||
| 2641 | test_try_failure(e); | 2631 | test_try_failure(e); |
| 2642 | } | 2632 | } |
| 2643 | 2633 | ||
| 2644 | - // Test GModelSpatialRegistry void constructor | ||
| 2645 | - test_try("Test GModelSpatialRegistry void constructor"); | 2634 | + // Test GModelSpatialRegistry allocator for invalid XML element |
| 2635 | + test_try("Test GModelSpatialRegistry allocator for invalid XML element"); | ||
| 2646 | try { | 2636 | try { |
| 2637 | + GXmlElement xml; | ||
| 2647 | GModelSpatialRegistry registry; | 2638 | GModelSpatialRegistry registry; |
| 2648 | - test_try_success(); | 2639 | + GModelSpatial* ptr = registry.alloc(xml); |
| 2640 | + test_try_failure("Invalid XML element shall throw an exception"); | ||
| 2649 | } | 2641 | } |
| 2650 | - catch (std::exception &e) { | ||
| 2651 | - test_try_failure(e); | ||
| 2652 | - } | ||
| 2653 | - | ||
| 2654 | - // Test GModelSpatialRegistry allocators | ||
| 2655 | - test_try("Test GModelSpatialRegistry model allocation"); | ||
| 2656 | - try { | ||
| 2657 | - // Loop over all models in registry | ||
| 2658 | - GModelSpatialRegistry registry; | ||
| 2659 | - int num = registry.size(); | ||
| 2660 | - for (int i = 0; i < num; ++i) { | ||
| 2661 | - GModelSpatial* ptr = registry.alloc(registry.name(i)); | ||
| 2662 | - test_assert(ptr != NULL, | ||
| 2663 | - "Model pointer for \""+ registry.name(i)+"\" is NULL"); | ||
| 2664 | - if (ptr != NULL) { | ||
| 2665 | - | ||
| 2666 | - // Test model type | ||
| 2667 | - test_assert(ptr->type() == registry.name(i), | ||
| 2668 | - "Expected \""+registry.name(i)+"\" instead" | ||
| 2669 | - " of \""+ptr->type()+"\"."); | ||
| 2670 | - | ||
| 2671 | - // Free model | ||
| 2672 | - delete ptr; | ||
| 2673 | - } | ||
| 2674 | - } // endfor: looped over all models | 2642 | + catch (GException::invalid_value &e) { |
| 2675 | test_try_success(); | 2643 | test_try_success(); |
| 2676 | } | 2644 | } |
| 2677 | catch (std::exception &e) { | 2645 | catch (std::exception &e) { |
| 2678 | test_try_failure(e); | 2646 | test_try_failure(e); |
| 2679 | } | 2647 | } |
| 2680 | 2648 | ||
| 2681 | - // Test GModelSpectralRegistry void constructor | ||
| 2682 | - test_try("Test GModelSpectralRegistry void constructor"); | 2649 | + // Test GModelSpectralRegistry allocator for invalid XML element |
| 2650 | + test_try("Test GModelSpectralRegistry allocator for invalid XML element"); | ||
| 2683 | try { | 2651 | try { |
| 2652 | + GXmlElement xml; | ||
| 2684 | GModelSpectralRegistry registry; | 2653 | GModelSpectralRegistry registry; |
| 2685 | - test_try_success(); | ||
| 2686 | - } | ||
| 2687 | - catch (std::exception &e) { | ||
| 2688 | - test_try_failure(e); | 2654 | + GModelSpectral* ptr = registry.alloc(xml); |
| 2655 | + test_try_failure("Invalid XML element shall throw an exception"); | ||
| 2689 | } | 2656 | } |
| 2690 | - | ||
| 2691 | - // Test GModelSpectralRegistry allocators | ||
| 2692 | - test_try("Test GModelSpectralRegistry model allocation"); | ||
| 2693 | - try { | ||
| 2694 | - // Loop over all models in registry | ||
| 2695 | - GModelSpectralRegistry registry; | ||
| 2696 | - int num = registry.size(); | ||
| 2697 | - for (int i = 0; i < num; ++i) { | ||
| 2698 | - GModelSpectral* ptr = registry.alloc(registry.name(i)); | ||
| 2699 | - test_assert(ptr != NULL, "Model pointer for \""+registry.name(i)+"\" is NULL"); | ||
| 2700 | - if (ptr != NULL) { | ||
| 2701 | - | ||
| 2702 | - // Test model type | ||
| 2703 | - test_assert(ptr->type() == registry.name(i), | ||
| 2704 | - "Expected \""+registry.name(i)+"\" instead" | ||
| 2705 | - " of \""+ptr->type()+"\"."); | ||
| 2706 | - | ||
| 2707 | - // Free model | ||
| 2708 | - delete ptr; | ||
| 2709 | - } | ||
| 2710 | - } // endfor: looped over all models | 2657 | + catch (GException::invalid_value &e) { |
| 2711 | test_try_success(); | 2658 | test_try_success(); |
| 2712 | } | 2659 | } |
| 2713 | catch (std::exception &e) { | 2660 | catch (std::exception &e) { |
| 2714 | test_try_failure(e); | 2661 | test_try_failure(e); |
| 2715 | } | 2662 | } |
| 2716 | 2663 | ||
| 2717 | - // Test GModelTemporalRegistry void constructor | ||
| 2718 | - test_try("Test GModelTemporalRegistry void constructor"); | 2664 | + // Test GModelTemporalRegistry allocator for invalid XML element |
| 2665 | + test_try("Test GModelTemporalRegistry allocator for invalid XML element"); | ||
| 2719 | try { | 2666 | try { |
| 2667 | + GXmlElement xml; | ||
| 2720 | GModelTemporalRegistry registry; | 2668 | GModelTemporalRegistry registry; |
| 2721 | - test_try_success(); | 2669 | + GModelTemporal* ptr = registry.alloc(xml); |
| 2670 | + test_try_failure("Invalid XML element shall throw an exception"); | ||
| 2722 | } | 2671 | } |
| 2723 | - catch (std::exception &e) { | ||
| 2724 | - test_try_failure(e); | ||
| 2725 | - } | ||
| 2726 | - | ||
| 2727 | - // Test GModelTemporalRegistry allocators | ||
| 2728 | - test_try("Test GModelTemporalRegistry model allocation"); | ||
| 2729 | - try { | ||
| 2730 | - // Loop over all models in registry | ||
| 2731 | - GModelTemporalRegistry registry; | ||
| 2732 | - int num = registry.size(); | ||
| 2733 | - for (int i = 0; i < num; ++i) { | ||
| 2734 | - GModelTemporal* ptr = registry.alloc(registry.name(i)); | ||
| 2735 | - test_assert(ptr != NULL, "Model pointer for \""+ \ | ||
| 2736 | - registry.name(i)+"\" is NULL"); | ||
| 2737 | - if (ptr != NULL) { | ||
| 2738 | - | ||
| 2739 | - // Test model type | ||
| 2740 | - test_assert(ptr->type() == registry.name(i), | ||
| 2741 | - "Expected \""+registry.name(i)+"\" instead" | ||
| 2742 | - " of \""+ptr->type()+"\"."); | ||
| 2743 | - | ||
| 2744 | - // Free model | ||
| 2745 | - delete ptr; | ||
| 2746 | - } | ||
| 2747 | - } // endfor: looped over all models | 2672 | + catch (GException::invalid_value &e) { |
| 2748 | test_try_success(); | 2673 | test_try_success(); |
| 2749 | } | 2674 | } |
| 2750 | catch (std::exception &e) { | 2675 | catch (std::exception &e) { |