#pragma once #include #include #include template constexpr void formatted_row(const std::array& gaps, const std::array& titles, const char* const separator = "│") noexcept { for(size_t i = 0; i < N; ++i) printf("%s %*s ", separator, -gaps[i], titles[i]); printf("%s\n", separator); } template constexpr void formatted_line(const std::array& gaps, const char* const right, const char* const middle, const char* const separator, const char* const left) noexcept { printf("%s", right); for(size_t i = 0; i < N; ++i){ for(int32_t j = std::abs(gaps[i]) + 2; j > 0; --j) printf("%s", separator); if(i != N - 1) printf("%s", middle); } printf("%s\n", left); } template constexpr void header(const std::array& titles, const std::array& gaps) noexcept { formatted_line(gaps, "┌", "┬", "─", "┐"); formatted_row(gaps, titles); formatted_line(gaps, "├", "┼", "─", "┤"); } template constexpr inline void footer(const std::array& gaps) noexcept { formatted_line(gaps, "└", "┴", "─", "┘"); } #define duration_ns(a) std::chrono::duration_cast(a).count() #define perf_counter_ns() std::chrono::high_resolution_clock::now() std::string format_time(uint64_t) noexcept; std::string format_time_ns(uint64_t) noexcept; std::string format_byte_size(uint64_t) noexcept; std::string thousand_sep(uint64_t, const char& = ',') noexcept;