2 #ifndef HOBBES_UTIL_STR_HPP_INCLUDED 3 #define HOBBES_UTIL_STR_HPP_INCLUDED 16 std::string
env(
const std::string& varname);
17 void env(
const std::string& varname,
const std::string& value);
19 typedef std::vector<std::string>
seq;
20 typedef std::vector<seq>
seqs;
21 typedef std::vector<unsigned int>
lengths;
23 void repeat(
unsigned int n,
const std::string& s, seq*
out);
24 seq
repeat(
unsigned int n,
const std::string& s);
27 unsigned int maxSize(
unsigned int d,
const std::vector<C>& vs) {
31 unsigned int r = vs[0].size();
32 for (
unsigned int i = 1; i < vs.size(); ++i) {
33 r = std::max<unsigned int>(
r, vs[i].size());
40 unsigned int minSize(
unsigned int d,
const std::vector<C>& vs) {
44 unsigned int r = vs[0].size();
45 for (
unsigned int i = 1; i < vs.size(); ++i) {
46 r = std::min<unsigned int>(
r, vs[i].size());
56 std::string
pad(
size_t n);
57 std::string
leftAlign(
size_t w,
const std::string& x);
58 std::string
rightAlign(
size_t w,
const std::string& x);
71 bool is(
const std::string& x) {
72 std::istringstream ss(x);
79 T
to(
const std::string& x) {
80 std::istringstream ss(x);
87 bool to(
const std::string& x, T& out) {
88 std::istringstream ss(x);
94 bool to(
const char* b,
const char* e, T* out) {
95 std::istringstream ss(std::string(b, e));
100 template <
typename T>
102 std::ostringstream ss;
107 std::string
demangle(
const char* tn);
108 std::string
demangle(
const std::type_info& ti);
110 template <
typename T>
115 template <
typename Char>
116 std::basic_string<Char>
trim(
const std::basic_string<Char>& s) {
117 if (s.empty())
return s;
119 unsigned int begin = 0;
120 unsigned int end = 0;
122 for (
int i = 0; i < s.size(); ++i) {
124 if (!std::isspace(c) && c != 0) {
131 for (
int i = s.size() - 1; i >= 0; --i) {
133 if (!std::isspace(c) && c != 0) {
142 return s.substr(begin, end - begin);
146 template <
typename Char>
147 std::pair< std::basic_string<Char>, std::basic_string<Char> >
trim(
const std::pair< std::basic_string<Char>, std::basic_string<Char> >& p) {
148 return std::pair< std::basic_string<Char>, std::basic_string<Char> >(trim<Char>(p.first), trim<Char>(p.second));
151 template <
typename Char>
152 std::vector< std::basic_string<Char> >
trim(
const std::vector< std::basic_string<Char> >& ss) {
153 std::vector< std::basic_string<Char> >
result;
154 for (
typename std::vector< std::basic_string<Char> >::const_iterator s = ss.begin(); s != ss.end(); ++s) {
155 result.push_back(trim<Char>(*s));
160 template <
typename Char>
161 std::basic_string<Char>
trimq(
const std::basic_string<Char>& s,
Char q = (
Char)
'"') {
164 }
else if (s.size() == 1) {
165 return (s[0] == q) ? std::basic_string<Char>() : s;
167 const Char* b = s.c_str();
168 const Char* e = b + s.size() - 1;
175 return std::basic_string<Char>(b, e + 1);
180 template <
typename Char>
181 std::basic_string<Char>
replace(
const std::basic_string<Char>& src,
const std::basic_string<Char>& old_substr,
const std::basic_string<Char>& new_substr) {
182 if (old_substr.empty()) {
186 typedef typename std::basic_string<Char>::size_type SZT;
187 std::basic_string<Char>
result;
188 SZT sz = src.find(old_substr);
191 while (sz != std::basic_string<Char>::npos) {
192 result += std::string(src.begin() + lsz, src.begin() + sz);
193 result += new_substr;
195 lsz = sz + old_substr.size();
196 sz = src.find(old_substr, lsz);
199 if (lsz != std::basic_string<Char>::npos) {
200 result += std::string(src.begin() + lsz, src.end());
208 unsigned char dehex(
const std::string&);
209 std::vector<unsigned char>
dehexs(
const std::string&);
210 char nyb(
unsigned char x);
211 std::string
hex(
unsigned char);
212 std::string
hex(
const std::vector<unsigned char>&);
213 std::string
hex(
const unsigned char*,
size_t);
215 std::string
escape(
const std::string&);
216 std::string
unescape(
const std::string&);
218 bool endsWith(
const std::string& s,
const std::string& sfx);
220 typedef std::pair<std::string, std::string>
pair;
222 inline pair
trim(
const pair& p) {
226 pair
splitAt(
const std::string& s,
unsigned int i);
227 pair
lsplit(
const std::string& s,
const std::string& ss);
228 pair
rsplit(
const std::string& s,
const std::string& ss);
229 seq
csplit(
const std::string& s,
const std::string& ss);
230 pair
readWhile(
bool (*P)(
char),
const std::string& s);
235 unsigned int firstFailIndex(
bool (*P)(
char),
const std::string& s);
238 std::string
cdelim(
const seq& ss,
const std::string& d);
241 typedef std::set<std::string>
set;
242 std::string
show(
const set&);
245 std::string
show(
const named_strings&);
248 template <
typename T>
249 T
foldWithFormat(
const std::string&
str,
const T& s, T (*constF)(
const T&,
const std::string&), T (*expF)(
const T&,
const std::string&)) {
252 std::ostringstream b;
256 for (
size_t i = 0; i < str.size(); ++i) {
268 r = constF(r, b.str());
298 if (std::isalnum(c) != 0 || c ==
'_') {
302 r = expF(r, b.str());
312 r = expF(r, b.str());
331 r = constF(r, b.str());
333 r = expF(r, b.str());
341 std::ostringstream ss;
348 inline seq
strings(
const std::string& a0) { seq
r; r.push_back(a0);
return r; }
349 inline seq
strings(
const std::string& a0,
const std::string& a1) { seq
r; r.push_back(a0); r.push_back(a1);
return r; }
350 inline seq
strings(
const std::string& a0,
const std::string& a1,
const std::string& a2) { seq
r; r.push_back(a0); r.push_back(a1); r.push_back(a2);
return r; }
351 inline seq
strings(
const std::string& a0,
const std::string& a1,
const std::string& a2,
const std::string& a3) { seq
r; r.push_back(a0); r.push_back(a1); r.push_back(a2); r.push_back(a3);
return r; }
352 inline seq
strings(
const std::string& a0,
const std::string& a1,
const std::string& a2,
const std::string& a3,
const std::string& a4) { seq
r; r.push_back(a0); r.push_back(a1); r.push_back(a2); r.push_back(a3); r.push_back(a4);
return r; }
353 inline seq
strings(
const std::string& a0,
const std::string& a1,
const std::string& a2,
const std::string& a3,
const std::string& a4,
const std::string& a5) { seq
r; r.push_back(a0); r.push_back(a1); r.push_back(a2); r.push_back(a3); r.push_back(a4); r.push_back(a5);
return r; }
367 std::ostringstream ss;
369 for (
char c = low; c <= high; ++c) {
373 for (
char c = low; c >= high; --c) {
384 inline std::string
difference(
const std::string& x,
const std::string& y) {
397 std::map<size_t, seq>
rankedMatches(
const std::string&,
size_t maxDist)
const;
404 size_t editDistance(
const std::string&,
const std::string&);
407 seq
closestMatches(
const std::string&,
const set&,
size_t maxDist);
408 seq
closestMatches(
const std::string&,
const seq&,
size_t maxDist);
411 std::string
mustEndWith(
const std::string&,
const std::string&);
bool is(const std::string &x)
Definition: str.H:71
std::basic_string< Char > trimq(const std::basic_string< Char > &s, Char q=(Char)'"')
Definition: str.H:161
std::string mustEndWith(const std::string &, const std::string &)
Definition: str.C:699
std::string rightAlign(size_t w, const std::string &x)
Definition: str.C:62
std::string showLeftAlignedTable(const seqs &tbl)
Definition: str.C:174
std::vector< unsigned char > dehexs(const std::string &)
Definition: str.C:284
prefix_tree(const seq &)
Definition: str.C:653
std::string unescape(const std::string &)
Definition: str.C:358
pair lsplit(const std::string &s, const std::string &ss)
Definition: str.C:215
unsigned int maxSize(unsigned int d, const std::vector< C > &vs)
Definition: str.H:27
std::string expandPath(const std::string &)
Definition: str.C:513
std::basic_string< Char > trim(const std::basic_string< Char > &s)
Definition: str.H:116
std::string charRange(char low, char high)
Definition: str.H:366
unsigned int tableRows(const seqs &tbl)
Definition: str.C:34
unsigned int firstFailIndex(bool(*P)(char), const std::string &s)
Definition: str.C:475
pair readWhile(bool(*P)(char), const std::string &s)
Definition: str.C:254
pair rsplit(const std::string &s, const std::string &ss)
Definition: str.C:224
std::string leftAlign(size_t w, const std::string &x)
Definition: str.C:54
std::string slurp(std::istream &in)
Definition: str.H:340
bool isNyb(char)
Definition: str.C:258
char nyb(unsigned char x)
Definition: str.C:294
std::pair< std::string, std::string > pair
Definition: str.H:220
seq strings()
Definition: str.H:347
std::vector< uint8_t > bytes
Definition: array.H:21
str::seq paths(const std::string &p)
Definition: str.C:708
std::string from(const T &x)
Definition: str.H:101
std::vector< seq > seqs
Definition: str.H:20
bool endsWith(const std::string &s, const std::string &sfx)
Definition: str.C:396
seq closestMatches(const std::string &, size_t maxDist) const
Definition: str.C:673
std::map< size_t, seq > rankedMatches(const std::string &, size_t maxDist) const
Definition: str.C:669
char denyb(char)
Definition: str.C:262
void printLeftAlignedTable(std::ostream &out, const seqs &tbl)
Definition: str.C:147
std::set< T > setDifference(const std::set< T > &lhs, const std::set< T > &rhs)
Definition: array.H:185
std::string showDataSize(size_t bytes)
Definition: str.C:525
std::basic_string< Char > replace(const std::basic_string< Char > &src, const std::basic_string< Char > &old_substr, const std::basic_string< Char > &new_substr)
Definition: str.H:181
std::string difference(const std::string &x, const std::string &y)
Definition: str.H:384
std::string cdelim(const seq &ss, const std::string &d)
Definition: str.C:486
void printRightAlignedTable(std::ostream &out, const seqs &tbl)
Definition: str.C:151
std::string hex(unsigned char)
Definition: str.C:299
T foldWithFormat(const std::string &str, const T &s, T(*constF)(const T &, const std::string &), T(*expF)(const T &, const std::string &))
Definition: str.H:249
unsigned char dehex(const std::string &)
Definition: str.C:274
const T * end(const array< T > *d)
Definition: tylift.H:88
std::map< std::string, std::string > named_strings
Definition: str.H:244
T to(const std::string &x)
Definition: str.H:79
const T * begin(const array< T > *d)
Definition: tylift.H:87
size_t r(const reader::MetaData &md, size_t o, T *t)
Definition: storage.H:1730
std::string expandVars(const std::string &)
Definition: str.C:503
void w(const T &x, bytes *out)
Definition: net.H:282
std::vector< std::string > seq
Definition: str.H:19
std::string show(const set &)
Definition: str.C:400
unsigned int maxStrLen(const seq &col)
Definition: str.C:38
#define out
Definition: netio.H:19
void printHeadlessLeftAlignedTable(std::ostream &out, const seqs &tbl)
Definition: str.C:166
std::string env(const std::string &varname)
Definition: str.C:9
ptnode * root
Definition: str.H:400
uint32_t result
Definition: regex.C:376
std::string demangle(const char *tn)
Definition: str.C:186
pair splitAt(const std::string &s, unsigned int i)
Definition: str.C:207
~prefix_tree()
Definition: str.C:665
unsigned int minSize(unsigned int d, const std::vector< C > &vs)
Definition: str.H:40
std::string printableChars()
Definition: str.H:380
char readCharDef(const std::string &)
Definition: str.C:438
unsigned int tableCols(const seqs &tbl)
Definition: str.C:30
std::vector< unsigned int > lengths
Definition: str.H:21
std::set< typename CT::value_type > toSet(const CT &xs)
Definition: array.H:151
seq csplit(const std::string &s, const std::string &ss)
Definition: str.C:233
std::string escape(const std::string &)
Definition: str.C:325
size_t editDistance(const std::string &, const std::string &)
Definition: str.C:678
std::string showRightAlignedTable(const seqs &tbl)
Definition: str.C:180
std::string pad(size_t n)
Definition: str.C:50
bool in(T x, const std::set< T > &xs)
Definition: array.H:47
bool isDigit(char c)
Definition: str.C:467
void repeat(unsigned int n, const std::string &s, seq *out)
Definition: str.C:18
bool isNotDigit(char c)
Definition: str.C:471
void printHeadlessRightAlignedTable(std::ostream &out, const seqs &tbl)
Definition: str.C:170