Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 12.04.25 21:05
Оценка: 4 (1) :)
Здравствуйте!

В форум "Исходники" не пощу, потому что интересно получить пинков именно по моему "C++"

Надо же как-то расти

Да ну и просто в профильном очень мало постов, по сравнению с политиками

Ну и по доке тоже пинки приветствуются

Библиотека предназначена для встройки в кастомную динамику, поэтому я не задрачивался на всякие новые фишки плюсов — constexpr/constinit/consteval

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

Но либу можно и из плюсиков нативно использовать, передавая аргументы через std::initializer_list{...}

Возможности библиотеки

  1. Добавление возможностей C++ std::format из C++20 в C++17 (бэкпорт новых фич в старый стандарт).
  2. Совместимость форматной строки с форматной строкой языков Python и C++. Некоторые возможности этих языков игнорируются, но не вызывают ошибки при разборе форматной строки. В библиотеке совмещены возможности форматирования из языка `Python` и возможности форматирования `C++20` `std::format`.
  3. Поддержка именованных аргументов для C++ при использовании соответствующих контейнеров для аргументов.
  4. Поддержка передачи аргументов через std::initializer_list для непосредственного использования из C++.
  5. Упор на использование библиотеки в своих скриптовых языках/DSL языках.
  6. Поддержка Unicode в кодировке UTF-8.
  7. Поддержка чисел с плавающей точкой произвольной размерности marty::Decimal.
  8. Поддержка пользовательских типов строк вместо std::string и поддержка микроконтроллеров (STM32, как пример). Пока не реализовано, но весьма ready, требует отключения части кода условными макросами, также требуется модифицировать некоторые части, пока завязанные на std::string.
  9. Возможность создания собственной системы/библиотеки форматирования на базе данной библиотеки с поддержкой вывода собственных произвольных типов данных.

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

Пока всё обрабатывается без ошибок через вставку текста при помощи обёрток над std::to_string.

В общем, пинайте на здоровие — https://github.com/al-martyn1/marty_format
Маньяк Робокряк колесит по городу
Отредактировано 12.04.2025 21:18 Marty . Предыдущая версия . Еще …
Отредактировано 12.04.2025 21:11 Marty . Предыдущая версия .
Отредактировано 12.04.2025 21:10 Marty . Предыдущая версия .
Отредактировано 12.04.2025 21:07 Marty . Предыдущая версия .
Re: Блин, обидно
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.04.25 18:43
Оценка: :))
Здравствуйте, Marty, Вы писали:

Шамжа шлак приносит, а дискуссии несколько экранов занимают.

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

Чо, реально мой код настолько идеален? Тут
Автор: pilgrim_
Дата: 14.04 15:31
говорят, что говнеца у меня тоже хватает
Маньяк Робокряк колесит по городу
Re: Библиотека форматирования marty::format
От: kov_serg Россия  
Дата: 14.04.25 19:30
Оценка:
Здравствуйте, Marty, Вы писали:

M>Библиотека предназначена для встройки в кастомную динамику, поэтому я не задрачивался на всякие новые фишки плюсов — constexpr/constinit/consteval

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

M>Возможности библиотеки

Обычно инструмент, должен решать какие-то задачи или устранять рутину, а вот уже возможности вытикают из имеющихся ограничений.

M> * Добавление возможностей C++ std::format из C++20 в C++17 (бэкпорт новых фич в старый стандарт).

То есть c++17 это минимальное требование.
M> * Совместимость форматной строки с форматной строкой языков Python и C++. Некоторые возможности этих языков игнорируются, но не вызывают ошибки при разборе форматной строки. В библиотеке совмещены возможности форматирования из языка `Python` и возможности форматирования `C++20` `std::format`.
M> * Поддержка именованных аргументов для C++ при использовании соответствующих контейнеров для аргументов.
Это здорово
M> * Поддержка передачи аргументов через std::initializer_list для непосредственного использования из C++.
M> * Упор на использование библиотеки в своих скриптовых языках/DSL языках.
В скриптовых языках есть более удобное форматирование например https://jinja.palletsprojects.com/en/stable/templates/ https://docs.phalcon.io/4.2/volt
M> * Поддержка Unicode в кодировке UTF-8.
А как вы ширину utf8 строки считаете для выравнивания текста?
M> * Поддержка чисел с плавающей точкой произвольной размерности marty::Decimal.
Серьёзно по основанию 10? Это чисто для бухгалтерии тольео такое надо.
M> * Поддержка пользовательских типов строк вместо std::string и поддержка микроконтроллеров (STM32, как пример). Пока не реализовано, но весьма ready, требует отключения части кода условными макросами, также требуется модифицировать некоторые части, пока завязанные на std::string.
А отключить тесты можно?

