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

 

Вступление

Графическая часть

Математическая часть

Проверка и демонстрация возможностей

Классы для манипулирования символьными данными

Дружба со стандартными библиотеками STL и BOOST C++

Строки символов

Контейнеры

Потоки

Форматтер вывода - класс OFormatter

Лексеры и парсеры

Парсер ini-файлов

Макрогенератор - генератор отчетов БД

Micro_Solaris - склонения/спряжения слов

Калькулятор математических выражений

Локали

Управляемые указатели

Сканер файлов

Интерпретатор C-скриптов

Вступление

Первоначально (десяток лет назад - c 1993 года) библиотека LEM (Library of Experimental Mathematics) разрабатывалась как набор эффективных и проверенных инструментов (функции и классы) для решения задач численными методами (решение систем линейных уравнений - СЛУ, диференциальные уравнения, интегрирование и прочие вещи). Кроме этого, большую часть библиотеки занимали инструменты для решения задач машинной графики (двух- и трехмерной). Классы для работы с символьными данными были рудиментарны, в основном дело сводилось к строкам (классы для строк фиксированной максимальной длины - теперь это обобщение BaseCString, и строки произвольной длины - обобщение BaseFString) и некоторым потокам (примитивная инкапсуляция работы с дисковыми файлами).

Постепенно, в связи со сменой области практической деятельности,  упор в развитии библиотеки был сделан именно на обработке символьных данных. С 1995 года, когда началась разработка базовых идей системы Solarix, объем ее кода превысил размер исходников математической и графической частей LEM.

Кстати, с того времени некоторые файлы исходных текстов имеют длину имени 8 символов - MSDOS не поддерживала длинных имен файлов. Отсюда такие не совсем понятные имена хидеров, как lem_carr.h и lem_cstr.h.

Выкладывая детальные описания отдельных частей библиотеки поискового движка, мы не ставим задачу распространять эту библиотеку для поддержки проектов сторонних разработчиков. Лучше используйте удивительно мощную и обладающую многими достоинствами библиотеку BOOST C++.

Графическая часть

В настоящее время графическая часть LEM не представляет существенного практического интереса, хотя и может быть полезна при изучении алгоритмических основ компьютерной 3D графики. Реализованная иерархия классов (сцена, объекты, источники света, модули рендеринга) достаточно проста и легко обозрима. Конечно, никакой поддержки DirectX'а там нет - в ту пору, когда я писал эти классы, была реализована только OpenGL. Ее поддержки, впрочем, тоже нет :). Однако модули рендеринга - легко заменяемые драйверы преобразования 3D моделей в 2D картинку, можно рассматривать как учебное пособие.

Чтобы быстро оценить, что же представляют классы 3D моделирования библиотеки LEM, проще всего использовать демонстрационные проекты - в папке LEM\Demo\Rubin\3d. В папке LEM\Demo\Rubin\2d можно найти примеры программ, которые используют классы для отрисовки графиков (с полуавтоматическим размещением оформления - осей, разметки, подписей и т.д.).

Все исходники классов (их реализации - cpp-файлы ) для графики собраны в каталоге LEM\Rubin и LEM\Graph - для трехмерщины и для растровой 2d графики.

Проверка и демонстрация возможностей

Для ознакомления с некоторыми функциональными возможностями классов Библиотеки можно откомпилировать демонстрационную программу (впрочем, это скорее проверка нормальной работы классов после модификаций) в Lem\Demo\Misc\Hello\3. Там можно найти проект для IDE CBuilder 6.0 hello.bpr. В нем проверяются только некоторые части - работа со строками, парсинг. Вставить в этот проект еще код увенчалась полным провалом - у CBuilder'а, точнее его среды разработки, напрочь сносит крышу от большого количества файлов в проекте, и он просто отказывается компилировать с сообщением "Internal compiler error".

Таких проблем нет у Visual Studio.NET 2003 (есть другие проблемы с отладкой при большом проекте). Проект с проверкой/демонстрацией всех частей Библиотеки находится в Lem\Demo\Misc\Hello\3\hello\hello.sln.

Перед компиляцией не забудьте поправить пути к заголовочным файлам.

Классы для манипулирования символьными данными

Это основная часть библиотеки, широко используемая в проекте Solarix. Более-менее общие инструменты, такие как классы строк (разумеется, мы используем свои строки ), потоков, контейнеров, парсеров, собраны в каталогах LEM\Contain, Lem\Tools, Lem\Io. Все заголовочные находятся в Lem\Include. Специализированный код проекта Solarix собран в каталогах Lem\Include\Solarix и Lem\Ai. Проекты программ Solarix'а можно найти в Lem\Demo\Ai\Solarix.

Дружба со стандартными библиотеками STL и BOOST C++

Большинство частей STL, а также некоторые полезные части BOOST применяются в Системе весьма широко. Кроме этого, дополнительно введенные классы контейнеров и строк по возможности придерживаются стандартной библиотеки C++ на имена методов, типов-членов классов, на принципы работы итераторов и так далее.

Аналогичные соображения справедливы для кода библиотеки BOOST. Полезные части, такие как преобразования типов lexical_cast<T>, numeric_cast<T> (см. здесь), свойства числовых типов integer_traits<> (см. здесь) и другие, пришлись по вкусу - особенно учитывая проверенную портабельность этого кода.

В исходных текстах версии 0.82 после проведенного рефакторинга улучшена совместимость со стандартной библиотекой C++, в частности - контейнерные классы Collect<> и MCollect являются производными от стандартного std::vector<> с добавлением нескольких методов.

[Загрузить исходники]

изменено 12.11.2005

  © Mental Computing 2010