diff options
Diffstat (limited to 'support')
-rw-r--r-- | support/MemorySupport.h | 114 | ||||
-rw-r--r-- | support/StringSupport.h | 194 | ||||
-rw-r--r-- | support/ToolchainSupport.h | 243 |
3 files changed, 311 insertions, 240 deletions
diff --git a/support/MemorySupport.h b/support/MemorySupport.h new file mode 100644 index 0000000000..5ae5501371 --- /dev/null +++ b/support/MemorySupport.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2017-2020 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef ARM_COMPUTE_SUPPORT_MEMORYSUPPORT +#define ARM_COMPUTE_SUPPORT_MEMORYSUPPORT + +#include <memory> + +namespace arm_compute +{ +namespace support +{ +namespace cpp11 +{ +// std::align is missing in GCC 4.9 +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57350 +inline void *align(std::size_t alignment, std::size_t size, void *&ptr, std::size_t &space) +{ + std::uintptr_t pn = reinterpret_cast<std::uintptr_t>(ptr); + std::uintptr_t aligned = (pn + alignment - 1) & -alignment; + std::size_t padding = aligned - pn; + if(space < size + padding) + { + return nullptr; + } + + space -= padding; + + return ptr = reinterpret_cast<void *>(aligned); +} +} //namespace cpp11 +namespace cpp14 +{ +/** make_unique is missing in CPP11. Re-implement it according to the standard proposal. */ + +/**<Template for single object */ +template <class T> +struct _Unique_if +{ + typedef std::unique_ptr<T> _Single_object; /**< Single object type */ +}; + +/** Template for array */ +template <class T> +struct _Unique_if<T[]> +{ + typedef std::unique_ptr<T[]> _Unknown_bound; /**< Array type */ +}; + +/** Template for array with known bounds (to throw an error). + * + * @note this is intended to never be hit. + */ +template <class T, size_t N> +struct _Unique_if<T[N]> +{ + typedef void _Known_bound; /**< Should never be used */ +}; + +/** Construct a single object and return a unique pointer to it. + * + * @param[in] args Constructor arguments. + * + * @return a unique pointer to the new object. + */ +template <class T, class... Args> +typename _Unique_if<T>::_Single_object +make_unique(Args &&... args) +{ + return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); +} + +/** Construct an array of objects and return a unique pointer to it. + * + * @param[in] n Array size + * + * @return a unique pointer to the new array. + */ +template <class T> +typename _Unique_if<T>::_Unknown_bound +make_unique(size_t n) +{ + typedef typename std::remove_extent<T>::type U; + return std::unique_ptr<T>(new U[n]()); +} + +/** It is invalid to attempt to make_unique an array with known bounds. */ +template <class T, class... Args> +typename _Unique_if<T>::_Known_bound +make_unique(Args &&...) = delete; +} // namespace cpp14 +} // namespace support +} // namespace arm_compute +#endif /* ARM_COMPUTE_SUPPORT_MEMORYSUPPORT */ diff --git a/support/StringSupport.h b/support/StringSupport.h new file mode 100644 index 0000000000..2bd398753f --- /dev/null +++ b/support/StringSupport.h @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2017-2020 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef ARM_COMPUTE_TEST_STRINGSUPPORT +#define ARM_COMPUTE_TEST_STRINGSUPPORT + +#include <cassert> +#include <memory> +#include <sstream> +#include <string> + +namespace arm_compute +{ +namespace support +{ +namespace cpp11 +{ +enum class NumericBase +{ + 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] 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, NumericBase base = NumericBase::BASE_10) +{ + assert(base == NumericBase::BASE_10 || base == NumericBase::BASE_16); + unsigned int x; + std::stringstream ss; + if(base == NumericBase::BASE_16) + { + ss << std::hex; + } + ss << str; + ss >> x; + + if(pos) + { + std::string s; + std::stringstream ss_p; + + ss_p << x; + ss_p >> s; + *pos = s.length(); + } + + return x; +} + +/** Convert string values to unsigned long. + * + * @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] 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, NumericBase base = NumericBase::BASE_10) +{ + assert(base == NumericBase::BASE_10 || base == NumericBase::BASE_16); + std::stringstream stream; + unsigned long value = 0; + if(base == NumericBase::BASE_16) + { + stream << std::hex; + } + stream << str; + stream >> value; + + if(pos) + { + std::string s; + std::stringstream ss_p; + + ss_p << value; + ss_p >> s; + *pos = s.length(); + } + + 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 <typename T, typename std::enable_if<std::is_arithmetic<typename std::decay<T>::type>::value, int>::type = 0> +inline std::string to_string(T && value) +{ + std::stringstream stream; + stream << std::forward<T>(value); + return stream.str(); +} + +/** Convert string values to float. + * + * @note This function implements the same behaviour as std::stof. The latter + * is missing in some Android toolchains. + * + * @param[in] str String to be converted to float. + * + * @return Float representation of @p str. + */ +inline float stof(const std::string &str) +{ + std::stringstream stream(str); + float value = 0.f; + stream >> value; + return value; +} + +#else /* (__ANDROID__ || BARE_METAL) */ +/** Convert integer and float values to string. + * + * @note This function acts as a convenience wrapper around 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 <typename T> +inline std::string to_string(T &&value) +{ + return ::std::to_string(std::forward<T>(value)); +} + +/** Convert string values to float. + * + * @note This function acts as a convenience wrapper around std::stof. The + * latter is missing in some Android toolchains. + * + * @param[in] args Arguments forwarded to std::stof. + * + * @return Float representation of input string. + */ +template <typename... Ts> +int stof(Ts &&... args) +{ + return ::std::stof(std::forward<Ts>(args)...); +} + +#endif /* (__ANDROID__ || BARE_METAL) */ + +inline std::string to_string(bool value) +{ + std::stringstream str; + str << std::boolalpha << value; + return str.str(); +} + +} // namespace cpp11 +} // namespace support +} // namespace arm_compute +#endif /* ARM_COMPUTE_TEST_STRINGSUPPORT */ diff --git a/support/ToolchainSupport.h b/support/ToolchainSupport.h index 923a9cbfe0..8235358c39 100644 --- a/support/ToolchainSupport.h +++ b/support/ToolchainSupport.h @@ -21,16 +21,14 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -#ifndef ARM_COMPUTE_TEST_TOOLCHAINSUPPORT -#define ARM_COMPUTE_TEST_TOOLCHAINSUPPORT +#ifndef ARM_COMPUTE_SUPPORT_TOOLCHAINSUPPORT +#define ARM_COMPUTE_SUPPORT_TOOLCHAINSUPPORT -#include <algorithm> #include <cassert> #include <cmath> #include <cstddef> #include <limits> #include <memory> -#include <numeric> #include <sstream> #include <string> #include <type_traits> @@ -48,134 +46,13 @@ namespace support { namespace cpp11 { -enum class NumericBase -{ - 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] 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, NumericBase base = NumericBase::BASE_10) -{ - assert(base == NumericBase::BASE_10 || base == NumericBase::BASE_16); - unsigned int x; - std::stringstream ss; - if(base == NumericBase::BASE_16) - { - ss << std::hex; - } - ss << str; - ss >> x; - - if(pos) - { - std::string s; - std::stringstream ss_p; - - ss_p << x; - ss_p >> s; - *pos = s.length(); - } - - return x; -} - -/** Convert string values to unsigned long. - * - * @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] 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, NumericBase base = NumericBase::BASE_10) -{ - assert(base == NumericBase::BASE_10 || base == NumericBase::BASE_16); - std::stringstream stream; - unsigned long value = 0; - if(base == NumericBase::BASE_16) - { - stream << std::hex; - } - stream << str; - stream >> value; - - if(pos) - { - std::string s; - std::stringstream ss_p; - - ss_p << value; - ss_p >> s; - *pos = s.length(); - } - - 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 <typename T, typename std::enable_if<std::is_arithmetic<typename std::decay<T>::type>::value, int>::type = 0> -inline std::string to_string(T && value) -{ - std::stringstream stream; - stream << std::forward<T>(value); - return stream.str(); -} - -/** Rounds the floating-point argument arg to an integer value in floating-point format, using the current rounding mode. - * - * @note This function acts as a convenience wrapper around std::nearbyint. The - * latter is missing in some Android toolchains. - * - * @param[in] value Value to be rounded. - * - * @return The rounded value. - */ template <typename T> inline T nearbyint(T value) { return static_cast<T>(::nearbyint(value)); } -/** Convert string values to float. - * - * @note This function implements the same behaviour as std::stof. The latter - * is missing in some Android toolchains. - * - * @param[in] str String to be converted to float. - * - * @return Float representation of @p str. - */ -inline float stof(const std::string &str) -{ - std::stringstream stream(str); - float value = 0.f; - stream >> value; - return value; -} - /** Round floating-point value with half value rounding away from zero. * * @note This function implements the same behaviour as std::round except that it doesn't @@ -260,21 +137,6 @@ inline int snprintf(char *s, size_t n, const char *fmt, Ts &&... args) return ::snprintf(s, n, fmt, std::forward<Ts>(args)...); } #else /* (__ANDROID__ || BARE_METAL) */ -/** Convert integer and float values to string. - * - * @note This function acts as a convenience wrapper around 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 <typename T> -inline std::string to_string(T &&value) -{ - return ::std::to_string(std::forward<T>(value)); -} - /** Rounds the floating-point argument arg to an integer value in floating-point format, using the current rounding mode. * * @note This function acts as a convenience wrapper around std::nearbyint. The @@ -290,21 +152,6 @@ inline T nearbyint(T value) return static_cast<T>(std::nearbyint(value)); } -/** Convert string values to float. - * - * @note This function acts as a convenience wrapper around std::stof. The - * latter is missing in some Android toolchains. - * - * @param[in] args Arguments forwarded to std::stof. - * - * @return Float representation of input string. - */ -template <typename... Ts> -int stof(Ts &&... args) -{ - return ::std::stof(std::forward<Ts>(args)...); -} - /** Round floating-point value with half value rounding away from zero. * * @note This function implements the same behaviour as std::round except that it doesn't @@ -391,29 +238,6 @@ inline int snprintf(char *s, std::size_t n, const char *fmt, Ts &&... args) } #endif /* (__ANDROID__ || BARE_METAL) */ -inline std::string to_string(bool value) -{ - std::stringstream str; - str << std::boolalpha << value; - return str.str(); -} - -// std::align is missing in GCC 4.9 -// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57350 -inline void *align(std::size_t alignment, std::size_t size, void *&ptr, std::size_t &space) -{ - std::uintptr_t pn = reinterpret_cast<std::uintptr_t>(ptr); - std::uintptr_t aligned = (pn + alignment - 1) & -alignment; - std::size_t padding = aligned - pn; - if(space < size + padding) - { - return nullptr; - } - - space -= padding; - - return ptr = reinterpret_cast<void *>(aligned); -} // std::numeric_limits<T>::lowest template <typename T> inline T lowest() @@ -452,67 +276,6 @@ inline bool isfinite(bfloat16 value) return std::isfinite(float(value)); } } // namespace cpp11 - -namespace cpp14 -{ -/** make_unique is missing in CPP11. Re-implement it according to the standard proposal. */ - -/**<Template for single object */ -template <class T> -struct _Unique_if -{ - typedef std::unique_ptr<T> _Single_object; /**< Single object type */ -}; - -/** Template for array */ -template <class T> -struct _Unique_if<T[]> -{ - typedef std::unique_ptr<T[]> _Unknown_bound; /**< Array type */ -}; - -/** Template for array with known bounds (to throw an error). - * - * @note this is intended to never be hit. - */ -template <class T, size_t N> -struct _Unique_if<T[N]> -{ - typedef void _Known_bound; /**< Should never be used */ -}; - -/** Construct a single object and return a unique pointer to it. - * - * @param[in] args Constructor arguments. - * - * @return a unique pointer to the new object. - */ -template <class T, class... Args> -typename _Unique_if<T>::_Single_object -make_unique(Args &&... args) -{ - return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); -} - -/** Construct an array of objects and return a unique pointer to it. - * - * @param[in] n Array size - * - * @return a unique pointer to the new array. - */ -template <class T> -typename _Unique_if<T>::_Unknown_bound -make_unique(size_t n) -{ - typedef typename std::remove_extent<T>::type U; - return std::unique_ptr<T>(new U[n]()); -} - -/** It is invalid to attempt to make_unique an array with known bounds. */ -template <class T, class... Args> -typename _Unique_if<T>::_Known_bound -make_unique(Args &&...) = delete; -} // namespace cpp14 } // namespace support } // namespace arm_compute -#endif /* ARM_COMPUTE_TEST_TOOLCHAINSUPPORT */ +#endif /* ARM_COMPUTE_SUPPORT_TOOLCHAINSUPPORT */ |