diff --git a/.common/cpp/skeleton.cpp b/.common/cpp/skeleton.cpp index cfea8de..7dfbc25 100644 --- a/.common/cpp/skeleton.cpp +++ b/.common/cpp/skeleton.cpp @@ -22,6 +22,58 @@ #pragma region helpers +#pragma region debug +void dbg_out() { std::cerr << std::endl; } +template +void dbg_out(Head H, Tail... T) { + std::cerr << ' ' << H; + dbg_out(T...); +} +#ifdef LOCAL +#define dbg(...) \ + std::cerr << '[' << __FILE__ << ':' << __LINE__ << "] (" << #__VA_ARGS__ \ + << "):", \ + dbg_out(__VA_ARGS__) +#else +#define dbg(...) +#endif +#pragma endregion debug + +#pragma region functional +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0200r0.html +template +class y_combinator_result { + Fun fun_; + + public: + template + explicit y_combinator_result(T &&fun) : fun_(std::forward(fun)) {} + template + decltype(auto) operator()(Args &&...args) { + return fun_(std::ref(*this), std::forward(args)...); + } +}; +template +decltype(auto) y_combinator(Fun &&fun) { + return y_combinator_result>(std::forward(fun)); +} +#pragma endregion /* functional */ + +#pragma region input +template +std::vector load_vector(std::size_t size) { + std::vector result{}; + + for (auto i = 0u; i < size; ++i) { + T x; + std::cin >> x; + result.push_back(std::move(x)); + } + + return result; +} +#pragma endregion /* input */ + #pragma region math static constexpr std::int32_t MODULO = 1000000007; @@ -61,58 +113,6 @@ inline void no() { std::cout << "NO\n"; } inline void yesno(bool ans) { std::cout << (ans ? "YES" : "NO") << "\n"; } #pragma endregion /* output */ -#pragma region debug -void dbg_out() { std::cerr << std::endl; } -template -void dbg_out(Head H, Tail... T) { - std::cerr << ' ' << H; - dbg_out(T...); -} -#ifdef LOCAL -#define dbg(...) \ - std::cerr << '[' << __FILE__ << ':' << __LINE__ << "] (" << #__VA_ARGS__ \ - << "):", \ - dbg_out(__VA_ARGS__) -#else -#define dbg(...) -#endif -#pragma endregion debug - -#pragma region input -template -std::vector load_vector(std::size_t size) { - std::vector result{}; - - for (auto i = 0u; i < size; ++i) { - T x; - std::cin >> x; - result.push_back(std::move(x)); - } - - return result; -} -#pragma endregion /* input */ - -#pragma region functional -// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0200r0.html -template -class y_combinator_result { - Fun fun_; - - public: - template - explicit y_combinator_result(T &&fun) : fun_(std::forward(fun)) {} - template - decltype(auto) operator()(Args &&...args) { - return fun_(std::ref(*this), std::forward(args)...); - } -}; -template -decltype(auto) y_combinator(Fun &&fun) { - return y_combinator_result>(std::forward(fun)); -} -#pragma endregion /* functional */ - #define LOOP(var, n) for (auto var = 0; var < n; ++var) #pragma endregion /* helpers */