24 #ifndef ARM_COMPUTE_MISC_UTILITY_H 25 #define ARM_COMPUTE_MISC_UTILITY_H 38 template <std::size_t...>
43 template <std::size_t
N, std::size_t... S>
44 struct index_sequence_generator : index_sequence_generator < N - 1, N - 1, S... >
48 template <std::size_t... S>
49 struct index_sequence_generator<0u, S...> : index_sequence<S...>
51 using type = index_sequence<S...>;
54 template <std::
size_t N>
57 template <
typename T, std::size_t
N, T val, T... vals>
58 struct generate_array : generate_array < T, N - 1, val, val, vals... >
62 template <
typename T, T val, T... vals>
63 struct generate_array<T, 0, val, vals...>
65 static constexpr std::array<T,
sizeof...(vals)> value{ vals... };
68 template <
typename T, T val, T... vals>
69 constexpr std::array<T,
sizeof...(vals)> generate_array<T, 0, val, vals...>::value;
74 template <std::size_t... S,
76 typename T = std::array<typename std::iterator_traits<Iterator>::value_type,
sizeof...(S)>>
79 return T{ { first[S]... } };
83 template <std::
size_t N,
typename Iterator>
84 std::array<typename std::iterator_traits<Iterator>::value_type, N>
make_array(Iterator first, Iterator last)
98 template <
typename DataType,
typename RangeType = DataType>
101 const DataType &upper = std::numeric_limits<RangeType>::max())
103 return std::max(lower, std::min(n, upper));
107 template <
typename F>
118 template <
typename F,
typename T,
typename... Ts>
121 func(std::forward<T>(arg));
129 template <
typename F,
typename T>
132 return std::forward<T>(value);
142 template <
typename F,
typename T,
typename U,
typename... Us>
143 inline auto foldl(F &&
func, T &&initial, U &&value, Us &&... values) -> decltype(
func(std::forward<T>(initial), std::forward<U>(value)))
145 return foldl(std::forward<F>(
func),
func(std::forward<T>(initial), std::forward<U>(value)), std::forward<Us>(values)...);
154 template <
typename T>
157 std::vector<size_t> idx(v.size());
158 std::iota(idx.begin(), idx.end(), 0);
160 std::sort(idx.begin(), idx.end(),
161 [&v](
size_t i1,
size_t i2)
163 return v[i1] < v[i2];
176 inline bool endswith(
const std::string &
str,
const std::string &suffix)
178 if(str.size() < suffix.size())
182 return std::equal(suffix.rbegin(), suffix.rend(), str.rbegin());
194 return (reinterpret_cast<std::uintptr_t>(ptr) % alignment) == 0;
203 inline std::string
tolower(std::string
string)
205 std::transform(
string.begin(),
string.
end(),
string.begin(), [](
unsigned char c)
decltype(strategy::transforms) typedef type
Copyright (c) 2017-2021 Arm Limited.
DataType clamp(const DataType &n, const DataType &lower=std::numeric_limits< RangeType >::lowest(), const DataType &upper=std::numeric_limits< RangeType >::max())
Performs clamping among a lower and upper value.
bool endswith(const std::string &str, const std::string &suffix)
Checks if a string contains a given suffix.
std::string tolower(std::string string)
Convert string to lower case.
#define ARM_COMPUTE_UNUSED(...)
To avoid unused variables warnings.
T && foldl(F &&, T &&value)
Base case of foldl.
void end(TokenStream &in, bool &valid)
void for_each(F &&)
Base case of for_each.
T make_array(Iterator first, index_sequence< S... >)
Iterator updated by execute_window_loop for each window element.
DataType
Available data types.
std::array< typename std::iterator_traits< Iterator >::value_type, N > make_array(Iterator first, Iterator last)
std::vector< size_t > sort_indices(const std::vector< T > &v)
Perform an index sort of a given vector.
bool check_aligned(void *ptr, const size_t alignment)
Checks if a pointer complies with a given alignment.