diff --git a/src/gribmessage.cpp b/src/gribmessage.cpp index 0bf67c2..cd53d18 100644 --- a/src/gribmessage.cpp +++ b/src/gribmessage.cpp @@ -12,8 +12,8 @@ #include "gribmessage.hpp" #include "arrowutils.hpp" #include "exceptions/gribexception.hpp" - - +#include +#include using namespace std; @@ -309,6 +309,49 @@ using namespace std; return ret == 0 ? parameterId : defaultValue; } + template + T GribMessage::tryGetParameter(string parameterName, T defaultValue) { + + if constexpr (std::is_floating_point_v) { + return getDoubleParameterOrDefault(parameterName, defaultValue); + } + + if constexpr (std::is_integral_v) { + return getNumericParameterOrDefault(parameterName, defaultValue); + } + + getStringParameterOrDefault(parameterName, defaultValue); + + } + + template + T GribMessage::tryGetKey(string parameterName) { + + auto dblDefault = std::nan(""); + long maxLong {std::numeric_limits::max()}; + auto stringDefault = "InTheBlueRidgeMountainsOfViriginaOnTheTrailOfTheLonesomePine"; + + auto doubleResult = getDoubleParameterOrDefault(parameterName, dblDefault); + if (doubleResult != dblDefault) { + //we got the result + return doubleResult; + } + //it wasn't a double or the key doesn't exist + auto longResult = getNumericParameterOrDefault(parameterName, maxLong); + if (longResult != maxLong) { + //we got the result + return longResult; + } + + auto stringResult = getStringParameterOrDefault(parameterName, stringDefault); + if (stringResult != stringDefault) { + return stringResult; + } + + return nullptr; + + } + double GribMessage::getDoubleParameter(string parameterName) { double parameterId; auto err = codes_get_double(h, parameterName.c_str(), ¶meterId); diff --git a/src/gribmessage.hpp b/src/gribmessage.hpp index ec8ba98..3bd6d2f 100644 --- a/src/gribmessage.hpp +++ b/src/gribmessage.hpp @@ -66,6 +66,13 @@ class GribMessage long getNumericParameterOrDefault(string parameterName, long defaultValue = -9999); double getDoubleParameterOrDefault(string parameterName, double defaultValue = std::nan("")); string getStringParameterOrDefault(string parameterName, string defaultValue = ""); + + template + T tryGetParameter(string parameterName, T defaultValue = nullptr); + + template + T tryGetKey(string parameterName); + std::shared_ptr getData(); std::shared_ptr getDataWithLocations(); ~ GribMessage();