Re[5]: Библиотека форматирования marty::format
От: Igore Россия  
Дата: 15.04.25 18:29
Оценка:
Здравствуйте, Marty, Вы писали:

M>По поводу литералов такой вопрос (который у меня также и по поводу использования стандартных литералов)

M>Вот я в функции хочу вывести отформатированную строку:
M>cout << "Pi: {Pi:f}\n"ms.arg("Pi", 3.14159);

M>Мне перед этим надо написать

M>using namespace ;
M>Больше я в этой функции ничего особо выводить не хочу, при возникновении ошибки просто залогировать её в одном месте.
Обычно using namespace на файл, а не на функцию, и форматирование обычно нужно больше 1 раза.

M>cout << "Pi: {Pi:f}\n"_mf.arg("Pi", 3.14159);

M>cout << marty::format::formatMessage("Pi: {Pi:f}\n", marty::format::Args().arg("Pi", 3.14159);
M>Разве это так уж сильно короче
В 2 раза короче, тут скорее дело привычки в каком стиле писать.

M>А информативность зело падает, не?

Я так понял ты хотел приблизится к стилю Python2.7, до f string из Python3 C++ непонятно когда сможет добраться. Это вариант который немного похож. Можно еще и перегрузку operator % для класса добавить, но как то это совсем чужеродно в С++. Хотя то что я предложил больше на QString похоже(если исключить литералы и синтаксис подстановки) можно в нем кстати идеи для форматирования посмотреть.
Плюс никто же не мешает использовать и обычный стиль, то что будут обертки, их использовать не обязательно. А выбор в каком стиле писать на программисте, спрятать всю магию всё равно не получится.
Re[6]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.04.25 19:04
Оценка:
Здравствуйте, Igore, Вы писали:

M>>Мне перед этим надо написать

M>>using namespace ;
M>>Больше я в этой функции ничего особо выводить не хочу, при возникновении ошибки просто залогировать её в одном месте.
I>Обычно using namespace на файл, а не на функцию, и форматирование обычно нужно больше 1 раза.

Это если писать .cpp-шники. Лично я уже много лет пишу в таком стиле, что у меня только один .cpp, в котором функция main, остальное — в хидерах. В таком кейсе using namespace на файл — плохая идея.


M>>cout << "Pi: {Pi:f}\n"_mf.arg("Pi", 3.14159);

M>>cout << marty::format::formatMessage("Pi: {Pi:f}\n", marty::format::Args().arg("Pi", 3.14159);
M>>Разве это так уж сильно короче
I>В 2 раза короче, тут скорее дело привычки в каком стиле писать.

Короче, но ты обрезал using. При его наличии на каждый чих уже не выглядит короче.


M>>А информативность зело падает, не?

I>Я так понял ты хотел приблизится к стилю Python2.7, до f string из Python3 C++ непонятно когда сможет добраться. Это вариант который немного похож. Можно еще и перегрузку operator % для класса добавить, но как то это совсем чужеродно в С++. Хотя то что я предложил больше на QString похоже(если исключить литералы и синтаксис подстановки) можно в нем кстати идеи для форматирования посмотреть.

Я прежде всего ориентировался на C++ std::format, потом выяснил, что ноги растут из питона. Какая версия питона — я хз, у меня ссылки на спецификации, на которые я ориентировался, приведены почти в начале доки.

Судя по урлю — https://docs.python.org/3/... — я за базу таки использую третий питон.

Можно про f string из Python3 поподробнее?


I>Плюс никто же не мешает использовать и обычный стиль, то что будут обертки, их использовать не обязательно. А выбор в каком стиле писать на программисте, спрятать всю магию всё равно не получится.


Это всё да, но это уже сахарок, в любом случае, это пишется за пару часов сломанными пальцами
Маньяк Робокряк колесит по городу
Re: Библиотека форматирования marty::format
От: Igore Россия  
Дата: 15.04.25 19:20
Оценка:
Здравствуйте, Marty, Вы писали:

M>В общем, пинайте на здоровие — https://github.com/al-martyn1/marty_format

Посмотрел код а не саму идею, замечания:

defs.h
MARTY_ARG_USED — не используется в примерах, и похоже в проекте не использует, а без этого макроса сам файл не нужен

dummy.cpp — удалить

enums.h — не соберется, где вся директория marty_cpp
и сразу по виду использования, а макрос MARTY_CPP_ENUM_FLAGS_DESERIALIZE_ITEM точно нужен? Это не аналог
static inline std::map<FormattingFlags, std::string> = {
   {FormattingFlags::unknow,  "unknown"},
// ...
};


exceptions.h
MARTY_FORMAT_DECLARE_EXCEPTION_CLASS — непонятно для чего нужен, но ладно, внутри одного using clsBase::clsBase для наследования всех конструкторов разве не достаточно будет?
В class base_error тоже самое, ну или хотя бы default используй.
base_error(const base_error &e) = default;
base_error& operator=(const base_error& e) = default;

Похоже была мысль что есть иерархия исключений с разным m_offset, но по виду везде одинаковый и поле не используется.

marty_format.h
if ((formattingFlags&FormattingFlags::ignoreFillIndirectErrors)==0)

не читается без пробелов вокруг &

Сама идея странная, зачем имея флаг ignoreFormattingErrors всегда кидать исключения, потом ловить, потом перепрокидывать, не проще исключение просто не кидать?

utils.h
Для примера isFormatTypeChar, а почему не через switch/case, и читать и поддерживать, проще же.

removePrefix, removeSuffix, если срабатывает граничное условие, то зачем действие делать, можно сразу пустую строку вернуть
    if (n>str.size())
        return "";
Re[7]: Библиотека форматирования marty::format
От: Igore Россия  
Дата: 15.04.25 19:26
Оценка:
Здравствуйте, Marty, Вы писали:

M>Судя по урлю — https://docs.python.org/3/... — я за базу таки использую третий питон.

Старый синтаксис из 2.7 тоже поддерживается

M>Можно про f string из Python3 поподробнее?

https://docs.python.org/3/tutorial/inputoutput.html
Интерполяция строк
year = 2016
event = 'Referendum'
f'Results of the {year} {event}' # Results of the 2016 Referendum'


Тут больше примеров
Отредактировано 15.04.2025 19:40 Igore . Предыдущая версия . Еще …
Отредактировано 15.04.2025 19:38 Igore . Предыдущая версия .
Re[2]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.04.25 19:50
Оценка:
Здравствуйте, Igore, Вы писали:

I>Посмотрел код а не саму идею, замечания:


I>defs.h

I>MARTY_ARG_USED — не используется в примерах, и похоже в проекте не использует, а без этого макроса сам файл не нужен

Используется — https://github.com/al-martyn1/marty_format/blob/3cb1dbc86c158a67302f483b9ec06abc0abe5350/marty_format.h#L1202
Пока в затычках, потом, вероятно, будет не нужен.


I>dummy.cpp — удалить

Хз, возможно, но "опакечивание" при помощи CMake хочет хоть какие-то сорцы. Возможно, я не умею его правильно готовить


I>enums.h — не соберется, где вся директория marty_cpp


Тут не очень понятно, можно поподробнее?

Это генерируемый файл, подробности тут — https://github.com/al-martyn1/marty_format/tree/main/_generators
Генератор тут — https://github.com/al-martyn1/umba-enum-gen


I>и сразу по виду использования, а макрос MARTY_CPP_ENUM_FLAGS_DESERIALIZE_ITEM точно нужен? Это не аналог

I>
I>static inline std::map<FormattingFlags, std::string> = {
I>   {FormattingFlags::unknow,  "unknown"},
I>// ...
I>};
I>


MARTY_CPP_ENUM_FLAGS_DESERIALIZE_ITEM — это https://github.com/al-martyn1/marty_cpp/blob/e700f292fb17b41b31a25bdee4e8a56e3a40b7ee/marty_flags.h#L62
а
MARTY_CPP_ENUM_DESERIALIZE_ITEM — это https://github.com/al-martyn1/marty_cpp/blob/e700f292fb17b41b31a25bdee4e8a56e3a40b7ee/marty_enum.h#L217
#define MARTY_CPP_ENUM_DESERIALIZE_ITEM( val, valStr )                       \
        _m[lowerCaseConvert ? marty_cpp::toLower(std::string(valStr)) : std::string(valStr)] = val



I>exceptions.h

I>MARTY_FORMAT_DECLARE_EXCEPTION_CLASS — непонятно для чего нужен, но ладно, внутри одного using clsBase::clsBase для наследования всех конструкторов разве не достаточно будет?
I>В class base_error тоже самое, ну или хотя бы default используй.
I>
I>base_error(const base_error &e) = default;
I>base_error& operator=(const base_error& e) = default;
I>

I>Похоже была мысль что есть иерархия исключений с разным m_offset, но по виду везде одинаковый и поле не используется.

Разные типы исключений, типы исключений объявляются одной строчкой макросом, кидаются в разных ситуация.

m_offset — смещение в форматной строке, вызвавшее ошибку. Не везде заполняется и не везде используется, многое ещё на говне, потом, возможно, порефакторю иерархию исключений, и там, где m_offset не нужен — его не будет


I>marty_format.h

I>
I>if ((formattingFlags&FormattingFlags::ignoreFillIndirectErrors)==0)
I>

I> не читается без пробелов вокруг &

Вкусовщина, но принял к сведению


I>Сама идея странная, зачем имея флаг ignoreFormattingErrors всегда кидать исключения, потом ловить, потом перепрокидывать, не проще исключение просто не кидать?


А как? Возвращать std::optional?


I>utils.h

I>Для примера isFormatTypeChar, а почему не через switch/case, и читать и поддерживать, проще же.

Так там сборная солянка из разных is*.

Если я поменяю реализацию isFormatFormatThousandSep, мне что, искать все места, где я задаю символы разделителя разрядов?


I>removePrefix, removeSuffix, если срабатывает граничное условие, то зачем действие делать, можно сразу пустую строку вернуть


Хз, вероятно, писал, не приходя в сознание, и сделал, как показалось проще. Будто ты говнокода не писал

I>
I>    if (n>str.size())
I>        return "";
I>



Спасибо за разбор и критику моего говнокода
Маньяк Робокряк колесит по городу
Отредактировано 15.04.2025 19:52 Marty . Предыдущая версия .
Re[8]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.04.25 20:09
Оценка:
Здравствуйте, Igore, Вы писали:

I>Тут больше примеров


Записал:
Маньяк Робокряк колесит по городу
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);
}
Re[4]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 16.04.25 11:01
Оценка:
Здравствуйте, Igore, Вы писали:

