23 auto pred=[](
char c){
return std::isspace(
c); };
25 std::string_view::const_iterator left =
26 std::find_if_not(s.begin(), s.end(),
pred);
30 std::size_t i = std::distance(s.begin(), left);
32 std::string_view::const_reverse_iterator right =
33 std::find_if_not(s.rbegin(), s.rend(),
pred);
34 std::size_t j = std::distance(right, s.rend()) - 1;
37 return std::string{s.substr(i, (j - i + 1))};
43 std::vector<std::string> &result,
58 std::size_t
n = s.length();
59 INVARIANT(
n > 0,
"Empty string case should already be handled");
61 std::size_t start = 0;
72 std::string
new_s = std::string{s.substr(start, i - start)};
78 result.push_back(std::move(
new_s));
86 std::string
new_s = std::string{s.substr(start,
n - start)};
92 result.push_back(std::move(
new_s));
110 if(result.size() != 2)
113 "expected string '" + std::string{s} +
114 "' to contain two substrings "
116 delim +
" but has " + std::to_string(result.size())};
123std::vector<std::string>
126 std::vector<std::string> result;
134 const size_t index=s.find_last_of(
delim);
135 if(index!=std::string::npos)
136 result=s.substr(0, index);
144 for(std::size_t i=0; i<s.size(); i++)
146 if(s[i]==
'\\' || s[i]==
'"')
167 const int uch{
static_cast<unsigned char>(
ch)};
173 escaped <<
'_' << std::hex << std::setfill(
'0') << std::setw(2) <<
uch;
181 return std::string{};
188 const std::string &line,
190 const std::size_t width)
196 std::string::const_iterator left,
197 std::string::const_iterator right,
199 const std::size_t width)
206 auto distance = std::distance(left, right);
214 result.append(left, right);
226 auto rit_r = std::reverse_iterator<decltype(it)>(it) - 1;
246 result.append(left, right);
250 }
while(
static_cast<std::size_t
>(std::distance(
it_line_begin, right)) >
virtual void clear()
Reset the abstract state.
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Thrown when failing to deserialize a value from some low level format, like JSON or raw bytes.
#define CHECK_RETURN(CONDITION)
#define PRECONDITION(CONDITION)
#define INVARIANT(CONDITION, REASON)
This macro uses the wrapper function 'invariant_violated_string'.
void split_string(std::string_view s, char delim, std::vector< std::string > &result, bool strip, bool remove_empty)
std::string capitalize(std::string_view s)
std::string escape_non_alnum(std::string_view to_escape)
Replace non-alphanumeric characters with _xx escapes, where xx are hex digits.
std::string trim_from_last_delimiter(std::string_view s, const char delim)
std::string escape(std::string_view s)
Generic escaping of strings; this is not meant to be a particular programming language.
std::string wrap_line(const std::string &line, const std::size_t left_margin, const std::size_t width)
Wrap line at spaces to not extend past the right margin, and include given padding with spaces to the...
std::string strip_string(std::string_view s)
Remove all whitespace characters from either end of a string.