Классы-шаблоны: BaseCString<T>, BaseFString<T>
Классы: CString, UCString, FString, UFString
Объявлены в: lem_cstr.h и lem_fstr.h соответственно.
Краткое описание
Классы для манипулирования символьными строками (типа char* и wchar_t*). Строки обязательно терминируются нулем. Для строк BaseFString есть особый случай - строки нулевой длины (пустые строки) могут храниться как указатель на NULL.
Хэш-код
Оба класса прозрачно вычисляют хэш-код хранимых строк, чтобы ускорить операции сравнения. Тип значения хэш-кода объявлен в классах как поле hash_type. Получить текущее значение хэш-кода можно вызовом GetHash(). Чтобы принудительно пересчитать значение хэш-кода (например, после прямого манипулирования содержимым строки через указатель), вызывается метод calc_hash().
Строки типа BaseCString<T,L>
Их максимальная длина определяется параметром L специализации шаблона. Память для хранения символов образуется как поле класса (массив символов). Поэтому расходы на работу с динамической кучей отсутствуют. Соответственно, строки этого типа допускают побитовое копирование. При работе с естественными языками (это специализация библиотеки LEM для поискового движка) максимальная длина лексем обычно не превышает 30 символов (патологические случаи в немецком языке игнорируем). Именно для хранения отдельных лексем предназначен этот класс. Класс чрезвычайно широко используется в Проекте - как основа для классов лексем (Solarix::Lexem) и мультилексем (Solarix::MultyLexem). Объявлены специализации CString и UCString - для char и wchar_t - символов соответственно, с максимальной длиной, определяемой глобальным макросом LEM_CSTRING_LEN.
Строки типа BaseFString<T>
Не ограничены в длине, то есть память для хранения символов выделяется в глобальной куче. Но гарантируется, что 1) хранимая строка является нормальной C-строкой, то есть с терминирующим нулем, 2) хранимая строка является одной непрерывной строкой, что, вообще говоря, не гарантируется для std::basic_string.
Возможен особый случай: при хранении пустой строки (нулевой длины) вместо выделения блока под хранение терминирующего нуля может (не всегда) храниться указатель на NULL. Это следует помнить при получении указателя на строку методом c_str(). Если получение нулевого указателя вместо указателя на пустую строку нежелательно (например, при передаче этого указателя в функцию CRT), можно вызвать метод re_clear(), который в случае пустой строки пересоздаст ее, выделив блок динамической памяти с записав туда единственный терминирующий '\0'.
Общий интерфейс
В целом их интерфейс максимально приближен к стандартным. Например, как и для std::base_string, метод c_str() возвращает указатель на C-строку, length() - длину строки, begin() и end() - итераторы начала и после-конца строки, и так далее, включая некоторые поля-типы.
Классы содержат большое количество вспомогательных методов - поиск подстроки, замена подстроки, выделение части строки, и другие.
Например, метод subst( s1, s2 ) позволяет заменить в строке первое вхождение подстроки s1 на строку s2. Чтобы заменить все вхождения подстроки, используется метод subst_all.
© Mental Computing 2009
К примеру, после чтения данных из
ini-файла
поисковый движок должен заменить в путях к каталогам данных символ
тильды ~ на имя
домашнего каталога текущего пользователя. В коде
(см. файл
bfs_ini_search.cpp) это выглядит так:
scanning.download_dir = ini.get_string( "internet", "download_dir",
"" ).c_str();
scanning.download_dir.subst( "~\\", lem::System_Config::get_home_dir().c_str()
);