40 template<
typename... Ts>
41 static inline std::string
format(
const char*
fmt,
const Ts&... args)
44 std::string dst(size,
' ');
46 dst.resize(size_filled);
56 template<
typename... Ts>
79 static std::vector<std::string>
split(
const std::string& in,
const std::string& delim)
81 std::vector<std::string> dst;
82 std::string::size_type beg = 0, end;
83 while((end = in.find(delim, beg)) != std::string::npos)
85 dst.push_back(in.substr(beg, end - beg));
86 beg = end + delim.size();
88 dst.push_back(in.substr(beg));
97 static std::vector<std::string>
split(
const std::string& in)
99 std::vector<std::string> dst;
100 std::string::size_type beg = 0, end = 0;
101 while((beg = in.find_first_not_of(
" ", end)) != std::string::npos)
103 end = in.find_first_of(
" ", beg);
104 dst.push_back(in.substr(beg, end - beg));
108 static bool startswith(
const std::string& in,
const std::string& prefix)
110 return (in.size() >= prefix.size()) && (in.substr(0, prefix.size()) == prefix);
112 static bool endswith(
const std::string& in,
const std::string& suffix)
114 return (in.size() >= suffix.size()) && (in.substr(in.size() - suffix.size()) == suffix);
116 static std::string
strip(
const std::string& in,
const std::string& chars =
" ")
118 std::string::size_type beg = in.find_first_not_of(chars);
119 return (beg == std::string::npos)?
"": in.substr(beg, in.find_last_not_of(chars) - beg + 1);
121 static std::string
center(
const std::string& in,
const size_t& width,
const char& fillchar =
' ')
123 if (in.size() >= width) {
126 const size_t nwhitespaces = width - in.size();
127 const size_t nleft = nwhitespaces / 2;
128 const size_t nright = nwhitespaces - nleft;
129 return std::string(nleft, fillchar) + in + std::string(nright, fillchar);
131 static std::string
replace(
const std::string& in,
const std::string& old,
const std::string& new_)
133 std::string dst = in;
134 std::string::size_type pos = dst.find(old);
135 while(pos != std::string::npos)
137 dst.replace(pos, old.size(), new_);
138 pos = dst.find(old, pos + new_.size());
142 static std::string
join(
const std::string& delim,
const std::vector<std::string>& src)
144 return (src.empty())?
"": std::accumulate(src.begin() + 1, src.end(), src[0],
145 [&delim](
const std::string& acc,
const std::string& s) { return acc + delim + s; });
148 static std::string
upper(
const std::string& in)
150 std::string dst = in;
151 std::transform(dst.begin(), dst.end(), dst.begin(), ::toupper);
155 static std::string
lower(
const std::string& in)
157 std::string dst = in;
158 std::transform(dst.begin(), dst.end(), dst.begin(), ::tolower);
165 static typename std::enable_if<std::is_same<T, std::string>::value,
const char*>::type
filter(
const T& s) {
return s.c_str(); }
167 static typename std::enable_if<!std::is_same<T, std::string>::value,
const T&>::type
filter(
const T& s) {
return s; }
181 Frames(
char up =
'-',
char mid =
'-',
char dw =
'-',
char l =
' ',
char r =
' '):
up_(up),
mid_(mid),
dw_(dw),
l_(l),
r_(r) {};
202 const std::vector<std::string>& fmts,
203 const size_t indent = 0,
205 const Frames& frames = {},
206 const Delimiters& delimiters = {}):
209 { assert(titles.size() == fmts.size()||titles.size() == 0); };
222 std::vector<std::string> data(src.size());
223 for(
size_t i = 0UL; i < src.size(); i++) { data[i] =
core::format(
fmts_[
j_].c_str(), src[i]); }
248 const std::string& title =
"",
252 size_t max_width = title.size();
253 for(
const std::string& s : col) { max_width = std::max(max_width, s.size()); }
254 std::vector<std::string> new_col(col.size() + 1);
255 for(
size_t i = 0; i < col.size() + 1; i++)
258 const size_t nwhitespaces = max_width - new_col[i].size();
259 switch((i == 0)? talign: valign)
261 case Align::RIGHT: new_col[i] = std::string(nwhitespaces,
' ') + new_col[i];
break;
262 case Align::LEFT: new_col[i] += std::string(nwhitespaces,
' ');
break;
277 std::string dst =
"";
279 size_t width = std::accumulate(titles.begin(), titles.end(), 0, [](
const size_t& acc,
const std::string& s) { return acc + s.size(); });
281 width += titles.size() - 1;
286 for(
size_t i = 0; i < titles.size(); i++)
289 if (i != titles.size() - 1) {
293 dst += std::string(1,
frames_.
r_) +
"\n";
304 std::string
concat_row(
const std::vector<std::string>& row,
const char& pos)
const
306 std::string dst =
"";
308 size_t width = std::accumulate(row.begin(), row.end(), 0, [](
const size_t& acc,
const std::string& s) { return acc + s.size(); });
310 width += row.size() - 1;
317 for(
size_t i = 0; i < row.size(); i++)
320 if (i != row.size() - 1) {
324 dst += std::string(1,
frames_.
r_) +
"\n";
337 std::string dst =
"";
341 bool with_title =
false;
343 if (!title.empty()) {
349 for(
size_t j = 0UL; j < ncols; j++)
351 std::vector<std::string> col(nrows);
352 for (
size_t i = 0UL; i < nrows; i++) {
353 col[i] =
data_(i, j);
357 std::vector<std::string> col_new(col.begin() + 1, col.end());
365 for(
size_t i = 0UL; i < nrows; i++)
367 std::vector<std::string> row(ncols);
368 for (
size_t j = 0; j < ncols; j++) {
369 row[j] =
data_(i, j);
371 dst +=
concat_row(row, ((i == 0UL)&&!with_title)?
't': (i == nrows - 1)?
'b':
'n');
375 void str(
const std::string& s) {};
389 void set_value(
const size_t& i,
const size_t& j,
const char& dir,
const std::vector<T>& src)
392 for (
size_t k = 0UL; k < src.size(); k++) {
393 data_(i + k, j) = src[k];
395 }
else if (dir ==
'h') {
396 for (
size_t k = 0UL; k < src.size(); k++) {
397 data_(j, i + k) = src[k];
In C++20, the std::format library is introduced. However, it is not supported under restriction of AB...
Definition formatter.h:28
static std::string join(const std::string &delim, const std::vector< std::string > &src)
Definition formatter.h:142
FmtCore(const std::string &fmt)
Definition formatter.h:30
const std::string & fmt()
get the format string
Definition formatter.h:69
std::string format(const Ts &... args)
std::string overload of the varadic template function
Definition formatter.h:57
~FmtCore()
Definition formatter.h:31
static std::string lower(const std::string &in)
Definition formatter.h:155
static bool endswith(const std::string &in, const std::string &suffix)
Definition formatter.h:112
static std::string replace(const std::string &in, const std::string &old, const std::string &new_)
Definition formatter.h:131
static bool startswith(const std::string &in, const std::string &prefix)
Definition formatter.h:108
static std::string upper(const std::string &in)
Definition formatter.h:148
static std::enable_if< std::is_same< T, std::string >::value, constchar * >::type filter(const T &s)
Definition formatter.h:165
void reset(const std::string &fmt="")
reset the format string (std::string overloads)
Definition formatter.h:63
static std::vector< std::string > split(const std::string &in)
split a string with a delimiter, return only non-empty elements
Definition formatter.h:97
static std::enable_if<!std::is_same< T, std::string >::value, constT & >::type filter(const T &s)
Definition formatter.h:167
static std::string format(const char *fmt, const Ts &... args)
static function to format data
Definition formatter.h:41
static std::vector< std::string > split(const std::string &in, const std::string &delim)
split a string with a delimiter, return uncollapse vector
Definition formatter.h:79
static std::string center(const std::string &in, const size_t &width, const char &fillchar=' ')
Definition formatter.h:121
static std::string strip(const std::string &in, const std::string &chars=" ")
Definition formatter.h:116
std::string fmt_
Definition formatter.h:163
Definition formatter.h:171
std::string str()
to get the table as a string
Definition formatter.h:335
struct FmtTable::Alignments aligns_
Align
Definition formatter.h:173
std::string concat_row(const std::vector< std::string > &row, const char &pos) const
concatenate a row into a string
Definition formatter.h:304
void set_value(const size_t &i, const size_t &j, const T &value)
Set the value object.
Definition formatter.h:237
std::vector< std::string > titles_
Definition formatter.h:404
size_t j_
Definition formatter.h:402
std::vector< std::string > fmts_
Definition formatter.h:406
FmtTable(const std::vector< std::string > &titles, const size_t nrows, const std::vector< std::string > &fmts, const size_t indent=0, const Alignments &aligns={}, const Frames &frames={}, const Delimiters &delimiters={})
Construct a new Fmt Table object.
Definition formatter.h:200
struct FmtTable::Delimiters delimiters_
void set_value(const size_t &i, const size_t &j, const char &dir, const std::vector< T > &src)
Set the value object from std::vector.
Definition formatter.h:389
struct FmtTable::Frames frames_
size_t indent_
Definition formatter.h:407
std::vector< std::string > relax_col_width(const std::vector< std::string > &col, const std::string &title="", const Align valign=Align::RIGHT, const Align talign=Align::CENTER)
adjust the width of each column
Definition formatter.h:247
void str(const std::string &s)
Definition formatter.h:375
FmtCore core
Definition formatter.h:175
~FmtTable()
Definition formatter.h:210
std::string concat_title(const std::vector< std::string > &titles) const
concatenate titles into a string
Definition formatter.h:275
FmtTable & operator<<(const std::vector< T > &src)
import data from std::vector
Definition formatter.h:219
NDArray< std::string > data_
Definition formatter.h:405
void iter_set(const size_t val)
Definition formatter.h:377
under the restriction of C++11, a simple alternative to std::vector<T> + std::mdspan....
Definition ndarray.h:31
const std::vector< size_t > & shape() const
Definition ndarray.h:153
#define T
Definition exp.cpp:237
Definition formatter.h:176
Alignments(const Align &val=Align::RIGHT, const Align &title=Align::CENTER)
Definition formatter.h:177
Align val_
Definition formatter.h:178
Align title_
Definition formatter.h:178
Definition formatter.h:184
char v_
Definition formatter.h:186
char h_
Definition formatter.h:186
Delimiters(char h='-', char v=' ')
Definition formatter.h:185
Definition formatter.h:180
char up_
Definition formatter.h:182
Frames(char up='-', char mid='-', char dw='-', char l=' ', char r=' ')
Definition formatter.h:181
char dw_
Definition formatter.h:182
char mid_
Definition formatter.h:182
char l_
Definition formatter.h:182
char r_
Definition formatter.h:182