M> * Возможность создания собственной системы/библиотеки форматирования на базе данной библиотеки с поддержкой вывода собственных произвольных типов данных.

А фильтры можно? Типа {{x|filter1|filter2}} => filter2(filter1(x)). (Что бы можно было sql запросы наример или xml экранировать строки или просто camelcase делать). Можноли изменить кастомизировать функцию расчета ширины.

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

M>Пока всё обрабатывается без ошибок через вставку текста при помощи обёрток над std::to_string.

M>Шамжа шлак приносит, а дискуссии несколько экранов занимают.

Так вы не правильно вопросы задаёте.
Надо не вот, зацените, какие замечания. Что требует установить, собрат, прогнать тестовые сценарии, осмотреться и ещё кучу действий. Мало лишь кто способен просто так колупаться в чужом коде, более требующее длительного погружения, без везких причин.
Вы бы начали с примеров, как всё красиво и компактно и вот если сделать так то будет счастье, и ссылку на счастье.
Шамжа приносить темы обсуждение котрыех не требует больших усилий, иногда и смысла там тоже не много. Зато он их наваливает, как-будто ему за это платят
Re[2]: Блин, обидно
От: T4r4sB Россия  
Дата: 14.04.25 19:46
Оценка:
Здравствуйте, Marty, Вы писали:

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


Посмотрел примеры использования, не нашёл
 formatMessage("{} + {} = {}", 2, 2, 4)


в лучшем случае

 formatMessage("{} + {} = {}", {2, 2, 4})


прикрути воредики, несложно ж должно быть.

Ну разбивает строку по плейсхолдерам, есть именованные плейсхолдеры, что неплохо.
Можно ли докопаться что возвращается стринг аллоцирующий память, а не структура из ссылок на подстроки? Да пофиг, это никогда не даст заметного влияния на скорость в реальной программе.
По коду не знаю, что сказать, некоторые приколы только в процессе использования проявляются.
Реальные косяки тут не определить. У меня бывало что при определении вывода для кастомного типа в шаблонах что-то ехало не туда и в дебаге программа падала, потому что долго объяснять, я пол-дня убил чтоб понять.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[2]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.04.25 19:58
Оценка: :)
Здравствуйте, kov_serg, Вы писали:

Спасибо за отзыв


M>>Возможности библиотеки

_>Обычно инструмент, должен решать какие-то задачи или устранять рутину, а вот уже возможности вытикают из имеющихся ограничений.

Я решал проблему встройки форматирования в мой очередной изобретаемый DSL


M>> * Добавление возможностей C++ std::format из C++20 в C++17 (бэкпорт новых фич в старый стандарт).

_>То есть c++17 это минимальное требование.

Да, 17ый стандарт есть уже практически везде, чего пока не сказать о C++20


M>> * Совместимость форматной строки с форматной строкой языков Python и C++. Некоторые возможности этих языков игнорируются, но не вызывают ошибки при разборе форматной строки. В библиотеке совмещены возможности форматирования из языка `Python` и возможности форматирования `C++20` `std::format`.

M>> * Поддержка именованных аргументов для C++ при использовании соответствующих контейнеров для аргументов.
_>Это здорово

Спасибо


M>> * Поддержка передачи аргументов через std::initializer_list для непосредственного использования из C++.

M>> * Упор на использование библиотеки в своих скриптовых языках/DSL языках.
_>В скриптовых языках есть более удобное форматирование например https://jinja.palletsprojects.com/en/stable/templates/ https://docs.phalcon.io/4.2/volt

А можно носом ткнуть? Джинджа вроде же питоновская либа, форматирование там питоновское. По крайней мере, то, что по ссылке, выглядит питоновским


M>> * Поддержка Unicode в кодировке UTF-8.

_>А как вы ширину utf8 строки считаете для выравнивания текста?

Пока костыльно, есть список пробелов нулевой ширины и диапазоны диакретиков, на 95% случаев должно хватит. Если приспичит, буду думать, как присунуть поддержку i18n или как оно там


M>> * Поддержка чисел с плавающей точкой произвольной размерности marty::Decimal.

_>Серьёзно по основанию 10? Это чисто для бухгалтерии тольео такое надо.

Да. Именно для бухгалтерии и делалось, а точнее — для экспериментов с торговлей на бирже


