LEM: C++ библиотека поисковой машины - строки символов

Классы-шаблоны: 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  main page  rss  email  icq  download

К примеру, после чтения данных из 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() );
 

  © Mental Computing 2010