I>Да, не увидел при беглом просмотре, просто заметил что в example_*.cpp не используется

I>
I>int main(int argc, char* argv[])
I>{
I>    (void)(argc);
I>    (void)(argv);
I>


Уже не помню, как так получилось, вероятно, что примеры начал накидывать до того, как присунул defs.h в проект, когда оно понадобилось в других местах


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>Ух, так же не разобрался, но лучше в явном виде, а не через макросы

Не вижу криминала в адекватном использовании макросов, тем более, что это вообще автогенерённый код, и там нечего смотреть и отлаживать


I>а в обработке

I>
I>if ((formattingFlags&FormattingFlags::ignoreFormattingErrors)==0)
I>    throw; // Прокидываем исключение выше
I>

I>по виду что то лишнее, или логика такая, если ignoreErrors кидаем исключение прерывая обработку, выше ловим исключение, если ignoreErrors установлено то продолжаем обработку?

Надо приглядеться, похоже просто тупой баг, забыл отрицание


I>Нет, я про другое, вопрос про форматирование, почему

I>
I>inline constexpr bool isFormatSignMarker(utf32_char_t ch)
I>{
I>    return ch==utf32_char_t('-') || ch==utf32_char_t('+') /*  || ch==utf32_char_t(' ') */ ;
I>}
I>

I>а не
I>
I>inline constexpr bool isFormatSignMarker(utf32_char_t ch)
I>{
I>   swith(ch) {
I>      case '-':
I>      case '+':
I>      //case ' ':
I>         return true;
I>      default:
I>         return false;
I>   }
I>}
I>


Свич длиннее писать, а в чем его преимущества?


I>или вообще в декларативном виде

I>
I>static inline std::set<utf32_char_t> formatSignMarker = {
I>    {'-'},
I>    {'+'},
I>//    {' '},
I>}
I>inline bool isFormatSignMarker(utf32_char_t ch) {
I>    return formatSignMarker.contains(ch);
I>}
I>



Можно бы и так, да, но это лишняя сущность — set, и наверное будет толще по генерируемому коду, медленнее в работе, лишние аллокации при инициализации...

Я вообще планирую потом отполировать либу и перетащить в микроконтроллеры, там лишний раз всё это использовать не стоит
Маньяк Робокряк колесит по городу
Re[5]: Библиотека форматирования marty::format
От: Igore Россия  
Дата: 16.04.25 15:44
Оценка: 8 (1)
Здравствуйте, Marty, Вы писали:

I>>Нет, я про другое, вопрос про форматирование, почему

I>>
I>>inline constexpr bool isFormatSignMarker(utf32_char_t ch)
I>>{
I>>    return ch==utf32_char_t('-') || ch==utf32_char_t('+') /*  || ch==utf32_char_t(' ') */ ;
I>>}
I>>

I>>а не
I>>
I>>inline constexpr bool isFormatSignMarker(utf32_char_t ch)
I>>{
I>>   swith(ch) {
I>>      case '-':
I>>      case '+':
I>>      //case ' ':
I>>         return true;
I>>      default:
I>>         return false;
I>>   }
I>>}
I>>


M>Свич длиннее писать, а в чем его преимущества?

Код читать и поддерживать с ним проще, добавлять/удалять новые токены, вот это художественное форматирование
inline
constexpr
bool isFormatTypeChar(utf32_char_t ch)
{
    return ch==utf32_char_t('?') || ch==utf32_char_t('s') || ch==utf32_char_t('b') || ch==utf32_char_t('B') || ch==utf32_char_t('c')
        || ch==utf32_char_t('d') || ch==utf32_char_t('o') || ch==utf32_char_t('x') || ch==utf32_char_t('X') || ch==utf32_char_t('a')
        || ch==utf32_char_t('A') || ch==utf32_char_t('e') || ch==utf32_char_t('E') || ch==utf32_char_t('f') || ch==utf32_char_t('F')
        || ch==utf32_char_t('g') || ch==utf32_char_t('G') || ch==utf32_char_t('n') || ch==utf32_char_t('%');
}

при любом добавлении, удалении символа, в истории код будет плохо выглядеть раз, затронет не одну строку два, git blame будет не правильные данные отображать. А со switch/case или вторым вариантом, одно изменение в логие, одна строка в коде.
Re[3]: Блин, обидно
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 16.04.25 20:02
Оценка:
Здравствуйте, rg45, Вы писали:

R>Не в огорчение будет сказано. Во-первых, у тебя много кода, это ж вникать нужно. Во-вторых, С++17. Ну и в-третьих, ты не такой забавный, как Shmj.


Грешно же смеяться над убогими
Маньяк Робокряк колесит по городу
Re: Библиотека форматирования marty::format
От: AlexGin Беларусь  
Дата: 17.04.25 05:40
Оценка:
Здравствуйте, Marty, Вы писали:

M>Одна из базовых фич — совмещение форматной строки С++20 std::format и форматных строк питона — можно использовать без модификации и то и другое.


Вот коды к книге "С++20 Для программиста метод готовых объектов" Deitel —
там есть реализация format, для компиляторов более ранних, чем поддерживающих C++20:

https://github.com/pdeitel/CPlusPlus20ForProgrammers/tree/master/examples/libraries/fmt

Я сам проверял — примеры по формату работают (на старых gcc/g++ компиляторах).
Re[2]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 17.04.25 09:57
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Вот коды к книге "С++20 Для программиста метод готовых объектов" Deitel —

AG>там есть реализация format, для компиляторов более ранних, чем поддерживающих C++20:

AG>https://github.com/pdeitel/CPlusPlus20ForProgrammers/tree/master/examples/libraries/fmt


Спасибо, интересно, полистаю.

Я, правда, уже в свою либу насовал фич, которых в плюсах нет, и даже нет в питоне, с которого изначально содрано
Маньяк Робокряк колесит по городу
Re: Учёл пожелания
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 18.04.25 22:17
Оценка:
Здравствуйте, Marty, Вы писали:

Доделываю.

Учел пожелания — подсчет длины/ширины при выводе в текст вывел в отдельный параметр шаблона, в рантайм решил не выводить.

Фильтры — доделываю, фильтры могут быть как пользовательские, передаваемые как std::function как аргумент, а если не найден в аргументах, то используется шаблонная фабрика стандартных фильтров с такими фильтрами:
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::htmlAttr   , "html-attr" );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::htmlAttr   , "html_attr" );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::htmlAttr   , "htmlattr"  );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::none       , "none"      );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::xml        , "xml"       );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::xmlAttr    , "xml-attr"  );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::xmlAttr    , "xml_attr"  );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::xmlAttr    , "xmlattr"   );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::xmlText    , "xml-text"  );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::xmlText    , "xml_text"  );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::xmlText    , "xmltext"   );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::html       , "html"      );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::htmlText   , "html-text" );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::htmlText   , "html_text" );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::htmlText   , "htmltext"  );
    MARTY_CPP_ENUM_CLASS_DESERIALIZE_ITEM( StdFilterType::sql        , "sql"       );