M>> * Поддержка пользовательских типов строк вместо std::string и поддержка микроконтроллеров (STM32, как пример). Пока не реализовано, но весьма ready, требует отключения части кода условными макросами, также требуется модифицировать некоторые части, пока завязанные на std::string.

_>А отключить тесты можно?

Да, наверное можно. Я пока проблем не огрёб с этой либой, но полагаю, они могли появиться после того, как я "опакетил" эту либу под CMake. Спасибо за подсказку


M>> * Возможность создания собственной системы/библиотеки форматирования на базе данной библиотеки с поддержкой вывода собственных произвольных типов данных.

_>А фильтры можно? Типа {{x|filter1|filter2}} => filter2(filter1(x)). (Что бы можно было sql запросы наример или xml экранировать строки или просто camelcase делать). Можноли изменить кастомизировать функцию расчета ширины.

Пока нет. Если накинешь ссылку на спецификацию этих фильтров, я подумаю, можно ли


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

_>Вы бы начали с примеров, как всё красиво и компактно и вот если сделать так то будет счастье, и ссылку на счастье.

Ну, в доке там примеры есть
Наверное, надо было их скопировать для затравки


_>Шамжа приносить темы обсуждение котрыех не требует больших усилий, иногда и смысла там тоже не много. Зато он их наваливает, как-будто ему за это платят


Это да. А мне хочетелось бы нормальной порки, чтобы расти как разработчику, что требует некоторого погружения от читателей. Думал, что либа форматирования — годный повод для такого
Маньяк Робокряк колесит по городу
Re[3]: Блин, обидно
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.04.25 20:30
Оценка: :)
Здравствуйте, T4r4sB, Вы писали:

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


TB>Посмотрел примеры использования, не нашёл

TB>
TB> formatMessage("{} + {} = {}", 2, 2, 4) 
TB>


Этого нет пока, да


TB>в лучшем случае


TB>
TB> formatMessage("{} + {} = {}", {2, 2, 4})
TB>


Хм, разве пример "Используем std::initializer_list<marty::format::FormatArgumentVariant>" не об этом?


TB>прикрути воредики, несложно ж должно быть.


Я на полпути, как раз решил собрать критику, чтобы в конце не узнать, что я где-то кардинально обосрался в начале пути, и далеко не всё реализовано.

И да, может, есть какой-то идиоматический приём, который позволяет малой кровью собрать вариадик параметры в initializer_list?


TB>Ну разбивает строку по плейсхолдерам, есть именованные плейсхолдеры, что неплохо.


Спс


TB>Можно ли докопаться что возвращается стринг аллоцирующий память, а не структура из ссылок на подстроки? Да пофиг, это никогда не даст заметного влияния на скорость в реальной программе.


Можно. Но у меня возвращается не std::string, а typename StringType, и именно потому, что я работаю эмбеде в тч, и тут местами зоопарки строк, многие из которых хранят строку непосредственно в своём теле. И саму либу форматирования я старался дизайнить с учётом подобных строк, но местами мог профукатся, плюс зависимые либы, которые я делал без оглядки на эмбед — я об этом написал, это уже вопрос полировки, когда основной функционал будет реализован.


TB>По коду не знаю, что сказать, некоторые приколы только в процессе использования проявляются.


Ну, в соседнем топике коллеги нашли косяк в моей реализации is_bool, просто проглядев по диагонали мой код.


TB>Реальные косяки тут не определить. У меня бывало что при определении вывода для кастомного типа в шаблонах что-то ехало не туда и в дебаге программа падала, потому что долго объяснять, я пол-дня убил чтоб понять.


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

_>А фильтры можно? Типа {{x|filter1|filter2}} => filter2(filter1(x)). (Что бы можно было sql запросы наример или xml экранировать строки или просто camelcase делать). Можноли изменить кастомизировать функцию расчета ширины.


Давай подробно, что бы ты хотел. Про фильтры и тп. Про кастомизацию расчета ширины поля.

Я открыт к обсуждению, для того и запилил топик.

Мне подобное не требовалось. Я пока насовал только то, что нужно было мне

И да, про фильтры и всё такое, накидай, как ты это видишь и тебе было бы удобно использовать
Маньяк Робокряк колесит по городу
Отредактировано 14.04.2025 20:52 Marty . Предыдущая версия .
Re[4]: Блин, обидно
От: T4r4sB Россия  
Дата: 14.04.25 21:07
Оценка:
Здравствуйте, Marty, Вы писали:


