- 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);
}
}
Говнокодил тут недавно, долго думал, что считать числом (пет, ТЗ нет). В конце-концов решил считать всё, что можно распарсить.
gost 02.09.2020 17:51 # 0
Такова участь крестобляди.
Desktop 02.09.2020 20:14 # 0
- а что это за функция? Дока не гуглится по ней
bormand 02.09.2020 20:16 # 0
Desktop 02.09.2020 20:18 # 0
А то я подумал, что это какая-то стандартная крестометушня, чтобы подсказывать компилятору, с каким типом мы щас будем работать или в этом духе
guest8 02.09.2020 20:20 # −999
gost 02.09.2020 21:51 # 0
bormand 02.09.2020 22:50 # 0
Вот интересно на самом деле, в чем сложность реализации этих функций. Чел из майкрософта пишет, что он на основе готового strtod месяц (!) пилил реализацию для их либы.
Понятно, что парсинг флоата это нетривиальная задача. Но она ведь уже давным-давно решена в сишке. И наборы тестов там уже есть.
gost 02.09.2020 22:56 # 0
gost 02.09.2020 22:56 # 0
gost 02.09.2020 22:56 # 0
gost 02.09.2020 22:59 # 0
bormand 02.09.2020 23:06 # +2
HoBorogHuu_nemyx 02.09.2020 23:46 # +2
bormand 02.09.2020 23:48 # 0