По факту, это всё одно и то же, кроме "sql" фильтра (который дублирует apos), просто разные имена

Может быть до восьми фильтров в цепочке — "|xml|sql|..."

Фабрика фильтров может быть задана пользователем, как параметр шаблона

Про литералы тоже намотал на ус, будет.

Сейчас доделываю "фильтры", потом, наверно, сделаю литералы, ибо вкусно для части пользователей.

Примерно 75% готовности.

Само форматирование по заданной спеке пока никак не сделано, вставляется тупо строка std::to_string

Либу доделаю в любом случае, вопрос — когда. Какую-то базу для себя сделаю, потом — по мере необходимости.


Вопрос — кому-нибудь интересно было бы попробовать эту мою либу если не в реальном проекте, то хотя бы погонять на тестах? Пользователи — мотивируют, даже халявные

Фильтры, как аргументы, если из плюсов — https://github.com/al-martyn1/marty_format?tab=readme-ov-file#user-content-%D0%BE%D0%B1%D0%BE%D0%B1%D1%89%D1%91%D0%BD%D0%BD%D1%8B%D0%B9-%D1%82%D0%B8%D0%BF-%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0-basicformatvaluefilter

Синтаксис форматной строки с фильтрами — https://github.com/al-martyn1/marty_format?tab=readme-ov-file#user-content-%D1%81%D0%BF%D0%B5%D1%86%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80-%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B0---format_spec
Маньяк Робокряк колесит по городу
Отредактировано 18.04.2025 22:34 Marty . Предыдущая версия . Еще …
Отредактировано 18.04.2025 22:25 Marty . Предыдущая версия .
Re: Библиотека форматирования marty::format
От: bnk СССР http://unmanagedvisio.com/
Дата: 19.04.25 01:27
Оценка:
Здравствуйте, Marty, Вы писали:

