| 29 | } |
| 30 | |
| 31 | void TextTable::show(std::ostream& os) { |
| 32 | if (m_rows.empty()) |
| 33 | return; |
| 34 | auto& last_row = m_rows.front(); |
| 35 | bool first = true; |
| 36 | for (auto& row : m_rows) { |
| 37 | auto& lrow = |
| 38 | (last_row.values.size() * char_length(last_row.params.horizontal)) > |
| 39 | (row.values.size() * char_length(row.params.horizontal)) |
| 40 | ? last_row |
| 41 | : row; |
| 42 | // line before row |
| 43 | if (lrow.params.horizontal) { |
| 44 | if (not first) |
| 45 | os << std::endl; |
| 46 | os << m_prefix; |
| 47 | if (lrow.params.corner) |
| 48 | os << lrow.params.corner; |
| 49 | size_t skip_size = 0; |
| 50 | // table name |
| 51 | if (first) { |
| 52 | os << m_name; |
| 53 | skip_size = m_name.length(); |
| 54 | } |
| 55 | for (size_t i = 0; i < lrow.values.size(); ++i) { |
| 56 | auto max_w = m_cols_max_w.at(i) + m_padding * 2; |
| 57 | if (max_w + char_length(lrow.params.corner) <= skip_size) { |
| 58 | skip_size = skip_size - max_w - char_length(lrow.params.corner); |
| 59 | continue; |
| 60 | } |
| 61 | size_t rest = max_w + char_length(lrow.params.corner) - skip_size; |
| 62 | skip_size = 0; |
| 63 | if (rest > char_length(lrow.params.corner)) { |
| 64 | os << std::string( |
| 65 | rest - char_length(lrow.params.corner), |
| 66 | lrow.params.horizontal); |
| 67 | rest = char_length(lrow.params.corner); |
| 68 | } |
| 69 | if (rest > 0 && lrow.params.corner) |
| 70 | os << lrow.params.corner; |
| 71 | } |
| 72 | } else if (first) { |
| 73 | os << m_prefix << ' ' << m_name; |
| 74 | } |
| 75 | first = false; |
| 76 | os << std::endl << m_prefix; |
| 77 | if (row.params.vertical) |
| 78 | os << row.params.vertical; |
| 79 | // row |
| 80 | for (size_t i = 0; i < row.values.size(); ++i) { |
| 81 | auto& str = row.values.at(i); |
| 82 | auto max_w = m_cols_max_w.at(i) + 2 * m_padding; |
| 83 | if (row.params.align == Align::Mid) { |
| 84 | mid(os, str, max_w); |
| 85 | } else if (row.params.align == Align::Left) { |
| 86 | os << std::setw(max_w) << std::left << str; |
| 87 | } else { |
| 88 | os << std::setw(max_w) << std::right << str; |
no test coverage detected