- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
void Argument::parseAsInt()
{
auto res = std::from_chars(data.data(), data.data() + data.size(), dataInt);
if (res.ec == std::errc()) {
setTypeFlag(ArgType::Int);
}
}
void Argument::parseAsFloat()
{
// Rww: gcc still does not support float from_chars(), lol
const char *begin = data.data();
const char *end = begin + data.size();
char *endPtr = nullptr;
dataFloat = std::strtof(begin, &endPtr);
if (endPtr == end || dataFloat != 0.0f) {
setTypeFlag(ArgType::Float);
} else {
for (const char *it = endPtr; it < end; it++) {
if (!std::isspace(*it)) {
return;
}
}
setTypeFlag(ArgType::Float);
}
}
Говнокодил тут недавно, долго думал, что считать числом (пет, ТЗ нет). В конце-концов решил считать всё, что можно распарсить.
Такова участь крестобляди.
- а что это за функция? Дока не гуглится по ней
А то я подумал, что это какая-то стандартная крестометушня, чтобы подсказывать компилятору, с каким типом мы щас будем работать или в этом духе
Вот интересно на самом деле, в чем сложность реализации этих функций. Чел из майкрософта пишет, что он на основе готового strtod месяц (!) пилил реализацию для их либы.
Понятно, что парсинг флоата это нетривиальная задача. Но она ведь уже давным-давно решена в сишке. И наборы тестов там уже есть.