M>В общем, пинайте на здоровие — https://github.com/al-martyn1/marty_format


Плюсы я уже забыл давно. А так, лицензия отсутствует. Add => File => License
Релизы вот тоже отсутствуют.

Но меня больше вот это впечатлило. Ты вообще спишь?

Re[2]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 19.04.25 01:46
Оценка: -1 :))
Здравствуйте, bnk, Вы писали:

M>>В общем, пинайте на здоровие — https://github.com/al-martyn1/marty_format


bnk>Плюсы я уже забыл давно. А так, лицензия отсутствует. Add => File => License

bnk>Релизы вот тоже отсутствуют.

Хидер онли же. Лицуху какую-то наверное надо прикрутить


bnk>Но меня больше вот это впечатлило. Ты вообще спишь?


bnk>Image: 2025_03_06_03_24_57_image.png


сплю конечно. я вообще свои проекты на расслабоне в свободное время пилю
щас вообще на релаксе, подустал и всё такое
ну и плюс — сорцы отдельно коммичу, доки отдельно, ну и всё такое по мелочам, вот и набегает красиво
я не парюсь, могу толстую колбасу зафигачить без коммитов, могу на каждый чих пачку коммитов сделать.
Когда прёт — вылезает колбаса, потом релакс и фиксы

ЗЫ Вот эту либу по форматированию уже три недели пилю. Старость, раньше бы за неделю всё сделал, но говнеца было бы побольше, это да, щас хочу по красоте сделать.
Маньяк Робокряк колесит по городу
Re[3]: Библиотека форматирования marty::format
От: bnk СССР http://unmanagedvisio.com/
Дата: 19.04.25 01:56
Оценка:
Здравствуйте, Marty, Вы писали:

