Re[3]: Библиотека форматирования marty::format
От: Igore Россия  
Дата: 16.04.25 07:34
Оценка:
Здравствуйте, 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);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.