29 buf += t;
return *
this;
33 buf.append(t.
data(), t.
size());
return *
this;
37 buf += t;
return *
this;
61 buf += t;
return *
this;
94 template<>
struct FastUnsigned<unsigned long long> {
typedef unsigned long long type; };
103 template<
bool IS_SIGNED>
struct AbsHelper;
104 template<>
struct AbsHelper<true> {
107 return (t < 0) ? -t : t;
110 template<>
struct AbsHelper<false> {
119 template<
bool IS_SIGNED>
struct PutSign;
120 template<>
struct PutSign<true> {
121 template<
typename T>
inline void operator()(T t,
char*& p)
const {
122 if (t < 0) *--p =
'-';
125 template<>
struct PutSign<false> {
126 template<
typename T>
inline void operator()(T ,
char*& )
const {
134 template<
typename T>
static inline string toStringImpl(T t)
136 static const bool IS_SIGNED = std::numeric_limits<T>::is_signed;
137 static const unsigned BUF_SIZE = 1 + std::numeric_limits<T>::digits10
138 + (IS_SIGNED ? 1 : 0);
141 char* p = &buf[BUF_SIZE];
143 AbsHelper<IS_SIGNED> absHelper;
144 typename FastUnsigned<T>::type a = absHelper(t);
146 *--p =
'0' + (a % 10);
150 PutSign<IS_SIGNED> putSign;
153 return string(p, &buf[BUF_SIZE] - p);
155 string toString(
long long a) {
return toStringImpl(a); }
156 string toString(
unsigned long long a) {
return toStringImpl(a); }
157 string toString(
long a) {
return toStringImpl(a); }
158 string toString(
unsigned long a) {
return toStringImpl(a); }
160 string toString(
unsigned a) {
return toStringImpl(a); }
161 string toString(
short a) {
return toStringImpl(a); }
162 string toString(
unsigned short a) {
return toStringImpl(a); }
164 string toString(
signed char a) {
return string(1, a); }
165 string toString(
unsigned char a) {
return string(1, a); }
166 string toString(
bool a) {
return string(1,
'0' + a); }
168 static inline char hexDigit(
unsigned x)
170 return (x < 10) ? (
'0' + x) : (
'a' + x - 10);
174 assert((0 < width) && (width <= 8));
180 *--p = hexDigit(x & 15);
183 return string(p, width);
188 return strtol(str.c_str(),
nullptr, 0);
193 result = strtol(str.c_str(), &endptr, 0);
194 return *endptr ==
'\0';
199 return strtoul(str.c_str(),
nullptr, 0);
204 result = strtoul(str.c_str(), &endptr, 0);
205 return *endptr ==
'\0';
210 return strtoull(str.c_str(),
nullptr, 0);
215 if (str ==
"1")
return true;
216 if ((str.
size() == 4) && (strncasecmp(str.
data(),
"true", 4) == 0))
218 if ((str.
size() == 3) && (strncasecmp(str.
data(),
"yes", 3) == 0))
225 return strtod(str.c_str(),
nullptr);
230 result = strtod(str.c_str(), &endptr);
231 return *endptr ==
'\0';
236 string result = str.
str();
237 transform(result.begin(), result.end(), result.begin(), ::tolower);
247 return !total.
empty() && (total.
front() == part);
256 return !total.
empty() && (total.
back() == part);
261 auto pos = str.find_last_not_of(chars);
262 if (pos != string::npos) {
270 auto pos = str.find_last_not_of(chars);
271 if (pos != string::npos) {
285 while (!str.
empty() && (str.
back() == chars)) {
291 str.erase(0, str.find_first_not_of(chars));
307 first = str.
substr(0, pos);
308 last = str.
substr(pos + 1);
318 first = str.
substr(0, pos);
319 last = str.
substr(pos + 1);
330 first = str.
substr(0, pos);
331 last = str.
substr(pos + 1);
341 first = str.
substr(0, pos);
342 last = str.
substr(pos + 1);
348 vector<string> result;
349 while (!str.
empty()) {
352 result.push_back(first.
str());
358 string join(
const vector<string>& elems,
const string& separator)
360 if (elems.empty())
return string();
362 auto it = elems.begin();
365 for (++it; it != elems.end(); ++it) {
380 unsigned result =
stoi(str, &idx);
381 if (idx != str.
size()) {
387 static void insert(
unsigned x, set<unsigned>& result,
unsigned min,
unsigned max)
389 if ((x < min) || (x > max)) {
395 static void parseRange2(
string_ref str, set<unsigned>& result,
396 unsigned min,
unsigned max)
400 if (str.
empty())
return;
402 auto pos = str.
find(
'-');
404 insert(parseNumber(str), result, min, max);
406 unsigned begin = parseNumber(str.
substr(0, pos));
407 unsigned end = parseNumber(str.
substr(pos + 1));
409 std::swap(begin, end);
411 for (
unsigned i = begin; i <= end; ++i) {
412 insert(i, result, min, max);
419 set<unsigned> result;
421 auto next = str.
find(
',');
425 parseRange2(sub, result, min, max);
432 #if defined(__APPLE__)
434 std::string fromCFString(CFStringRef str)
437 const char *cstr = CFStringGetCStringPtr(str, kCFStringEncodingUTF8);
440 return std::string(cstr);
444 CFIndex len = CFStringGetLength(str);
445 CFRange range = CFRangeMake(0, len);
446 CFIndex usedBufLen = 0;
448 str, range, kCFStringEncodingUTF8,
'?',
false,
nullptr, len, &usedBufLen);
449 UInt8 buffer[usedBufLen];
451 str, range, kCFStringEncodingUTF8,
'?',
false, buffer, len, &usedBufLen);
452 return std::string(reinterpret_cast<const char *>(buffer), usedBufLen);