bnk>>Релизы вот тоже отсутствуют.


M>Хидер онли же. Лицуху какую-то наверное надо прикрутить


Я имел в виду что обычно есть какие-то "стабильные" релизы которые безопасно можно использовать. v1, v2, ну такое.
Re[4]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 19.04.25 13:23
Оценка:
Здравствуйте, bnk, Вы писали:

M>>Хидер онли же. Лицуху какую-то наверное надо прикрутить


bnk>Я имел в виду что обычно есть какие-то "стабильные" релизы которые безопасно можно использовать. v1, v2, ну такое.


Ну, примеры собираются (я стараюсь не заливать нерабочие версию), но заявленный функционал ещё не весь допилен
Маньяк Робокряк колесит по городу
Re[2]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 19.04.25 17:49
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Но меня больше вот это впечатлило. Ты вообще спишь?


bnk>Image: 2025_03_06_03_24_57_image.png


Кстати, мне показывает круглую цифру 2000 в 24ом:


Для меня отображает стату по всем репам, а остальным — только по публичным
Маньяк Робокряк колесит по городу
Re[2]: Блин, обидно
От: B0FEE664  
Дата: 22.04.25 16:30
Оценка: -1 :)
Здравствуйте, Marty, Вы писали:

M>Я хоть какую-то годноту принёс на попороть, никто не отвечает.

