ppforest2 v0.1.0
Projection Pursuit Decision Trees and Random Forests
Loading...
Searching...
No Matches
Table.hpp
Go to the documentation of this file.
1
10#pragma once
11
12#include <string>
13#include <vector>
14
24 enum class Align { left, right };
25
31 inline int visual_width(std::string const& s) {
32 int width = 0;
33 bool in_escape = false;
34
35 for (char c : s) {
36 if (in_escape) {
37 if (c == 'm')
38 in_escape = false;
39 } else if (c == '\033') {
40 in_escape = true;
41 } else {
42 ++width;
43 }
44 }
45
46 return width;
47 }
48
55 inline std::string pad(std::string const& s, int width, Align align = Align::right) {
56 int gap = width - visual_width(s);
57
58 if (gap <= 0)
59 return s;
60
61 std::string spaces(static_cast<std::size_t>(gap), ' ');
62
63 return align == Align::right ? spaces + s : s + spaces;
64 }
65
69 struct Column {
70 std::string label;
71 int width;
73 bool enabled = true;
74 };
75
77 using Row = std::vector<std::string>;
78
84 inline std::string format_row(std::vector<Column> const& columns, Row const& cells, std::string const& sep = " ") {
85 std::string line;
86 bool first = true;
87
88 for (std::size_t i = 0; i < columns.size() && i < cells.size(); ++i) {
89 if (!columns[i].enabled) {
90 continue;
91 }
92
93 if (!first) {
94 line += sep;
95 }
96
97 first = false;
98 line += pad(cells[i], columns[i].width, columns[i].align);
99 }
100
101 return line;
102 }
103
107 inline std::string format_separator(std::vector<Column> const& columns, std::string const& sep = " ") {
108 int total = 0;
109 bool first = true;
110
111 for (std::size_t i = 0; i < columns.size(); ++i) {
112 if (!columns[i].enabled) {
113 continue;
114 }
115
116 if (!first) {
117 total += static_cast<int>(sep.size());
118 }
119
120 first = false;
121 total += columns[i].width;
122 }
123
124 return std::string(static_cast<std::size_t>(total), '-');
125 }
126
130 inline Row header_labels(std::vector<Column> const& columns) {
131 Row labels;
132 labels.reserve(columns.size());
133
134 for (auto const& col : columns) {
135 labels.push_back(col.label);
136 }
137
138 return labels;
139 }
140
147 inline std::string format_md_row(Row const& cells, std::vector<Column> const& columns = {}) {
148 std::string line = "|";
149
150 for (std::size_t i = 0; i < cells.size(); ++i) {
151 if (!columns.empty() && i < columns.size() && !columns[i].enabled) {
152 continue;
153 }
154
155 line += " " + cells[i] + " |";
156 }
157
158 return line;
159 }
160
164 inline std::string format_md_separator(std::vector<Column> const& columns) {
165 std::string line = "|";
166
167 for (auto const& col : columns) {
168 if (!col.enabled) {
169 continue;
170 }
171
172 line += (col.align == Align::right) ? "---:|" : ":---|";
173 }
174
175 return line;
176 }
177}
Column-driven table formatting with ANSI-safe alignment.
Definition Table.hpp:23
std::string format_separator(std::vector< Column > const &columns, std::string const &sep=" ")
Generate a separator line spanning the full table width.
Definition Table.hpp:107
Align
Definition Table.hpp:24
@ right
Definition Table.hpp:24
@ left
Definition Table.hpp:24
std::string pad(std::string const &s, int width, Align align=Align::right)
Pad a string to a target visual width, handling ANSI codes.
Definition Table.hpp:55
int visual_width(std::string const &s)
Compute the visual width of a string, ignoring ANSI escape codes.
Definition Table.hpp:31
std::string format_row(std::vector< Column > const &columns, Row const &cells, std::string const &sep=" ")
Format a row of cells according to column definitions.
Definition Table.hpp:84
std::vector< std::string > Row
A row of pre-formatted cell strings.
Definition Table.hpp:77
std::string format_md_row(Row const &cells, std::vector< Column > const &columns={})
Format a row as a markdown table row.
Definition Table.hpp:147
Row header_labels(std::vector< Column > const &columns)
Extract header labels from column definitions as a Row.
Definition Table.hpp:130
std::string format_md_separator(std::vector< Column > const &columns)
Generate a markdown alignment row.
Definition Table.hpp:164
Column definition for table formatting.
Definition Table.hpp:69
Align align
Definition Table.hpp:72
bool enabled
Definition Table.hpp:73
int width
Definition Table.hpp:71
std::string label
Definition Table.hpp:70