M>И да, может, есть какой-то идиоматический приём, который позволяет малой кровью собрать вариадик параметры в initializer_list?


Не знаю, это?
template <typename Arg, typename... Args>
void foo(Arg&& arg, Args&&... args) {
    auto list = { std::forward<Arg>(args)...};
}

правда боюсь что std::string он полностью скопирует внутрь
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[3]: Библиотека форматирования marty::format
От: kov_serg Россия  
Дата: 15.04.25 06:48
Оценка:
Здравствуйте, Marty, Вы писали:


M>Давай подробно, что бы ты хотел. Про фильтры и тп. Про кастомизацию расчета ширины поля.

Всё очень просто функция расчета ширины должна быть параметром, что бы её можно было поменять.
Для форматирования таблиц и выравнивания текста, очень полезно, т.к. unicode сложный и могут быть сюрпризы, и иногда надо не utf8.
M>Я открыт к обсуждению, для того и запилил топик.

M>Мне подобное не требовалось. Я пока насовал только то, что нужно было мне

M>И да, про фильтры и всё такое, накидай, как ты это видишь и тебе было бы удобно использовать

Вот пример на lua:
T=template{ name="<a>", u=string.upper, e=xml_encode }
print(T"result={{name|u|e}}")
result=&lt;A&gt;
Re[4]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.04.25 09:15
Оценка: :)
Здравствуйте, kov_serg, Вы писали:


M>>Давай подробно, что бы ты хотел. Про фильтры и тп. Про кастомизацию расчета ширины поля.

_>Всё очень просто функция расчета ширины должна быть параметром, что бы её можно было поменять.
_>Для форматирования таблиц и выравнивания текста, очень полезно, т.к. unicode сложный и могут быть сюрпризы, и иногда надо не utf8.

Можно сделать


M>>Мне подобное не требовалось. Я пока насовал только то, что нужно было мне

M>>И да, про фильтры и всё такое, накидай, как ты это видишь и тебе было бы удобно использовать

_>Вот пример на lua:

_>
_>T=template{ name="<a>", u=string.upper, e=xml_encode }
_>print(T"result={{name|u|e}}")
_>
_>result=&lt;A&gt;
_>


Фильтры отдельными параметрами передавать?

А ширина текста должна высчитываться до фильтров, или после?
Маньяк Робокряк колесит по городу
Re[5]: Библиотека форматирования marty::format
От: kov_serg Россия  
Дата: 15.04.25 09:33
Оценка:
Здравствуйте, Marty, Вы писали:

M>Фильтры отдельными параметрами передавать?

так же как и переменные по имени, это такая же переменная только значение функция

M>А ширина текста должна высчитываться до фильтров, или после?

это может быть параметром фильтра
T=template{ a1=align_text{ type="right", width=80, text_width=get_html_text_width } }
Re: Библиотека форматирования marty::format
От: Igore Россия  
Дата: 15.04.25 11:22
Оценка: 8 (1)
Здравствуйте, Marty, Вы писали:

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

Стиль форматирование временами, что нету {} для единичных условий, есть лишнии куски закоментированного кода.

По виду наверное будет неплохо сделать класс где будет вместе const char *fmt и FormatArgumentVariantList, на него сверху string literal, ms, чтобы можно было потом писать
cout << formatMessage(
    "Pi: {Pi:f}\n"ms.arg("Pi", 3.14159)
);
Re[2]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.04.25 11:32
Оценка:
Здравствуйте, Igore, Вы писали:

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

I>Стиль форматирование временами, что нету {} для единичных условий, есть лишнии куски закоментированного кода.

Есть такое, потом почищу, если руки дотянуться


I>По виду наверное будет неплохо сделать класс где будет вместе const char *fmt и FormatArgumentVariantList, на него сверху string literal, ms, чтобы можно было потом писать

I>
I>cout << formatMessage(
I>    "Pi: {Pi:f}\n"ms.arg("Pi", 3.14159)
I>);
I>


Не понял, а что за ms

Не раскроешь мысль, а то не понятно
Маньяк Робокряк колесит по городу
Re[3]: Библиотека форматирования marty::format
От: kov_serg Россия  
Дата: 15.04.25 12:04
Оценка: 14 (2) +1
Здравствуйте, Marty, Вы писали:

M>Не понял, а что за ms

M>Не раскроешь мысль, а то не понятно
Видимо он имел ввиду такое:
// https://en.cppreference.com/w/cpp/language/user_literal
#include <string>
using std::string;