M>Чо, реально мой код настолько идеален? Тут
Автор: pilgrim_
Дата: 14.04 15:31
говорят, что говнеца у меня тоже хватает

Пффф!

    //! Подавление варнинга о неиспользованном аргументе
    #define MARTY_ARG_USED(x)                   (void)(x)

Зачем?
почему не std::ignore и не [maybe_unused]]?

#define MARTY_CPP_ENUM_SERIALIZE_BEGIN( enumTypeName, mapType, doLower )     \
inline                                                                       \
mapType< enumTypeName, std::string > enum_serialize_make_map_##enumTypeName()\
{                                                                            \
     /* static  */ mapType< enumTypeName, std::string >  _m;                 \
    if (_m.empty())                                                          \
    {

Зачем if (_m.empty()) ?


inline                                                                       \
const mapType< enumTypeName, std::string >& enum_serialize_get_map_##enumTypeName() \
{                                                                            \
    static mapType< enumTypeName, std::string > m = enum_serialize_make_map_##enumTypeName();\
    return m;                                                               \
}

почему m не const?

inline                                                                       \
std::string enum_serialize_##enumTypeName( enumTypeName v )                  \
{                                                                            \
    const auto &m = enum_serialize_get_map_##enumTypeName();                 \
    mapType< enumTypeName, std::string >::const_iterator it = m.find(v);     \
    if (it==m.end())                                                         \
        return std::string();                                                \
                                                                             \
    return it->second;                                                       \
}


почему it не const?
почему возвращаевое значение не ссылка константная?

Это мне вообще не нравится:
template<typename StringType> inline
std::vector<StringType> simple_string_split(const StringType &str, const typename StringType::value_type delim, typename StringType::size_type nSplits = -1)


Вот это
StringType::size_type

слишком сильное требование.
Не будет работать, если delim = '\0';

std::string_view тоже, вероятно, подставить не получиться (как и std::vector<unsigned char>)
И каждый день — без права на ошибку...
Re: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.04.25 00:03
Оценка:
Здравствуйте, Marty, Вы писали:

Оффтоп. Тут попробовал std::format, чтобы понять, по каким правилам он форматирует, и, внезапно оказалось, что он принимает только константы времени компиляции в качестве форматной строки. У меня для локализации был один колхоз, в строках можно было указывать именованные параметры, как макросы вида "$(SomeMacro)", но там все параметры отображения (для чисел, строк и прочего) зашивались в код при сборке, и я хотел от этого отойти, чтобы параметры форматирования можно было в ресурсах задавать для разных языков отдельно, и думал, что можно было бы использовать для такого std::format хотя бы с его только позиционными параметрами, а оказывается — фигушки.

В прошлый раз, когда я писал, был только накидан разбор форматной строки, и сделано форматирование всего-всего через тупой std::to_string.

Были примеры кода, но не было вывода этих примеров.

Я докинул ещё форматных фич:
  Скрытый текст



И реализовал форматирование строк, булевых значений, целых значений и указателей в соответствии со спецификаторами формата. В принципе, уже вполне можно пользоваться

Краткое самари:

Напоминаю про возможность использовать именованные аргументы, а не только позиционные.

Фильтры и пайпы фильтров
Также имеется возможность использовать фильтры (пайпы фильтров) для отформатированных значений. Фильтры могут быть как встроенными, так и передаваться, как функтор, в качестве аргумента.
Встроенные фильтры: xml, xml-attr, xml-text, html, html-attr, html-text — это алиасы к одному и тому же фильтру. Фильтр sql — дублирует apos'ы
Можно иметь до четырёх фильтров в пайпе.

Да, ещё хотели калькулятор длины строки кастомный — сделал параметром шаблона.

Что ещё требуется доделать

В целом, осталось реализовать только форматирование плавучки.

Доп фичи — как тут пожелали — пользовательский литерал для строк форматирования, с обвязкой, чтобы меньше писать. Но это не особо обещаю, мне пока не пригорает.

Хочу запилить форматирование пользовательских типов. У меня есть генератор enum'ов, он умеет генерить (де)сериализацию, и энами и флаги, и генерит функции enum_serialize/enum_serialize_flags. Перво-наперво буду пилить это.

Потом буду думать (но возможно, и в процессе реализации предыдущего пункта, ибо он — частный случай), как форматировать произвольные пользовательские типы.

В любом случае, механизм будет простой — для пользовательского типа вызывается метод преобразования в строку, а затем эта строка форматируется по правилам для строк — ширина поля, выравнивание, обрезка.

Использование системной локали

Потом, наверное, допилю, чтобы был ещё один шаблонный параметр — SystemLocaleInfo, который бы умел возвращать данные из системы — разделители разрядов, десятичный разделитель...

Примеры использования
Все примеры использования
Фильтры
Форматирование строк
Форматирование булевых значений
Форматирование указателей
Форматирование целых чисел
Маньяк Робокряк колесит по городу
Отредактировано 27.04.2025 0:04 Marty . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.