24 #ifndef ARM_COMPUTE_MISC_UTILITY_H 25 #define ARM_COMPUTE_MISC_UTILITY_H 40 template <std::size_t...>
45 template <std::size_t
N, std::size_t... S>
46 struct index_sequence_generator : index_sequence_generator < N - 1, N - 1, S... >
50 template <std::size_t... S>
51 struct index_sequence_generator<0u, S...> : index_sequence<S...>
53 using type = index_sequence<S...>;
56 template <std::
size_t N>
59 template <
typename T, std::size_t
N, T val, T... vals>
60 struct generate_array : generate_array < T, N - 1, val, val, vals... >
64 template <
typename T, T val, T... vals>
65 struct generate_array<T, 0, val, vals...>
67 static constexpr std::array<T,
sizeof...(vals)> value{ vals... };
70 template <
typename T, T val, T... vals>
71 constexpr std::array<T,
sizeof...(vals)> generate_array<T, 0, val, vals...>::value;
76 template <std::size_t... S,
78 typename T = std::array<typename std::iterator_traits<Iterator>::value_type,
sizeof...(S)>>
81 return T{ { first[S]... } };
85 template <std::
size_t N,
typename Iterator>
86 std::array<typename std::iterator_traits<Iterator>::value_type, N>
make_array(Iterator first, Iterator last)
100 template <
typename DataType,
typename RangeType = DataType>
103 const DataType &upper = std::numeric_limits<RangeType>::max())
105 return std::max(lower, std::min(n, upper));
109 template <
typename F>
120 template <
typename F,
typename T,
typename... Ts>
123 func(std::forward<T>(arg));
124 for_each(std::forward<F>(func), std::forward<Ts>(
args)...);
131 template <
typename F,
typename T>
134 return std::forward<T>(value);
144 template <
typename F,
typename T,
typename U,
typename... Us>
145 inline auto foldl(F &&func, T &&initial, U &&value, Us &&... values) -> decltype(func(std::forward<T>(initial), std::forward<U>(value)))
147 return foldl(std::forward<F>(func), func(std::forward<T>(initial), std::forward<U>(value)), std::forward<Us>(values)...);
156 template <
typename T>
159 std::vector<size_t> idx(v.size());
160 std::iota(idx.begin(), idx.end(), 0);
162 std::sort(idx.begin(), idx.end(),
163 [&v](
size_t i1,
size_t i2)
165 return v[i1] < v[i2];
178 inline bool endswith(
const std::string &
str,
const std::string &suffix)
180 if(str.size() < suffix.size())
184 return std::equal(suffix.rbegin(), suffix.rend(), str.rbegin());
196 return (reinterpret_cast<std::uintptr_t>(ptr) % alignment) == 0;
205 inline std::string
tolower(std::string
string)
207 std::transform(
string.begin(),
string.
end(),
string.begin(), [](
unsigned char c)
222 inline std::string
getenv(
const std::string &env_name)
226 return std::string{};
228 const auto env_chr =
std::getenv(env_name.c_str());
229 return env_chr ==
nullptr ? std::string{} : std::string{ env_chr };
std::string getenv(const std::string &env_name)
Get environment variable as a string.
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.