struct A {
    const char* text; size_t size;
    A& var(const char* name,...) { return *this; }
    operator string() { return "result"; }
};

A operator ""_f(const char* text, size_t size) { return A{text,size}; }

int main(int argc, char **argv) {
    string res=R"(
+----+---+
| 12 | 3 |
+----+---+
)"_f.var("a",12).var("b",3.14);
    return 0;
}
Re[3]: Библиотека форматирования marty::format
От: Igore Россия  
Дата: 15.04.25 12:18
Оценка: 8 (1)
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, Igore, Вы писали:


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

I>>Стиль форматирование временами, что нету {} для единичных условий, есть лишнии куски закоментированного кода.

M>Есть такое, потом почищу, если руки дотянуться



I>>По виду наверное будет неплохо сделать класс где будет вместе const char *fmt и FormatArgumentVariantList, на него сверху string literal, ms, чтобы можно было потом писать

I>>
I>>cout << formatMessage(
I>>    "Pi: {Pi:f}\n"ms.arg("Pi", 3.14159)
I>>);
I>>


M>Не понял, а что за ms

Сокращение MartyString
M>Не раскроешь мысль, а то не понятно
kov_serg правильно понял, я о user_literal, можно свои определять, чтобы меньше кода писать.
Как пример

Когда написал понял, что если будет отдельный класс где будет и строка форматирования и аргументы, то можно дополнительно переопределить вывод этого класс в поток и тогда убрать formatMessage в явном видет, оставить только
cout << "Pi: {Pi:f}\n"ms.arg("Pi", 3.14159);
Re[4]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.04.25 12:24
Оценка:
Здравствуйте, Igore, Вы писали:

M>>Не понял, а что за ms

I>Сокращение MartyString



Тогда наверное — mf — MartyFormat


I>Когда написал понял, что если будет отдельный класс где будет и строка форматирования и аргументы, то можно дополнительно переопределить вывод этого класс в поток и тогда убрать formatMessage в явном видет, оставить только

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


Да, так покороче получается. Надо подумать
Маньяк Робокряк колесит по городу
Re[5]: Библиотека форматирования marty::format
От: Igore Россия  
Дата: 15.04.25 13:01
Оценка:
Здравствуйте, Marty, Вы писали:

M>Да, так покороче получается. Надо подумать

Еще было бы неплохо какой-нибудь fwd.h где будут типы используемые, чтобы только его включать и там свои сокращения добавить
using FormatArguments = std::vector< std::pair<std::string, FormatArgumentVariant> >;


чтобы не писать длинно "std::vector< std::pair<std::string," в примерах.
Re[6]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.04.25 13:05
Оценка:
Здравствуйте, Igore, Вы писали:

I>Еще было бы неплохо какой-нибудь fwd.h где будут типы используемые, чтобы только его включать и там свои сокращения добавить

I>
I>using FormatArguments = std::vector< std::pair<std::string, FormatArgumentVariant> >;
I>


I>чтобы не писать длинно "std::vector< std::pair<std::string," в примерах.


Ну, так-то для аргументов уже есть тип Args, плодить ещё разные StdVectorOfPairsArgs — имхо так себе идея, и это замыливает то, что можно использовать стандартные контейнеры, как раз то, что я в примерах хотел показать
Маньяк Робокряк колесит по городу
Re[2]: Блин, обидно
От: rg45 СССР  
Дата: 15.04.25 13:53
Оценка: :))
Здравствуйте, Marty, Вы писали:

M>Шамжа шлак приносит, а дискуссии несколько экранов занимают.

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

Не в огорчение будет сказано. Во-первых, у тебя много кода, это ж вникать нужно. Во-вторых, С++17. Ну и в-третьих, ты не такой забавный, как Shmj.
--
Справедливость выше закона. А человечность выше справедливости.
Re[4]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.04.25 16:58
Оценка:
Здравствуйте, Igore, Вы писали:

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

Вот я в функции хочу вывести отформатированную строку:

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


Мне перед этим надо написать
using namespace marty::format::literals;


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

Итого код будет выглядеть примерно так:
using namespace marty::format::literals;
cout << "Pi: {Pi:f}\n"_mf.arg("Pi", 3.14159);


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


А информативность зело падает, не?
Маньяк Робокряк колесит по городу
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 . Предыдущая версия .
Re[2]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.04.25 12:33
Оценка:
Здравствуйте, Marty, Вы писали:


M>Фильтры и пайпы фильтров

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

