Page MenuHomePhabricator

OTBS Sample
ActivePublic

Authored by jcmcdonald on Mar 27 2020, 1:11 PM.
/* Convert an integer to a string
* \param the integer to convert
* \param the base for the conversion, default base-10
* \param letter case to use for digits greater than 9
* \param the notation to use for non-decimal bases.
* \return the string representing the value.
*/
template<typename T>
std::string stringify_integral (const T& val,
const IOFormatBase& base = IOFormatBase::dec,
const IOFormatSign& sign = IOFormatSign::automatic,
const IOFormatNumCase& num_case = IOFormatNumCase::upper,
const IOFormatBaseNotation& notation = IOFormatBaseNotation::prefix)
{
/* IMPLEMENTATION MEMO: itos() is not portable, and std::to_string()
does not support multiple bases at this time. Therefore, a custom
solution is called for. */
// If the number is zero, skip everything else and return that.
if (val == 0) {
return "0";
}
unsigned int _base = static_cast<unsigned int> (base);
/* Create a new string with a reserved length matching the expected
* length of the string. */
std::string str = std::string();
str.reserve (lengthify_integral (val, base, sign));
bool prefix = false;
if (notation == IOFormatBaseNotation::prefix &&
(_base == 2 || _base == 3 || _base == 8 || _base == 12 || _base == 16)) {
prefix = true;
} else if (_base != 10 && notation != IOFormatBaseNotation::none) {
str += DIGIT_CHARS_LOWER[_base % 10];
if (_base > 10) {
str += DIGIT_CHARS_LOWER[_base / 10];
}
str += '_';
}
/* Make a copy of the number for mutating.
* If it's negative, make it positive. */
T number = (val >= 0) ? val : -val;
while (number) {
size_t digit = number % _base;
switch (num_case) {
case IOFormatNumCase::lower:
str += DIGIT_CHARS_LOWER[digit];
break;
case IOFormatNumCase::upper:
str += DIGIT_CHARS_UPPER[digit];
break;
}
number /= _base;
}
if (prefix) {
switch (_base) {
case 2:
str += 'b';
break;
case 3:
str += 't';
break;
case 8:
str += 'o';
break;
case 12:
str += 'z';
break;
case 16:
str += 'x';
break;
}
str += '0';
}
if (val < 0) {
str += "-";
} else if (sign == IOFormatSign::always) {
str += "+";
}
return reverse (str);
}
std::string stringify_char (const char& val,
const IOFormatCharValue& as = IOFormatCharValue::as_char)
{
switch (as) {
case IOFormatCharValue::as_char:
return std::string (1, val);
case IOFormatCharValue::as_int:
return stringify_integral (val, IOFormatBase::dec);
}
return "";
}

Event Timeline

jcmcdonald mentioned this in Unknown Object (Slowvote Poll).