24 template<sp_i IT,
typename F>
void suanpan_for(
const IT start,
const IT
end, F&& FN) {
26 tbb::parallel_for(start,
end, std::forward<F>(FN));
28 for(IT I = start; I <
end; ++I) FN(I);
33 template<
typename T> [[maybe_unused]]
const std::vector<T>&
unique(std::vector<T>& container) {
34 std::sort(container.begin(), container.end());
35 container.erase(
std::unique(container.begin(), container.end()), container.end());
36 container.shrink_to_fit();
40 template<
typename T> constexpr
T&
hacker(
const T& I) {
return const_cast<T&
>(I); }
42 template<
typename T> constexpr
T*&
hacker(
const T*
const& I) {
return const_cast<T*&
>(I); }
44 template<
typename T>
T sign(
const T& I) {
return (I >
T(0)) - (I <
T(0)); }
46 template<
typename T> std::enable_if_t<!std::numeric_limits<T>::is_integer,
bool>
approx_equal(T x, T y,
int ulp = 2) {
return fabs(x - y) <= std::numeric_limits<T>::epsilon() * fabs(x + y) * ulp || fabs(x - y) < std::numeric_limits<T>::min(); }
48 unsigned long long binomial(
unsigned long long,
unsigned long long);
61 template<
typename T>
bool get_input(istringstream& I, T& O) {
return static_cast<bool>(I >> O); }
63 template<
typename T>
bool get_input(istringstream& I, Col<T>& O) {
65 for(
auto&
P : O) code &=
static_cast<bool>(I >>
P);
69 template<
typename T,
typename...U>
bool get_input(istringstream& I, T& O, U&...R) {
return static_cast<bool>(I >> O) ?
get_input(I, R...) :
false; }
80 if(I.eof())
return true;
82 return static_cast<bool>(I >> O);
87 for(
auto&
P : O) code &= I.eof() ? true :
static_cast<bool>(I >>
P);
92 if(I.eof())
return true;
97 bool is_equal(
const char*,
const char*);
100 bool is_equal(
const string&,
const char*);
101 bool is_equal(
const string&,
const string&);
104 bool if_contain(
const string&,
const string&);
107 template<std::equality_comparable T> std::pair<bool, std::int64_t>
if_contain(
const std::vector<T>& container,
const T target) {
108 auto position = std::find(container.begin(), container.end(), target);
110 return {position != container.end() && container.size() > 0, position - container.begin()};
Storage< T >::iterator end(Storage< T > &S)
Definition: Storage.hpp:202
Definition: MatrixModifier.hpp:36
constexpr T & hacker(const T &I)
Definition: utility.h:40
char to_lower(char)
Definition: utility.cpp:37
T sign(const T &I)
Definition: utility.h:44
unsigned long long binomial(unsigned long long, unsigned long long)
Definition: utility.cpp:21
char to_upper(char)
Definition: utility.cpp:35
const std::vector< T > & unique(std::vector< T > &container)
Definition: utility.h:33
std::enable_if_t<!std::numeric_limits< T >::is_integer, bool > approx_equal(T x, T y, int ulp=2)
Definition: utility.h:46
bool get_input(istringstream &I, T &O)
Definition: utility.h:61
bool is_false(const char *)
Definition: utility.cpp:93
void ignore_whitespace(istringstream &)
Definition: utility.cpp:69
bool if_contain(const string &, const char *)
Definition: utility.cpp:85
bool is_equal(const char *, const char *)
Definition: utility.cpp:75
void suanpan_for(const IT start, const IT end, F &&FN)
Definition: utility.h:24
bool get_optional_input(istringstream &I, T &O)
Definition: utility.h:79
bool is_true(const char *)
Definition: utility.cpp:91