24 #ifndef ARM_COMPUTE_MISC_UTILITY_H
25 #define ARM_COMPUTE_MISC_UTILITY_H
41 template <std::size_t...>
46 template <std::size_t
N, std::size_t... S>
47 struct index_sequence_generator : index_sequence_generator<N - 1, N - 1, S...>
51 template <std::size_t... S>
52 struct index_sequence_generator<0u, S...> : index_sequence<S...>
54 using type = index_sequence<S...>;
57 template <std::
size_t N>
60 template <
typename T, std::size_t
N, T val, T... vals>
61 struct generate_array : generate_array<T, N - 1, val, val, vals...>
65 template <
typename T, T val, T... vals>
66 struct generate_array<T, 0, val, vals...>
68 static constexpr std::array<T,
sizeof...(vals)> value{vals...};
71 template <
typename T, T val, T... vals>
72 constexpr std::array<T,
sizeof...(vals)> generate_array<T, 0, val, vals...>::value;
77 template <std::size_t... S,
79 typename T = std::array<typename std::iterator_traits<Iterator>::value_type,
sizeof...(S)>>
82 return T{{first[S]...}};
86 template <std::
size_t N,
typename Iterator>
101 template <
typename DataType,
typename RangeType = DataType>
104 const DataType &upper = std::numeric_limits<RangeType>::max())
106 return std::max(lower, std::min(n, upper));
110 template <
typename F>
121 template <
typename F,
typename T,
typename... Ts>
124 func(std::forward<T>(arg));
125 for_each(std::forward<F>(func), std::forward<Ts>(
args)...);
132 template <
typename F,
typename T>
135 return std::forward<T>(value);
145 template <
typename F,
typename T,
typename U,
typename... Us>
146 inline auto foldl(F &&func, T &&initial, U &&value, Us &&...values)
147 -> decltype(func(std::forward<T>(initial), std::forward<U>(value)))
149 return foldl(std::forward<F>(func), func(std::forward<T>(initial), std::forward<U>(value)),
150 std::forward<Us>(values)...);
159 template <
typename T>
162 std::vector<size_t> idx(v.size());
163 std::iota(idx.begin(), idx.end(), 0);
165 std::sort(idx.begin(), idx.end(), [&v](
size_t i1,
size_t i2) { return v[i1] < v[i2]; });
177 inline bool endswith(
const std::string &
str,
const std::string &suffix)
179 if (
str.size() < suffix.size())
183 return std::equal(suffix.rbegin(), suffix.rend(),
str.rbegin());
195 return (
reinterpret_cast<std::uintptr_t
>(ptr) % alignment) == 0;
204 inline std::string
tolower(std::string
string)
206 std::transform(
string.begin(),
string.
end(),
string.begin(), [](
unsigned char c) {
return std::tolower(c); });
218 inline std::string
getenv(
const std::string &env_name)
222 return std::string{};
224 const auto env_chr =
std::getenv(env_name.c_str());
225 return env_chr ==
nullptr ? std::string{} : std::string{env_chr};