#include "Table.h" #include #include "StringUtil.h" TextTable::TextTable(const std::vector& headers) : headers_(headers) {} void TextTable::addRow(const std::vector& cells) { std::vector row = cells; row.resize(headers_.size()); rows_.push_back(row); } std::size_t TextTable::rowCount() const { return rows_.size(); } std::string TextTable::render() const { std::vector widths; for (const std::string& header : headers_) { widths.push_back(StringUtil::displayWidth(header)); } for (const std::vector& row : rows_) { for (std::size_t c = 0; c < row.size(); ++c) { widths[c] = std::max(widths[c], StringUtil::displayWidth(row[c])); } } auto formatLine = [&widths](const std::vector& cells) { std::string line; for (std::size_t c = 0; c < cells.size(); ++c) { if (c > 0) { line += " | "; } line += cells[c]; line.append(widths[c] - StringUtil::displayWidth(cells[c]), ' '); } return line + "\n"; }; std::string out = formatLine(headers_); for (std::size_t c = 0; c < widths.size(); ++c) { if (c > 0) { out += "-+-"; } out.append(widths[c], '-'); } out += "\n"; for (const std::vector& row : rows_) { out += formatLine(row); } if (rows_.empty()) { out += "(none)\n"; } return out; }