diff options
author | David Wagner <david.wagner@intel.com> | 2014-02-27 15:52:49 +0100 |
---|---|---|
committer | Mattijs Korpershoek <mattijsx.korpershoek@intel.com> | 2014-06-25 10:52:25 +0200 |
commit | 8ef87a1fe5d2f05557856efa6faf070bb9b03337 (patch) | |
tree | 66b1ee719721e3bd44238d6123faf8a8ba89ba5b | |
parent | 397cfb624defe0b4fcb22351536478379fdc711a (diff) | |
download | external_parameter-framework-8ef87a1fe5d2f05557856efa6faf070bb9b03337.zip external_parameter-framework-8ef87a1fe5d2f05557856efa6faf070bb9b03337.tar.gz external_parameter-framework-8ef87a1fe5d2f05557856efa6faf070bb9b03337.tar.bz2 |
FixedPointParameterType: fix potential compilation issue
BZ: 176178
The isEncodable() method has several prototypes and some compilers are not able
to decide which version to use and produce a compilation error.
Remove unnecessary casts and make the code simpler by using a template-based
conversion library from string to various numeric types instead of using
strtoll and strtod.
Change-Id: I53d0b4ebd12f2cbb315bb52d98365a35876b5aef
Signed-off-by: David Wagner <david.wagner@intel.com>
Signed-off-by: Mattijs Korpershoek <mattijsx.korpershoek@intel.com>
-rw-r--r-- | parameter/FixedPointParameterType.cpp | 31 | ||||
-rwxr-xr-x | utility/convert.hpp | 105 |
2 files changed, 95 insertions, 41 deletions
diff --git a/parameter/FixedPointParameterType.cpp b/parameter/FixedPointParameterType.cpp index 88d3aa1..6a873b3 100644 --- a/parameter/FixedPointParameterType.cpp +++ b/parameter/FixedPointParameterType.cpp @@ -37,6 +37,7 @@ #include "ParameterAccessContext.h" #include "ConfigurationAccessContext.h" #include <errno.h> +#include <convert.hpp> #define base CParameterType @@ -122,19 +123,11 @@ bool CFixedPointParameterType::toBlackboard(const string& strValue, uint32_t& ui return false; } - int64_t iData; + uint32_t uiData; if (parameterAccessContext.valueSpaceIsRaw()) { - errno = 0; - char *pcStrEnd; - // Get data in integer form - iData = strtoll(strValue.c_str(), &pcStrEnd, 0); - - // Conversion error when the input string does not contain any digit or the number is out of range - bool bConversionSucceeded = !errno && (strValue.c_str() != pcStrEnd); - - if (!bConversionSucceeded || !isEncodable((uint64_t)iData, !bValueProvidedAsHexa)) { + if (!convertTo(strValue, uiData) || !isEncodable(uiData, !bValueProvidedAsHexa)) { // Illegal value provided parameterAccessContext.setError(getOutOfRangeError(strValue, parameterAccessContext.valueSpaceIsRaw(), bValueProvidedAsHexa)); @@ -144,20 +137,14 @@ bool CFixedPointParameterType::toBlackboard(const string& strValue, uint32_t& ui if (bValueProvidedAsHexa) { // Sign extend - signExtend(iData); + signExtend((int32_t&)uiData); } } else { - errno = 0; - char *pcStrEnd; - - double dData = strtod(strValue.c_str(), &pcStrEnd); - - // Conversion error when the input string does not contain any digit or the number is out of range (int32_t type) - bool bConversionSucceeded = !errno && (strValue.c_str() != pcStrEnd); + double dData; // Check encodability - if (!bConversionSucceeded || !checkValueAgainstRange(dData)) { + if (!convertTo(strValue, dData) || !checkValueAgainstRange(dData)) { // Illegal value provided parameterAccessContext.setError(getOutOfRangeError(strValue, parameterAccessContext.valueSpaceIsRaw(), bValueProvidedAsHexa)); @@ -166,13 +153,13 @@ bool CFixedPointParameterType::toBlackboard(const string& strValue, uint32_t& ui } // Do the conversion - iData = asInteger(dData); + uiData = (uint32_t)asInteger(dData); } // check that the data is encodable and can be safely written to the blackboard - assert(isEncodable((unsigned long int)iData, true)); + assert(isEncodable(uiData, true)); - uiValue = (uint32_t)iData; + uiValue = uiData; return true; } diff --git a/utility/convert.hpp b/utility/convert.hpp index 273abd5..55146f7 100755 --- a/utility/convert.hpp +++ b/utility/convert.hpp @@ -34,6 +34,7 @@ #include <sstream> #include <string> #include <stdint.h> +#include <cmath> /* details namespace is here to hide implementation details to header end user. It * is NOT intended to be used outside. */ @@ -53,32 +54,15 @@ template<> struct ConvertionAllowed<int32_t> {}; template<> struct ConvertionAllowed<uint16_t> {}; template<> struct ConvertionAllowed<int16_t> {}; template<> struct ConvertionAllowed<float> {}; +template<> struct ConvertionAllowed<double> {}; -} // namespace details - -/** - * Convert a string to a given type. - * - * This template function read the value of the type T in the given string. - * The function does not allow to have white spaces around the value to parse - * and tries to parse the whole string, which means that if some bytes were not - * read in the string, the function fails. - * Hexadecimal representation (ie numbers starting with 0x) is supported only - * for integral types conversions. - * Result may be modified, even in case of failure. - * - * @param[in] str the string to parse. - * @param[out] result reference to object where to store the result. - * - * @return true if conversion was successful, false otherwise. - */ template<typename T> static inline bool convertTo(const std::string &str, T &result) { /* Check that conversion to that type is allowed. * If this fails, this means that this template was not intended to be used * with this type, thus that the result is undefined. */ - details::ConvertionAllowed<T>(); + ConvertionAllowed<T>(); if (str.find_first_of(std::string("\r\n\t\v ")) != std::string::npos) { return false; @@ -110,6 +94,29 @@ static inline bool convertTo(const std::string &str, T &result) return ss.eof() && !ss.fail() && !ss.bad(); } +} // namespace details + +/** + * Convert a string to a given type. + * + * This template function read the value of the type T in the given string. + * The function does not allow to have white spaces around the value to parse + * and tries to parse the whole string, which means that if some bytes were not + * read in the string, the function fails. + * Hexadecimal representation (ie numbers starting with 0x) is supported only + * for integral types conversions. + * Result may be modified, even in case of failure. + * + * @param[in] str the string to parse. + * @param[out] result reference to object where to store the result. + * + * @return true if conversion was successful, false otherwise. + */ +template<typename T> +static inline bool convertTo(const std::string &str, T &result) +{ + return details::convertTo<T>(str, result); +} /** * Specialization for int16_t of convertTo template function. @@ -143,6 +150,66 @@ inline bool convertTo<int16_t>(const std::string &str, int16_t &result) } /** + * Specialization for float of convertTo template function. + * + * This function follows the same paradigm than it's generic version and is + * based on it but makes furthers checks on the returned value. + * + * The specific implementation is made necessary because the stlport conversion + * from string to float behaves differently than GNU STL: overflow produce + * +/-Infinity rather than an error. + * + * @param[in] str the string to parse. + * @param[out] result reference to object where to store the result. + * + * @return true if conversion was successful, false otherwise. + */ +template<> +inline bool convertTo<float>(const std::string &str, float &result) +{ + if (!details::convertTo(str, result)) { + return false; + } + + if (std::abs(result) == std::numeric_limits<float>::infinity() || + result == std::numeric_limits<float>::quiet_NaN()) { + return false; + } + + return true; +} + +/** + * Specialization for double of convertTo template function. + * + * This function follows the same paradigm than it's generic version and is + * based on it but makes furthers checks on the returned value. + * + * The specific implementation is made necessary because the stlport conversion + * from string to double behaves differently than GNU STL: overflow produce + * +/-Infinity rather than an error. + * + * @param[in] str the string to parse. + * @param[out] result reference to object where to store the result. + * + * @return true if conversion was successful, false otherwise. + */ +template<> +inline bool convertTo<double>(const std::string &str, double &result) +{ + if (!details::convertTo(str, result)) { + return false; + } + + if (std::abs(result) == std::numeric_limits<double>::infinity() || + result == std::numeric_limits<double>::quiet_NaN()) { + return false; + } + + return true; +} + +/** * Specialization for boolean of convertTo template function. * * This function follows the same paradigm than it's generic version. |