Кстати, если кому интересно, можно добавить встроенных фильтров для JSON, YAML, TOML, если кому интересно. Надо только обсудить, как их сделать. Мне лень искать, по каким правилам там строки экранируются, мне это пока не особо нужно.

Можно ещё сишное экранирование добавить. Хотя, вроде, форматный символ '?' и так это должен делать, но его я пока обрабатываю, как 's'.
Маньяк Робокряк колесит по городу
Re[3]: Библиотека форматирования marty::format
От: kov_serg Россия  
Дата: 27.04.25 13:48
Оценка:
Здравствуйте, Marty, Вы писали:

M>Можно ещё сишное экранирование добавить. Хотя, вроде, форматный символ '?' и так это должен делать, но его я пока обрабатываю, как 's'.

И экранирование командной строки
Re[4]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.04.25 13:50
Оценка:
Здравствуйте, kov_serg, Вы писали:

M>>Можно ещё сишное экранирование добавить. Хотя, вроде, форматный символ '?' и так это должен делать, но его я пока обрабатываю, как 's'.

_>И экранирование командной строки

Да, в общем-то, нет проблем, у меня где-то уже даже реализовано
Правда, только под винду, под линупсами там другие правила
Маньяк Робокряк колесит по городу
Re: Библиотека форматирования marty::format
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 12.05.25 17:22
Оценка:
Здравствуйте, Marty, Вы писали:

M>Надо же как-то расти

Чем это лучше fmtlib::fmt?
Sic luceat lux!
Re[2]: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.05.25 15:00
Оценка:
Здравствуйте, Kernan, Вы писали:

M>>Надо же как-то расти

K>Чем это лучше fmtlib::fmt?

Я поюзал std::format из 20ых плюсов, саму fmtlib не ковырял. Но, полагаю, что в ней есть тот же недостаток, как и в std::format — он у меня отказался работать с динамическими строками. А все нужно в рантайме использовать — например, для форматирования локализованных сообщений.

Далее. Опять же, std::format, а не fmtlib (уверен, там аналогично) — нет поддержки именованных аргументов, только позиционные.

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

Перетащил из питона некоторые фичи, например, добавил форматные символы '%', 'n' из питона. В целом, вообще сделал форматную строку совместимой с питоновской.

Добавил форматный символ '$' — форматирует валюту, при использовании локали символ валюты берётся из системы.

Добавил вывод bool как строк "TRUE/True/true" и тп.

Целиком можно тут глянуть — https://github.com/al-martyn1/marty_format/blob/main/README.md#%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8

Хотя, тут тоже наверное не всё, мог позабыть что-то вынести в список фич

Да, краткая выжимка фич есть на кывте
Автор: Marty
Дата: 27.04 03:03
, если на гитхаб лень идти
Маньяк Робокряк колесит по городу
Отредактировано 15.05.2025 16:34 Marty . Предыдущая версия .
Re: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.05.25 16:41
Оценка:
Здравствуйте, Marty, Вы писали:

В общем, допилил. На текущий момент всё необходимое есть.

Добавил поддержку локали (пока только винда, если кто подскажет, как сделать под линупс — можно добавить), подробнее — тут

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

Локаль передаётся не как параметр шаблона, а как параметр функции.

Допилил форматирование плавучки. Она основана на std::to_chars, для GCC меньше 11го используются потоки std::ostringstream.

Добавил форматирование валюты (форматный символ '$').

Юзер-литералы — пока лень делать.
Пользовательские типы тоже пока заленился форматировать.

Вроде в целом всё готово.
Маньяк Робокряк колесит по городу
Re: Библиотека форматирования marty::format
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 09.06.25 16:15
Оценка:
Здравствуйте, Marty, Вы писали:

Присунул поддержку своего marty::BigInt.

Присунул форматирование римскими цифрами — спецификаторы 'r'/'R'. Ноль выводится как строка 'NULLA', бесконечность (все числа больше 9999) — 'INFINITAS'.

Для вывода используются латинские буквы. Можно включить использование 'Unicode'-символов для римских цифр соответствующим флагом при вызове функции форматирования.

Можно обсудить, с какой величины число можно считать бесконечностью. С лимитом 9999 будет выведено девять цифр 'M', а при лимите в 65535 — цифр 'M' будет 65. Так как у римлян не было символов для 5000 и 10000, явно они не пользовались такими числами, и какие большие значения можно было бы вывести римскими цифрами — я хз.
Маньяк Робокряк колесит по городу
Отредактировано 09.06.2025 16:16 Marty . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.