From 65f9982e99a6d9bea8084b7e15bc6c72ff535d8b Mon Sep 17 00:00:00 2001 From: Pablo Tello Date: Thu, 24 May 2018 11:40:15 +0100 Subject: COMPMID-1038: stoi and stoul cleanup. Change-Id: I0d981a06655cdd86c71fddbd07303d781577d0fd Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/132620 Reviewed-by: Giorgio Arena Tested-by: Jenkins Reviewed-by: Anthony Barbier --- src/runtime/CPUUtils.cpp | 15 ++++---- support/ToolchainSupport.h | 87 +++++++++++++++++++--------------------------- 2 files changed, 42 insertions(+), 60 deletions(-) diff --git a/src/runtime/CPUUtils.cpp b/src/runtime/CPUUtils.cpp index 7e8bf2bb3f..cf29ce0053 100644 --- a/src/runtime/CPUUtils.cpp +++ b/src/runtime/CPUUtils.cpp @@ -126,7 +126,7 @@ void populate_models_cpuid(std::vector &cpusv) std::string line; if(bool(getline(file, line))) { - const unsigned long midr = support::cpp11::stoul(line, nullptr, 16); + const unsigned long midr = support::cpp11::stoul(line, nullptr, support::cpp11::NumericBase::BASE_16); c.midr = (midr & 0xffffffff); c.model = midr_to_model(c.midr); c.model_set = true; @@ -160,7 +160,7 @@ void populate_models_cpuinfo(std::vector &cpusv) if(std::regex_match(line, match, proc_regex)) { std::string id = match[1]; - int newcpu = support::cpp11::stoi(id, nullptr, 0); + int newcpu = support::cpp11::stoi(id, nullptr); if(curcpu >= 0 && midr == 0) { @@ -183,28 +183,28 @@ void populate_models_cpuinfo(std::vector &cpusv) if(std::regex_match(line, match, imp_regex)) { - int impv = support::cpp11::stoi(match[1], nullptr, 16); + int impv = support::cpp11::stoi(match[1], nullptr, support::cpp11::NumericBase::BASE_16); midr |= (impv << 24); continue; } if(std::regex_match(line, match, var_regex)) { - int varv = support::cpp11::stoi(match[1], nullptr, 16); + int varv = support::cpp11::stoi(match[1], nullptr, support::cpp11::NumericBase::BASE_16); midr |= (varv << 16); continue; } if(std::regex_match(line, match, part_regex)) { - int partv = support::cpp11::stoi(match[1], nullptr, 16); + int partv = support::cpp11::stoi(match[1], nullptr, support::cpp11::NumericBase::BASE_16); midr |= (partv << 4); continue; } if(std::regex_match(line, match, rev_regex)) { - int regv = support::cpp11::stoi(match[1], nullptr, 10); + int regv = support::cpp11::stoi(match[1], nullptr); midr |= (regv); midr |= (0xf << 16); continue; @@ -251,7 +251,7 @@ int get_max_cpus() line.erase(line.begin(), startfrom); - max_cpus = support::cpp11::stoi(line, nullptr, 0) + 1; + max_cpus = support::cpp11::stoi(line, nullptr) + 1; success = true; } } @@ -262,7 +262,6 @@ int get_max_cpus() max_cpus = std::thread::hardware_concurrency(); } #endif /* BARE_METAL */ - return max_cpus; } #endif /* !defined(BARE_METAL) && (defined(__arm__) || defined(__aarch64__)) */ diff --git a/support/ToolchainSupport.h b/support/ToolchainSupport.h index 88c17009cc..ece966704f 100644 --- a/support/ToolchainSupport.h +++ b/support/ToolchainSupport.h @@ -25,6 +25,7 @@ #define ARM_COMPUTE_TEST_TOOLCHAINSUPPORT #include +#include #include #include #include @@ -42,38 +43,29 @@ namespace support { namespace cpp11 { -#if(__ANDROID__ || BARE_METAL) -/** Convert integer and float values to string. - * - * @note This function implements the same behaviour as std::to_string. The - * latter is missing in some Android toolchains. - * - * @param[in] value Value to be converted to string. - * - * @return String representation of @p value. - */ -template ::type>::value, int>::type = 0> -inline std::string to_string(T && value) +enum class NumericBase { - std::stringstream stream; - stream << std::forward(value); - return stream.str(); -} + BASE_10, + BASE_16 +}; /** Convert string values to integer. * * @note This function implements the same behaviour as std::stoi. The latter * is missing in some Android toolchains. * - * @param[in] str String to be converted to int. + * @param[in] str String to be converted to int. + * @param[in] pos If idx is not a null pointer, the function sets the value of pos to the position of the first character in str after the number. + * @param[in] base Numeric base used to interpret the string. * * @return Integer representation of @p str. */ -inline int stoi(const std::string &str, std::size_t *pos = 0, int base = 10) +inline int stoi(const std::string &str, std::size_t *pos = 0, NumericBase base = NumericBase::BASE_10) { + assert(base == NumericBase::BASE_10 || base == NumericBase::BASE_16); unsigned int x; std::stringstream ss; - if(base == 16) + if(base == NumericBase::BASE_16) { ss << std::hex; } @@ -87,15 +79,18 @@ inline int stoi(const std::string &str, std::size_t *pos = 0, int base = 10) * @note This function implements the same behaviour as std::stoul. The latter * is missing in some Android toolchains. * - * @param[in] str String to be converted to unsigned long. + * @param[in] str String to be converted to unsigned long. + * @param[in] pos If idx is not a null pointer, the function sets the value of pos to the position of the first character in str after the number. + * @param[in] base Numeric base used to interpret the string. * * @return Unsigned long representation of @p str. */ -inline unsigned long stoul(const std::string &str, std::size_t *pos = 0, int base = 10) +inline unsigned long stoul(const std::string &str, std::size_t *pos = 0, NumericBase base = NumericBase::BASE_10) { + assert(base == NumericBase::BASE_10 || base == NumericBase::BASE_16); std::stringstream stream; unsigned long value = 0; - if(base == 16) + if(base == NumericBase::BASE_16) { stream << std::hex; } @@ -104,6 +99,24 @@ inline unsigned long stoul(const std::string &str, std::size_t *pos = 0, int bas return value; } +#if(__ANDROID__ || BARE_METAL) +/** Convert integer and float values to string. + * + * @note This function implements the same behaviour as std::to_string. The + * latter is missing in some Android toolchains. + * + * @param[in] value Value to be converted to string. + * + * @return String representation of @p value. + */ +template ::type>::value, int>::type = 0> +inline std::string to_string(T && value) +{ + std::stringstream stream; + stream << std::forward(value); + return stream.str(); +} + /** Convert string values to float. * * @note This function implements the same behaviour as std::stof. The latter @@ -199,36 +212,6 @@ inline std::string to_string(T &&value) return ::std::to_string(std::forward(value)); } -/** Convert string values to integer. - * - * @note This function acts as a convenience wrapper around std::stoi. The - * latter is missing in some Android toolchains. - * - * @param[in] args Arguments forwarded to std::stoi. - * - * @return Integer representation of input string. - */ -template -int stoi(Ts &&... args) -{ - return ::std::stoi(std::forward(args)...); -} - -/** Convert string values to unsigned long. - * - * @note This function acts as a convenience wrapper around std::stoul. The - * latter is missing in some Android toolchains. - * - * @param[in] args Arguments forwarded to std::stoul. - * - * @return Unsigned long representation of input string. - */ -template -int stoul(Ts &&... args) -{ - return ::std::stoul(std::forward(args)...); -} - /** Convert string values to float. * * @note This function acts as a convenience wrapper around std::stof. The -- cgit v1.2.1