Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Boost.Flyweight Documentation - Examples

Boost , , Boost.Flyweight Documentation - Index

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Boost.Flyweight Examples




Contents

Example 1: basic usage

См.исходный код.

Программа Dummy, показывающая основные возможности<flyweight>, описанные в учебнике.

Example 2: key-value flyweights

См.исходный код.

Программа имитирует сценарий, описанный в разделе учебника поключевым значениям весов.: Класс<texture>управляет некоторыми текстурами, отображающими данные, хранящиеся в файле, местоположение которого указано в момент построения. Программа обрабатывает большое количество объектов этого класса, инкапсулируя их в мухоловки с ключевым значением, закодированные именем файла. Обратите внимание, что выполнение программы не приводит к дополнительным конструкциям или копиям объектов типа<texture>, за исключением тех, которые абсолютно необходимы.

Example 3: flyweights and the composite pattern

См.исходный код.

Композитная схема проектированиявращается вокруг идеи о том, что структура данных дерева может быть легко построена и обработана путем определения типа узла дерева полиморфно, так что либо является листовым узлом, либо содержит список указателей на их дочерние узлы. Таким образом, дерево представляет собой ту же сущность, что и его корневой узел, что позволяет использовать очень простые рекурсивные алгоритмы обработки деревьев. Большие композитные деревья, имеющие высокую степень дупликации узлов и поддеревьев (как, например, те, которые генерируются при разборе компьютерной программы), являются естественными для идиомы мухоловки: простое превращение типа узла в мухоловку автоматически имеет дело с дупликацией на уровне узла и поддеревьев.

Примерная программа анализирует Lisp-подобные списки формы<(a1... an)>, где каждая<ai>является терминальной строкой или списком. Структура парсированных данных представляет собой составной тип, определяемый с помощью Boost. Вес полёта в сочетании с рекурсивными установкамиBoost.Variant. Итак, учитывая список

(= (tan (+ x y))(/ (+ (tan x)(tan y))(- 1 (* (tan x)(tan y)))))

Полученная структура данных неявно обнаруживает дублированные случаи<+>,<x>,<y>,<tan>,<(tan x)>и<(tan y)>.

Example 4: formatted text processing

См.Исходный код.

Классическим примером применения шаблона flyweight является текстовый процессор, который обрабатывает символы с богатой информацией форматирования, такой как тип шрифта, размер, цвет и специальные параметры (смелость, курсив и т. Д.). Кодирование информации форматирования каждого символа занимает значительное пространство, но, учитывая высокую степень повторения, характерную для документа, поддержание форматированных символов в качестве объектов с массой тела резко снижает потребление памяти.

Пример программы анализирует, манипулирует и хранит HTML-документы, следуя методам представления на основе веса. Учитывая иерархический характер разметки HTML, грубое приближение к вариантам форматирования данного символа заключается в том, чтобы приравнять их к стеку контекстов тегов, к которым принадлежит символ, как показано на рисунке.

formatting contexts of characters in an HTML document
Fig. 1: Formatting contexts of characters in an HTML document.

HTML-документы затем анализируются как массивы (символ, формат) пар, где формат является контекстом тега, как описано выше. О очень высокой степени избыточности в форматировании информации заботится использование Boost. Весом. Это представление, основанное на символах, позволяет легко манипулировать документом: перенос и удаление частей текста являются тривиальными операциями. Например, программа переворачивает текст, занимающий центральную часть документа. Сохранение результата в HTML сводится к прохождению массива отформатированных символов и испусканию открывающих / закрывающих тегов HTML по мере изменения контекста соседних символов.

Для краткости возможности анализа HTML этой программы являются грубыми: например, элементы без конечного тега (например,
), кодирование символов и сущности HTML (например, «©» для ©) не обрабатываются должным образом. Улучшение парсингового кода остается в качестве упражнения для читателя.

Example 5: flyweight-based memoization

См.исходный код.

Мемоизация— это метод оптимизации, состоящий в кэшировании результатов вычислений для последующего повторного использования; это может значительно улучшить производительность при вычислении рекурсивных числовых функций, например.Ключевое значение flyweightsможет быть использовано для реализации запоминания для числовой функцииfпутем моделирования запоминания функции в качестве значения типа<flyweight<key_value<int,compute_f> >>, где<compute_f>является типом, который выполняет вычислениеfnу его<compute_f::compute_f(int)>конструктора. Например, числаФибоначчиможно вычислить с помощью таких заметок:

typedef flyweight<key_value<int,compute_fibonacci>,no_tracking> fibonacci;
struct compute_fibonacci
{
  compute_fibonacci(int n):
    result(n==0?0:n==1?1:fibonacci(n-2).get()+fibonacci(n-1).get())
  {}
  operator int()const{return result;}
  int result;
};

Политика<no_tracking>используется таким образом, чтобы мемуированные вычисления сохранялись для будущего использования во всей программе. Предоставленная программа развивает этот пример в полном объеме.

Example 6: serialization

См.исходный код.

Если<T>является сериализуемым (с использованиемBoost.Serialization),<flyweight<T>>также автоматически сериализуется. Примерная программа выполняет следующие две дополнительные процедуры:

  • Прочитайте текстовый файл [< [16] >] и сохраните запись в файле.
  • < [18] >[скрыто] и [скрыто] [скрыто] [скрыто].
Если вы визуально проверите содержимое любого из сгенерированных файлов сериализации, вы можете заметить, что ни одно слово не появляется дважды. Flyweight реализует некоторые внутренние механизмы, которые избегают дублирования выходной информации при сохранении равных<flyweight>объектов.Прочитайте текстовый файл какstd::vector<flyweight<std::string> >и сохраните структуру в файл сериализации.
  • Загрузитеstd::vector<flyweight<std::string> >из файла сериализации и запишите его в виде текстового файла.
  • If you visually inspect the contents of any of the generated serialization files you can notice that no word appears twice; Boost.Flyweight implements some internal machinery that avoids duplicating output information when saving equal flyweight objects. [ORIG_END] -->

    Example 7: performance comparison

    См.исходный код.

    Эта программа измеряет временные и пространственные характеристики простого типа строки по сравнению с несколькими по-разному сконфигурированными<flyweight>инстанциями, используемыми в обычной задаче, связанной с разбором файла и выполнением некоторых манипуляций с разборным текстом. Потребление памяти вычисляется путем использования соответствующих компонентов (сам тип струны, заводы по производству веса и т. Д.) с пользовательскими распределителями, которые отслеживают запрашиваемые распределения и распределения. Программа была использована для получения экспериментальных результатов, приведенных в разделепроизводительности.

    Example 8: custom factory

    См.исходный код.

    Пример показывает, как писать и использовать пользовательский фабричный класс. Эта «словесная» фабрика выдает сообщения, отслеживающие вызовы ее публичного интерфейса. Flyweight, помогая пользователю визуализировать шаблоны использования.





    Пересмотрено 14 октября 2014

    © Copyright 2006-2014 Joaquín M López Muñoz. Распространяется под лицензией Boost Software License, версия 1.0. (См. сопроводительный файлLICENSE_1_0.txtили копию на) http://www.boost.org/LICENSE_1_0.txt

    Статья Boost.Flyweight Documentation - Examples раздела Boost.Flyweight Documentation - Index может быть полезна для разработчиков на c++ и boost.




    Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



    :: Главная :: Boost.Flyweight Documentation - Index ::


    реклама


    ©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
    Top.Mail.Ru

    Время компиляции файла: 2024-08-30 11:47:00
    2025-07-04 22:17:23/0.0077450275421143/0