Строковые выражения Подробнее...
Концепты | |
concept | simstr::StrExpr |
Концепт "Строковых выражений". | |
concept | simstr::StrExprForType |
Концепт строкового выражения заданного типа символов | |
Классы | |
struct | simstr::expr_replaced< K > |
Строковое выражение, генерирующее строку с заменой всех вхождений заданной подстроки. Подробнее... | |
struct | simstr::expr_replace_symbols< K, UseVectorForReplace > |
Тип для строкового выражения, генерирующее строку, в которой заданные символы заменяются на заданные строки. Подробнее... | |
struct | simstr::strexprjoin< A, B > |
Шаблонный класс для конкатенации двух строковых выражений в одно с помощью operator + Подробнее... | |
struct | simstr::strexprjoin_c< A, B, last > |
Конкатенация ссылки на строковое выражение и значения строкового выражения Подробнее... | |
struct | simstr::empty_expr< K > |
"Пустое" строковое выражение Подробнее... | |
struct | simstr::expr_spaces< K, N, S > |
Тип строкового выражения, возвращающего N заданных символов. Подробнее... | |
struct | simstr::expr_pad< K > |
Тип строкового выражения, возвращающего N заданных символов. Подробнее... | |
struct | simstr::expr_choice< A, B > |
Строковое выражение условного выбора Подробнее... | |
struct | simstr::expr_if< A > |
Строковое выражение условного выбора Подробнее... | |
struct | simstr::expr_choice_one_lit< A, N, Compare > |
Строковое выражение условного выбора Подробнее... | |
struct | simstr::expr_choice_two_lit< K, N, M > |
Строковое выражение условного выбора Подробнее... | |
struct | simstr::expr_stdstr< K, T > |
Тип для использования std::string и std::string_view как источников в строковых выражениях Подробнее... | |
Функции | |
template<StrExpr A, FromIntNumber T> | |
constexpr auto | simstr::operator+ (const A &a, T s) |
Оператор конкатенации для строкового выражения и целого числа. | |
template<StrExpr A, FromIntNumber T> | |
constexpr auto | simstr::operator+ (T s, const A &a) |
Оператор конкатенации для целого числа и строкового выражения. | |
template<typename K, typename T> | |
constexpr auto | simstr::e_num (T t) |
Преобразование целого числа в строковое выражение | |
template<StrExpr A, typename R> requires (is_one_of_std_char_v<typename A::symb_type> && (std::is_same_v<R, double> || std::is_same_v<R, float>)) | |
constexpr auto | simstr::operator+ (const A &a, R s) |
Оператор конкатенации для строкового выражения и вещественного числа (float , double ). | |
template<StrExpr A, typename R> requires (is_one_of_std_char_v<typename A::symb_type> && (std::is_same_v<R, double> || std::is_same_v<R, float>)) | |
constexpr auto | simstr::operator+ (R s, const A &a) |
Оператор конкатенации для вещественного числа (float , double ) и строкового выражения. | |
template<typename K> requires (is_one_of_std_char_v<K>) | |
constexpr auto | simstr::e_real (double t) |
Преобразование double числа в строковое выражение | |
template<bool tail = false, bool skip_empty = false, typename L, typename K = typename const_lit<L>::symb_type, size_t I = const_lit<L>::Count, typename T> | |
constexpr auto | simstr::e_join (const T &s, L &&d) |
Получить строковое выражение, конкатенирующее строки в контейнере в одну строку с заданным разделителем | |
template<typename K, typename T, size_t N = const_lit_for<K, T>::Count, typename X, size_t L = const_lit_for<K, X>::Count> requires (N > 1) | |
constexpr auto | simstr::e_repl (simple_str< K > w, T &&p, X &&r) |
Получить строковое выражение, генерирующее строку с заменой всех вхождений заданной подстроки | |
template<bool UseVector = false, typename K, typename ... Repl> requires (sizeof...(Repl) % 2 == 0) | |
auto | simstr::e_repl_const_symbols (simple_str< K > src, Repl &&... other) |
Возвращает строковое выражение, генерирующее строку, в которой заданные символы заменены на заданные подстроки. | |
template<StrExpr A, StrExprForType< typename A::symb_type > B> | |
auto | simstr::operator+ (const A &a, const B &b) |
Оператор сложения двух произвольных строковых выражения для одинакового типа символов. | |
template<typename K, StrExprForType< K > A> | |
constexpr auto | simstr::operator+ (const A &a, K s) |
Оператор сложения строкового выражения и одного символа | |
template<typename K> | |
constexpr auto | simstr::e_char (K s) |
Генерирует строку из 1 заданного символа | |
template<typename T, size_t N = const_lit<T>::Count> | |
constexpr auto | simstr::e_t (T &&s) |
Преобразует строковый литерал в строковое выражение. | |
template<StrExpr A, typename K = typename A::symb_type, typename T, size_t N = const_lit_for<K, T>::Count> | |
constexpr auto | simstr::operator+ (const A &a, T &&s) |
Оператор сложения для строкового выражения и строкового литерала такого же типа символов | |
template<StrExpr A, typename K = typename A::symb_type, typename T, size_t N = const_lit_for<K, T>::Count> | |
constexpr auto | simstr::operator+ (T &&s, const A &a) |
Оператор сложения для строкового литерала такого же типа символов и строкового выражения | |
template<size_t N> | |
constexpr auto | simstr::e_spca () |
Генерирует строку из N char пробелов | |
template<size_t N> | |
constexpr auto | simstr::e_spcw () |
Генерирует строку из N wchar_t пробелов | |
template<typename K> | |
constexpr auto | simstr::e_c (size_t l, K s) |
Генерирует строку из l символов s типа K. | |
template<StrExpr A, StrExprForType< typename A::symb_type > B> | |
constexpr auto | simstr::e_choice (bool c, const A &a, const B &b) |
Создание условного строкового выражения expr_choice. | |
template<StrExpr A, typename T, size_t N = const_lit_for<typename A::symb_type, T>::Count> | |
constexpr auto | simstr::e_choice (bool c, const A &a, T &&str) |
Перегрузка e_choice, когда третий аргумент - строковый литерал | |
template<StrExpr A, typename T, size_t N = const_lit_for<typename A::symb_type, T>::Count> | |
constexpr auto | simstr::e_choice (bool c, T &&str, const A &a) |
Перегрузка e_choice, когда второй аргумент - строковый литерал | |
template<typename T, typename L, size_t N = const_lit<T>::Count, size_t M = const_lit_for<typename const_lit<T>::symb_type, L>::Count> | |
constexpr auto | simstr::e_choice (bool c, T &&str_a, L &&str_b) |
Перегрузка e_choice, когда второй и третий аргумент - строковые литералы | |
template<StrExpr A> | |
constexpr auto | simstr::e_if (bool c, const A &a) |
Создание условного строкового выражения expr_if. | |
template<typename T, size_t N = const_lit<T>::Count> | |
constexpr auto | simstr::e_if (bool c, T &&str) |
Перегрузка e_if, когда второй аргумент - строковый литерал | |
template<StrExprForType< u8s > A> | |
auto | simstr::operator+ (const A &a, const std::string &s) |
Оператор сложения для char строкового выражения и std::string. | |
template<StrExprForType< u8s > A> | |
auto | simstr::operator+ (const std::string &s, const A &a) |
Оператор сложения для std::string и char строкового выражения | |
template<StrExprForType< u8s > A> | |
auto | simstr::operator+ (const A &a, const std::string_view &s) |
Оператор сложения для char строкового выражения и std::string_view. | |
template<StrExprForType< u8s > A> | |
auto | simstr::operator+ (const std::string_view &s, const A &a) |
Оператор сложения для std::string_view и char строкового выражения | |
template<StrExprForType< uws > A> | |
auto | simstr::operator+ (const A &a, const std::wstring &s) |
Оператор сложения для wchar_t строкового выражения и std::wstring. | |
template<StrExprForType< uws > A> | |
auto | simstr::operator+ (const std::wstring &s, const A &a) |
Оператор сложения для std::wstring и wchar_t строкового выражения | |
template<StrExprForType< uws > A> | |
auto | simstr::operator+ (const A &a, const std::wstring_view &s) |
Оператор сложения для wchar_t строкового выражения и std::wstring_view. | |
template<StrExprForType< uws > A> | |
auto | simstr::operator+ (const std::wstring_view &s, const A &a) |
Оператор сложения для std::wstring_view и wchar_t строкового выражения | |
Переменные | |
constexpr empty_expr< u8s > | simstr::eea {} |
Пустое строковое выражение типа char. | |
constexpr empty_expr< uws > | simstr::eew {} |
Пустое строковое выражение типа wchar_t. | |
constexpr empty_expr< u16s > | simstr::eeu {} |
Пустое строковое выражение типа char16_t. | |
constexpr empty_expr< u32s > | simstr::eeuu {} |
Пустое строковое выражение типа char32_t. | |
Строковые выражения
Все типы владеющих строк могут инициализироваться с помощью "строковых выражений" (по сути это вариант https://en.wikipedia.org/wiki/Expression_templates для строк). Строковое выражение - это объект произвольного типа, у которого имеются методы:
size_t length() const
: выдает длину строкиK* place(K*) const
: скопировать символы строки в предназначенный буфер и вернуть указатель за последним символомtypename symb_type
: показывает, с каким типом символов он работает.При инициализации строковый объект запрашивает у строкового выражения его размер, выделяет необходимую память, и передает память строковому выражению, которое помещает символы в отведённый буфер.
Все строковые объекты библиотеки сами являются строковыми выражениями, которые просто копирует исходную строку. В-основном строковые выражения используются для конкатенации или конвертации строк.
Для всех строковых выражений определен operator +, который из двух операндов создает новое строковое выражение simstr::strexprjoin, объединяющее два строковых выражения, и которое в методе length
возвращает сумму length
исходных операндов, а в методе place
- размещает в буфер результата сначала первый операнд, потом второй. И так как этот оператор сам возвращает строковое выражение, то к нему снова можно применить operator +
, формируя цепочку из нескольких строковых выражений, и в итоге "материализовать" последний получившийся объект, который сначала посчитает размер всей общей памяти для конечного результата, а затем разместит вложенные подвыражения в один буфер.
Также operator +
определён для строковых выражений и строковых литералов, строковых выражений и чисел (числа конвертируются в десятичное представление), а также вы можете сами добавить желаемые типы строковых выражений. Пример:
Существует несколько типов строковых выражений "из коробки", для выполнения различных операций со строками
expr_spaces<ТипСимвола, КоличествоСимволов, Символ>{}
: выдает строку длиной КоличествоСимволов, заполненную заданным символом. Количество символов и символ - константы времени компиляции. Для некоторых случаев есть сокращенная запись:e_spca<КоличествоСимволов>()
: строка char пробеловe_spcw<КоличествоСимволов>()
: строка w_char пробеловexpr_pad<ТипСимвола>{КоличествоСимволов, Символ}
: выдает строку длинной КоличествоСимволов, заполненную заданным символом. Количество символов и символ могут задаваться в рантайме. Сокращенная запись: e_c(КоличествоСимволов, Символ)
e_choice(bool Condition, StrExpr1, StrExpr2)
: если Condition == true, результат будет равен StrExpr1, иначе StrExpr2e_num<ТипСимвола>(ЦелоеЧисло)
: конвертирует число в десятичное представление. Редко используется, так как для строковых выражений и чисел переопределен оператор "+", и число можно просто написать как text + number;e_real<ТипСимвола>(ВещественноеЧисло)
: конвертирует число в десятичное представление. Редко используется, так как для строковых выражений и чисел переопределен оператор "+", и число можно просто написать как text + number
;e_join<bool ПослеПоследнего = false, bool ПропускатьПустые = false>(контейнер, "Разделитель")
: конкатенирует все строки в контейнере, используя разделитель. Если ПослеПоследнего == true
, то разделитель добавляется и после последнего элемента контейнера, иначе только между элементами. Если ПропускатьПустые == true
, то пустые строки не добавляют разделитель, иначе для каждой пустой строки тоже вставляется разделительe_repl(ИсходнаяСтрока, "Искать", "Заменять")
: заменяет в исходной строке вхождения "Искать" на "Заменять". Шаблоны поиска и замены - строковые литералы времени компиляции.expr_replaced<ТипСимвола>{ИсходнаяСтрока, Искать, Заменять}
: заменяет в исходной строке вхождения Искать на Заменять. Шаблоны поиска и замены - могут быть любыми строковыми объектами в рантайме.и т.д. и т.п.
|
inlineconstexpr |
Генерирует строку из l символов s типа K.
K | - тип символа |
l | - количество символов |
s | - символ |
|
inlineconstexpr |
Генерирует строку из 1 заданного символа
S | - символ |
|
inlineconstexpr |
Создание условного строкового выражения expr_choice.
A | - Тип выражение при истинности условия, выводится из аргумента |
B | - Тип выражения при ложности условия, выводится из аргумента |
c | - булево условие |
a | - строковое выражение, выполняющееся при c == true |
b | - строковое выражение, выполняющееся при c == false |
Служит для возможности в одном выражении выбирать разные варианты в зависимости от условия.
Примеры:
Иначе такие операции приходилось бы разбивать на несколько модификаций строки или применению временных строк, что не оптимально и снизит производительность. (Это проверяется в бенчмарке "Build Full Func Name")
|
inlineconstexpr |
Создание условного строкового выражения expr_if.
A | - Тип выражение при истинности условия, выводится из аргумента |
c | - булево условие |
a | - строковое выражение, выполняющееся при c == true |
Служит для возможности в одном выражении генерировать в зависимости от условия либо указанный вариант, либо пустую строку.
Примеры:
Иначе такие операции приходилось бы разбивать на несколько модификаций строки или применению временных строк, что не оптимально и снизит производительность. (Этот пример проверяется в бенчмарке "Build Full Func Name")
|
inlineconstexpr |
Получить строковое выражение, конкатенирующее строки в контейнере в одну строку с заданным разделителем
tail | - добавлять ли разделитель после последней строки |
skip_empty | - пропускать пустые строки без добавления разделителя |
s | - контейнер со строками, должен поддерживать range for . |
d | - разделитель, строковый литерал |
|
inlineconstexpr |
Преобразование целого числа в строковое выражение
K | - тип символов |
T | - тип числа, выводится из аргумента |
t | - число |
Возвращает строковое выражение, которое генерирует десятичное представление заданного числа. Может использоваться, когда надо конкатенировть число и строковый литерал
|
inlineconstexpr |
Преобразование double
числа в строковое выражение
t | - число |
Возвращает строковое выражение, которое генерирует десятичное представление заданного числа с помощью sprintf("%.16g")
. Может использоваться, когда надо конкатенировть число и строковый литерал
|
inlineconstexpr |
Получить строковое выражение, генерирующее строку с заменой всех вхождений заданной подстроки
K | - тип символа, выводится из первого аргумента |
w | - начальная строка |
p | - строковый литерал, искомая подстрока |
r | - строковый литерал, на что заменять |
auto simstr::e_repl_const_symbols | ( | simple_str< K > | src, |
Repl &&... | other ) |
Возвращает строковое выражение, генерирующее строку, в которой заданные символы заменены на заданные подстроки.
UseVector | - использовать вектор для сохранения результатов поиска символов. Более подробно описано в expr_replace_symbols . |
src | - исходная строка |
symbol | - константный символ, который надо заменять |
repl | - строковый литерал, на который заменять символ |
... | symbol, repl - другие символы и строки |
Применяется для генерации замены символов на строки, в случае если все они известны в compile time. Пример:
В принипе, e_repl_const_symbols
вполне безопасно возвращать из функции, если исходная строка внешняя по отношению к функции
|
inlineconstexpr |
Генерирует строку из N char пробелов
N | - Количество пробелов |
Пример:
|
inlineconstexpr |
Генерирует строку из N wchar_t пробелов
N | - Количество пробелов |
Пример:
|
inlineconstexpr |
Преобразует строковый литерал в строковое выражение.
Строковые литералы сами по себе не являются строковыми выражениями. Обычно в операциях конкатенации это не вызывает проблем, так как второй операнд уже является строковым выражением, и для него срабатывает сложение с литералом. Но есть ситуации, когда второй операнд тоже не является строковым выражением. Например:
В этом случае можно преобразовать литерал в строковое выражение двумя способами:
"text"_ss
, что преобразует литерал в simple_str_nt: res = "text"_ss + intVar
e_t("text")
, что преобразует литерал в expr_literal: res = e_t("text") + intVar
Во втором способе компилятор может более агрессивно применить оптимизации, связанные с известным при компиляции размером литерала.
Хотя строго говоря, в этих ситуации можно пользоваться и другими способами:
result = eea + "text" + intVar
, result = "text" + eea + intVar
result = "text" + e_num<u8s>(intVar)
.Все эти способы работают и выдают одинаковый результат. Каким пользоваться - дело вкуса.
|
inline |
Оператор сложения двух произвольных строковых выражения для одинакового типа символов.
a | - первое строковое выражение |
b | - второе строковое выражение |
Когда складываются два объекта - строковых выражения, один типа A
, другой типа B
, мы возвращаем объект типа strexprjoin<A, B>, который содержит ссылки на два этих операнда. А сам объект strexprjoin<A, B> тоже в свою очередь является строковым выражением, и может участвовать в следующих операциях сложения. Таким образом формируется "дерево" из исходных строковых выражений, которое потом за один вызов "материализуется" в конечный результат.
auto simstr::operator+ | ( | const A & | a, |
const std::wstring & | s ) |
Оператор сложения для wchar_t строкового выражения и std::wstring.
Оператор сложения для совместимого с wchar_t строкового выражения (char16_t или char32_t, в зависимости от компилятора) и std::wstring.
auto simstr::operator+ | ( | const A & | a, |
const std::wstring_view & | s ) |
Оператор сложения для wchar_t строкового выражения и std::wstring_view.
Оператор сложения для совместимого с wchar_t строкового выражения (char16_t или char32_t, в зависимости от компилятора) и std::wstring_view.
|
inlineconstexpr |
Оператор сложения строкового выражения и одного символа
Пример:
|
inlineconstexpr |
Оператор конкатенации для строкового выражения и вещественного числа (float
, double
).
a | - строковое выражение |
s | - число |
Число конвертируется в строковое представление через sprintf("%.16g").
|
inlineconstexpr |
Оператор сложения для строкового выражения и строкового литерала такого же типа символов
|
inlineconstexpr |
Оператор конкатенации для строкового выражения и целого числа.
a | - строковое выражение |
s | - число |
Число конвертируется в десятичное строковое представление.
auto simstr::operator+ | ( | const std::wstring & | s, |
const A & | a ) |
Оператор сложения для std::wstring и wchar_t строкового выражения
Оператор сложения для std::wstring и совместимого с wchar_t строкового выражения (char16_t или char32_t, в зависимости от компилятора)
auto simstr::operator+ | ( | const std::wstring_view & | s, |
const A & | a ) |
Оператор сложения для std::wstring_view и wchar_t строкового выражения
Оператор сложения для std::wstring_view и совместимого с wchar_t строкового выражения (char16_t или char32_t, в зависимости от компилятора)
|
inlineconstexpr |
Оператор конкатенации для вещественного числа (float
, double
) и строкового выражения.
s | - число |
a | - строковое выражение |
Число конвертируется в строковое представление через sprintf("%.16g")
.
|
inlineconstexpr |
Оператор сложения для строкового литерала такого же типа символов и строкового выражения
|
inlineconstexpr |
Оператор конкатенации для целого числа и строкового выражения.
s | - число |
a | - строковое выражение |
Число конвертируется в десятичное строковое представление.