Здравствуйте, Marty, Вы писали:
I>>Посмотрел код а не саму идею, замечания:
I>>defs.h
I>>MARTY_ARG_USED — не используется в примерах, и похоже в проекте не использует, а без этого макроса сам файл не нужен
M>Используется — https://github.com/al-martyn1/marty_format/blob/3cb1dbc86c158a67302f483b9ec06abc0abe5350/marty_format.h#L1202
M>Пока в затычках, потом, вероятно, будет не нужен.
Да, не увидел при беглом просмотре, просто заметил что в example_*.cpp не используется
int main(int argc, char* argv[])
{
(void)(argc);
(void)(argv);
I>>enums.h — не соберется, где вся директория marty_cpp
M>Тут не очень понятно, можно поподробнее?
Не разобрался в структуре проекта, всё есть.
I>>и сразу по виду использования, а макрос MARTY_CPP_ENUM_FLAGS_DESERIALIZE_ITEM точно нужен? Это не аналог
I>>I>>static inline std::map<FormattingFlags, std::string> = {
I>> {FormattingFlags::unknow, "unknown"},
I>>// ...
I>>};
I>>
M>MARTY_CPP_ENUM_FLAGS_DESERIALIZE_ITEM — это https://github.com/al-martyn1/marty_cpp/blob/e700f292fb17b41b31a25bdee4e8a56e3a40b7ee/marty_flags.h#L62
M>а
M>MARTY_CPP_ENUM_DESERIALIZE_ITEM — это https://github.com/al-martyn1/marty_cpp/blob/e700f292fb17b41b31a25bdee4e8a56e3a40b7ee/marty_enum.h#L217
M>M>#define MARTY_CPP_ENUM_DESERIALIZE_ITEM( val, valStr ) \
M> _m[lowerCaseConvert ? marty_cpp::toLower(std::string(valStr)) : std::string(valStr)] = val
M>
Ух, так же не разобрался, но лучше в явном виде, а не через макросы
I>>Сама идея странная, зачем имея флаг ignoreFormattingErrors всегда кидать исключения, потом ловить, потом перепрокидывать, не проще исключение просто не кидать?
M>А как? Возвращать std::optional?
Я прям логику кода не разбирал, но есть код
auto optionalError = [&](const std::string &msg)
{
if (ignoreErrors) // Тут по названия !ignoreErrors
throw std::runtime_error(msg);
};
а в обработке
if ((formattingFlags&FormattingFlags::ignoreFormattingErrors)==0)
throw; // Прокидываем исключение выше
по виду что то лишнее, или логика такая, если ignoreErrors кидаем исключение прерывая обработку, выше ловим исключение, если ignoreErrors установлено то продолжаем обработку?
I>>utils.h
I>>Для примера isFormatTypeChar, а почему не через switch/case, и читать и поддерживать, проще же.
M>Так там сборная солянка из разных is*.
M>Если я поменяю реализацию isFormatFormatThousandSep, мне что, искать все места, где я задаю символы разделителя разрядов?
Нет, я про другое, вопрос про форматирование, почему
inline constexpr bool isFormatSignMarker(utf32_char_t ch)
{
return ch==utf32_char_t('-') || ch==utf32_char_t('+') /* || ch==utf32_char_t(' ') */ ;
}
а не
inline constexpr bool isFormatSignMarker(utf32_char_t ch)
{
swith(ch) {
case '-':
case '+':
//case ' ':
return true;
default:
return false;
}
}
или вообще в декларативном виде
static inline std::set<utf32_char_t> formatSignMarker = {
{'-'},
{'+'},
// {' '},
}
inline bool isFormatSignMarker(utf32_char_t ch) {
return formatSignMarker.contains(ch);
}