24#ifdef __cpp_lib_execution
29 template<
typename T>
constexpr const T&
middle(
const std::vector<T>& container) {
return container[container.size() / 2]; }
31 template<sp_i IT, std::invocable<IT> F>
void for_each(
const IT start,
const IT
end, F&& FN) {
33 static tbb::affinity_partitioner ap;
34 tbb::parallel_for(start,
end, std::forward<F>(FN), ap);
36 for(IT I = start; I <
end; ++I) FN(I);
40 template<sp_i IT, std::invocable<IT> F>
void for_each(
const IT
end, F&& FN) {
return for_each(
static_cast<IT
>(0),
end, std::forward<F>(FN)); }
43#ifdef __cpp_lib_execution
44 return std::max_element(std::execution::par, start,
end);
46 return std::max_element(start,
end);
50 template<
typename T> [[maybe_unused]]
const std::vector<T>&
unique(std::vector<T>& container) {
51 std::sort(container.begin(), container.end());
52 container.erase(std::unique(container.begin(), container.end()), container.end());
53 container.shrink_to_fit();
57 template<
class Container,
class Handler>
requires requires(Container x) { x.begin(); x.end(); }
auto all_of(Container& target, Handler&& func) {
59#ifdef __cpp_lib_execution
62 target.begin(), target.end(), std::forward<Handler>(func)
66 template<
class Container,
class Handler>
requires requires(Container x) { x.begin(); x.end(); }
auto none_of(Container& target, Handler&& func) {
68#ifdef __cpp_lib_execution
71 target.begin(), target.end(), std::forward<Handler>(func)
75 template<
class Container,
class Handler>
requires requires(Container x) { x.begin(); x.end(); }
auto any_of(Container& target, Handler&& func) {
77#ifdef __cpp_lib_execution
80 target.begin(), target.end(), std::forward<Handler>(func)
84 template<
typename T>
constexpr T&
hacker(
const T& I) {
return const_cast<T&
>(I); }
86 template<
typename T>
constexpr T*&
hacker(
const T*
const& I) {
return const_cast<T*&
>(I); }
88 template<
typename T>
requires std::signed_integral<T> || std::floating_point<T>
constexpr T
sign(
const T I) {
return (I > T(0)) - (I < T(0)); }
90 template<std::
floating_po
int T>
constexpr T
clamp(
const T c, T a, T b) {
91 if(a > b) std::swap(a, b);
92 return std::max(a, std::min(b, c));
95 template<std::
floating_po
int T>
constexpr T
clamp_unit(
const T c) {
return clamp(c, T(0), T(1)); }
97 template<std::
floating_po
int T>
bool approx_equal(
const T x,
const T y,
int ulp = 2) {
return std::fabs(x - y) <= std::numeric_limits<T>::epsilon() * std::fabs(x + y) * ulp || std::fabs(x - y) < std::numeric_limits<T>::min(); }
99 unsigned long long binomial(
unsigned long long,
unsigned long long);
106 std::string
to_upper(
const std::string&);
107 std::string
to_lower(
const std::string&);
108 std::string
to_upper(std::string&&);
109 std::string
to_lower(std::string&&);
111 namespace expression {
112 std::vector<std::pair<std::string, unsigned>>
split(std::string_view variable_string);
116template<
typename T>
bool get_input(std::istringstream& stream, T& output) {
return static_cast<bool>(stream >> output); }
118template<
typename T>
bool get_input(std::istringstream& stream, Col<T>& output) {
119 for(
auto& item : output)
120 if(!
get_input(stream, item))
return false;
124template<
typename T,
typename...
U>
bool get_input(std::istringstream& stream, T& output,
U&... rest) {
return get_input(stream, output) &&
get_input(stream, rest...); }
126template<
typename... Ts>
bool get_input(std::istringstream& stream, std::tuple<Ts...>& output) {
127 return std::apply([&](
auto&... items) {
return get_input(stream, items...); }, output);
131 std::vector<T> output;
133 while(
get_input(stream, value)) output.emplace_back(value);
140 while(
get_input(stream, value)) output.insert(value);
144template<
typename T1,
typename T2,
typename... Ts>
auto get_remaining(std::istringstream& stream) {
145 std::tuple<std::vector<T1>, std::vector<T2>, std::vector<Ts>...> output;
146 std::tuple<T1, T2, Ts...> temp;
147 while(
get_input(stream, temp)) std::apply([&](
auto&... containers) { std::apply([&](
auto&&... items) { ((containers.emplace_back(items)), ...); }, temp); }, output);
152 std::vector<std::tuple<Ts...>> output;
153 std::tuple<Ts...> temp;
154 while(
get_input(stream, temp)) output.emplace_back(temp);
158template<
typename T> T
get_input(std::istringstream& stream) {
169 for(
auto& item : output)
170 if(!stream.eof() && !
get_input(stream, item))
return false;
180bool is_equal(std::string_view, std::string_view);
186bool if_contain(
const std::string&,
const char*);
187bool if_contain(
const std::string&,
const std::string&);
194double perturb(
double,
double = 1
E-5);
Storage< T >::iterator end(Storage< T > &S)
Definition Storage.hpp:211
std::vector< std::pair< std::string, unsigned > > split(std::string_view variable_string)
Definition utility.cpp:70
Definition SparseMatMAGMA.hpp:43
auto any_of(Container &target, Handler &&func)
Definition utility.h:75
const std::vector< T > & unique(std::vector< T > &container)
Definition utility.h:50
auto all_of(Container &target, Handler &&func)
Definition utility.h:57
bool approx_equal(const T x, const T y, int ulp=2)
Definition utility.h:97
char to_lower(char)
Definition utility.cpp:38
constexpr T sign(const T I)
Definition utility.h:88
unsigned long long binomial(unsigned long long, unsigned long long)
Definition utility.cpp:22
constexpr T clamp(const T c, T a, T b)
Definition utility.h:90
auto none_of(Container &target, Handler &&func)
Definition utility.h:66
char to_upper(char)
Definition utility.cpp:36
constexpr T max_element(T start, T end)
Definition utility.h:42
void for_each(const IT start, const IT end, F &&FN)
Definition utility.h:31
constexpr T & hacker(const T &I)
Definition utility.h:84
constexpr const T & middle(const std::vector< T > &container)
Definition utility.h:29
constexpr T clamp_unit(const T c)
Definition utility.h:95
bool if_startswith(std::string_view, std::string_view)
Definition utility.cpp:110
void ignore_whitespace(std::istringstream &)
Definition utility.cpp:93
bool is_integer(const std::string &)
Definition utility.cpp:127
bool is_equal(char, char)
Definition utility.cpp:104
bool get_optional_input(std::istringstream &stream, T &output)
Definition utility.h:166
bool get_input(std::istringstream &stream, T &output)
Definition utility.h:116
auto get_remaining(std::istringstream &stream)
Definition utility.h:130
bool is_equal_any(std::string_view a, S... rest)
Definition utility.h:182
auto get_remaining_as_set(std::istringstream &stream)
Definition utility.h:137
auto get_remaining_as_tuple(std::istringstream &stream)
Definition utility.h:151
double perturb(double, double=1E-5)
Definition utility.cpp:129
bool is_true(std::string_view)
Definition utility.cpp:123
bool is_false(std::string_view)
Definition utility.cpp:125
bool if_contain(const std::string &, const char *)
Definition utility.cpp:119