33 constexpr std::size_t PADDING{1};
42 auto gutter = std::string(
static_cast<std::size_t
>(indent) * 4,
' ');
44 auto const ncolumns =
headers.size();
45 std::vector<std::size_t> col_width(ncolumns);
49 all_alignments.reserve(ncolumns);
50 for (
unsigned i =
alignments.size(); i < ncolumns; i++) {
55 std::size_t row_width{};
56 for (
unsigned i = 0; i <
headers.size(); i++) {
57 col_width[i] =
headers[i].length() + PADDING;
58 row_width += col_width[i];
63 if (
title.length() > row_width) {
64 auto const extra_size =
title.length() - row_width;
65 auto column_pad = extra_size / ncolumns;
66 if ((extra_size % ncolumns) != 0) {
69 for (
auto& column: col_width) {
75 for (
const auto& row:
rows) {
76 for (
unsigned i = 0; i < row.size(); i++) {
77 if (col_width[i] < (row[i].length()) + PADDING) {
78 col_width[i] = row[i].length() + PADDING;
83 std::stringstream header;
85 for (
size_t i = 0; i <
headers.size(); i++) {
86 assert(col_width[i] <= std::numeric_limits<int>::max());
88 static_cast<int>(col_width[i]),
90 header << text <<
" | ";
93 row_width = header.str().length();
94 auto separator_line = std::string(row_width - 1,
'-');
98 assert(row_width >= 3 && row_width - 3 <= std::numeric_limits<int>::max());
100 static_cast<int>(row_width - 3),
102 stream <<
'\n' << gutter << separator_line;
103 stream <<
'\n' << gutter <<
'|' << fmt_title <<
'|';
107 stream <<
'\n' << gutter << separator_line;
108 stream <<
'\n' << gutter << header.str();
109 stream <<
'\n' << gutter << separator_line;
112 for (
const auto& row:
rows) {
113 stream <<
'\n' << gutter <<
"| ";
114 for (
unsigned i = 0; i < row.size(); i++) {
115 assert(col_width[i] <= std::numeric_limits<int>::max());
117 static_cast<int>(col_width[i]),
124 stream <<
'\n' << gutter << separator_line <<
'\n';
128 print(std::cout, indent);