diff options
author | Diego Lopez Recas <Diego.LopezRecas@arm.com> | 2017-12-19 15:42:25 +0000 |
---|---|---|
committer | Anthony Barbier <anthony.barbier@arm.com> | 2018-11-02 16:42:33 +0000 |
commit | 490b3d839808cbd088ab567dec991dcefb08f718 (patch) | |
tree | 72ddb43ddef562ffb3008d9e421b08c7ecab0c3a /arm_compute/core/utils/misc | |
parent | 53a6ec5944132000e2c6779c04d722b3b2d2501c (diff) | |
download | ComputeLibrary-490b3d839808cbd088ab567dec991dcefb08f718.tar.gz |
IVGCVSW-863 Move clamp, for_each, foldl to misc/utility.h
Also, improve for_each, foldl, and related changes.
Change-Id: I0cf0c7dbf88f26bb70cc734ba9fb5725d405585f
Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/114014
Reviewed-by: Anthony Barbier <anthony.barbier@arm.com>
Reviewed-by: Georgios Pinitas <georgios.pinitas@arm.com>
Tested-by: Jenkins <bsgcomp@arm.com>
Diffstat (limited to 'arm_compute/core/utils/misc')
-rw-r--r-- | arm_compute/core/utils/misc/utility.h | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/arm_compute/core/utils/misc/utility.h b/arm_compute/core/utils/misc/utility.h index 898d0cdea8..45b3b5268e 100644 --- a/arm_compute/core/utils/misc/utility.h +++ b/arm_compute/core/utils/misc/utility.h @@ -67,6 +67,62 @@ std::array<typename std::iterator_traits<Iterator>::value_type, N> make_array(It { return detail::make_array(first, index_sequence_t<N> {}); } -} // namespace misc + +/** Performs clamping among a lower and upper value. + * + * @param[in] n Value to clamp. + * @param[in] lower Lower threshold. + * @param[in] upper Upper threshold. + * + * @return Clamped value. + */ +template <typename T> +inline T clamp(const T &n, const T &lower, const T &upper) +{ + return std::max(lower, std::min(n, upper)); +} + +/** Base case of for_each. Does nothing. */ +template <typename F> +inline void for_each(F &&) +{ +} + +/** Call the function for each of the arguments + * + * @param[in] func Function to be called + * @param[in] arg Argument passed to the function + * @param[in] args Remaining arguments + */ +template <typename F, typename T, typename... Ts> +inline void for_each(F &&func, T &&arg, Ts &&... args) +{ + func(std::forward<T>(arg)); + for_each(std::forward<F>(func), std::forward<Ts>(args)...); +} + +/** Base case of foldl. + * + * @return value. + */ +template <typename F, typename T> +inline T &&foldl(F &&, T &&value) +{ + return std::forward<T>(value); +} + +/** Fold left. + * + * @param[in] func Function to be called + * @param[in] initial Initial value + * @param[in] value Argument passed to the function + * @param[in] values Remaining arguments + */ +template <typename F, typename T, typename U, typename... Us> +inline auto foldl(F &&func, T &&initial, U &&value, Us &&... values) -> decltype(func(std::forward<T>(initial), std::forward<U>(value))) +{ + return foldl(std::forward<F>(func), func(std::forward<T>(initial), std::forward<U>(value)), std::forward<Us>(values)...); +} +} // namespace utility } // namespace arm_compute #endif /* __ARM_COMPUTE_MISC_UTILITY_H__ */ |