Версия 1.0.
В этой библиотеке содержится реализация нескольких видов строковых объектов и различных алгоритмов для работы со строками.
Цель библиотеки - сделать работу со строками в С++ такой же простой и лёгкой, как во множестве других языков, особенно скриптовых, но при этом сохранив оптимальность и производительность на уровне С и C++, и даже улучшив их.
Не секрет, что работа со строками в С++ зачастую доставляет боль. Класс std::string
часто неудобен либо неэффективен. Многих функций, обычно необходимых при работе со строками, просто нет, и их каждому приходится писать самому.
Эта библиотека не делалась как универсальный комбайн, который "может всё", я реализовывал то, что мне приходилось использовать в работе, стараясь сделать это наиболее эффективным способом, и скромно надеюсь, что кое-что у меня получилось и пригодится другим людям, либо напрямую, либо как источник идей.
Библиотека не претендует на роль "поменял хедер и всё заработало лучше". Многие методы я старался делать совместимыми с std::string
и std::string_view
, но особо с этим не заморачивался. Переписывание старого кода на работу с simstr потребует некоторых усилий, но уверяю, что они окупятся. А новый код писать с её применением легко и доставляет удовольствие :)
Основное отличие simstr от std::string - для работы со строками используется не единый универсальный класс, а несколько видов объектов, каждый из которых хорош для своих целей, и при этом хорошо взаимодействующих друг с другом. Если вы активно использовали std::string_view и понимали, в чём его преимущество и недостатки по сравнению с std::string, то подход simstr вам также будет понятен.
char
, char16_t
, char32_t
, wchar_t
.Splitter
.format
и sprintf
(с автоматическим увеличением буфера). Форматирование возможно для строк char
, wchar_t
и строк, совместимых с wchar_t
по размеру. То есть под Windows это char16_t
, под Linux - char32_t
. Писать свою библиотеку форматирования не входило в мои замыслы.0x
, 0
, 0b
, 0o
, допустимость знака +
. Парсинг реализован для всех видов строк и символов.char
, wchar_t
и совместимых с wchar_t
по размеру типов.upper
, lower
и регистро-независимом сравнении строк. Работает только для символов первой плоскости Unicode (до 0xFFFF), а при смене регистра не учитываются случаи, когда один code point может преобразовываться в несколько.hash map
для ключей строкового типа, на базе std::unordered_map
, с возможностью более эффективного хранения и сравнения ключей по сравнению с ключами std::string
. Поддерживается возможность регистро-независимого сравнения ключей (Ascii или минимальный Unicode (см. предыдущий пункт)).std::string_view
.Читать здесь
simstr
состоит из трёх заголовочных файлов и двух исходников. Можно подключать как CMake проект через add_subdirectory
(библиотека simstr
), можно просто включить файлы в свой проект. Для сборки также требуется simdutf, (уже подключена к репозитарию как git submodule
).
Для работы simstr
требуется компилятор стандарта не ниже С++20 - используются концепты и std::format. Работа проверялась под Windows на MSVC-19 и Clang-19, под Linux - на GCC-13 и Clang-21. Также проверялась работа в WASM, сборка в Emscripten 4.0.6, Clang-21.
Бенчмарки производятся с использованием фреймворка Google benchmark. Постарался сделать замеры для наиболее типичных операций, встречающихся в обычной работе. Я проводил замеры на своём оборудовании, под Windows и Linux (в WSL), с использованием компиляторов MSVC, Clang, GCC. Сторонние результаты приветствуются. Также проводил замеры в WASM, сборка в Emscripten. Обращаю внимание, что под WASM в Emscripten собирается 32-битная сборка, а значит, размеры буферов SSO в объектах меньше.
Пока отдельных примеров использования не подготовлено, можно посмотреть тексты тестов, бенчмарков, и утилиты подготовки html из результатов бенчмарков.