#ifndef DEF_utils #define DEF_utils #include #include #define PRINT_VAR(x) std::cout << #x << "\t= " << (x) << "\n" #define PRINT_VEC(x); {std::cout << #x << "\t= "; \ for(unsigned int i_print_vec = 0 ; i_print_vec < (x).size() ; i_print_vec++) \ std::cout << (x)[i_print_vec] << "\t"; \ std::cout << "\n";} #define PRINT_STR(x) std::cout << (x) << "\n" template auto min(const T & a, const T2 & b) -> decltype(a | b) { return (a < b) ? T(a) : T(b); } template auto max(const T & a, const T2 & b) -> decltype(a | b) { return (a < b) ? T(b) : T(a); } template class C, class... Args> std::ostream& operator<<(std::ostream& os, const C& objs) { for (auto const& obj : objs) os << obj << ' '; return os; } /// Convenience template class to do StdPairValueCatcher(a, b) = someFunctionThatReturnsAnStdPair() /// Instead of doing a = std::get<0>(result_from_function), b = std::get<1>(result_from_function) template struct StdPairValueCatcher { A & a; B & b; StdPairValueCatcher(A & a_, B & b_) : a(a_), b(b_) {} std::pair const& operator=(std::pair const& p) {a = std::get<0>(p); b = std::get<1>(p); return p; } }; #endif