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

MultiIndex and Bimap

Boost , Chapter 1. Boost.Bimap , History

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

PrevUpHomeNext

Это тот разговор, который начался во время Boost. Формальный обзор PropertyTree. Обзор был очень интересным, и были затронуты очень глубокие темы. Это очень интересно, и сейчас это часть истории библиотеки. Наслаждайтесь!

Самым большим достоинством property_tree является простой в использовании интерфейс. Если мы попытаемся сделать его родовым деревом, он будет скомпрометирован.

Я имею в виду, почему мне нужно это полуиспеченное дерево как другая структура данных? Дерево собственности само по себе ничего не поддерживает. Это всего лишь структура данных. У вас есть парсеры, которые производят дерево собственности из разных источников. Но вы также создаете карты или что-то еще. Вот, например, все, что мне нужно сделать, чтобы «внедрить» такую же функциональность, как ваше дерево свойств:

// Data structure itself
template<typename ValueType,typename KeyType>
struct Node;
template<typename ValueType,typename KeyType>
struct ptree_gen {
    typedef std::pair<KeyType,Node<ValueType,KeyType> > mi_value;
    typedef multi_index_container<mi_value, indexed_by<...> > type;
};
template<typename ValueType,typename KeyType>
struct Node {
    ValueType v;
    ptree_gen<ValueType,KeyType>::type children;
};
// serialization support
template<class Archive,typename ValueType,typename KeyType>
void serialize(Archive & ar, Node<ValueType,KeyType>& n,
               const unsigned int version)
{
    ar & n.v;
    ar & n.children;
}
// some access methods
template<typename ValueType,typename KeyType>
ValueType const&
get( string const& keys, ptree_gen<ValueType,KeyType>::type const& src )
{
    std::pait<string,string> sk = split( keys, "." );
    Node const& N = src.find( sk.first );
    return sk.second.empty() ? N.v : get( sk.second, N.children );
}

ptree_gen<string,string>::type PT;
boost::archive::text_iarchive ia( std::ifstream ifs("filename") );
ia >> PT;
string value = get( "a.b.c.d", PT );

Торстен

То, что вы только что реализовали, является упрощенной версией property_tree, которая, среди прочего, не позволяет создавать редактируемые человеком XML-файлы. Теперь добавьте больше интерфейса (aka get functions), добавьте больше архивов в lib сериализации, добавьте кастомизацию, добавьте прозрачный перевод из строк в произвольные типы и наоборот. Проведите несколько недель, пытаясь исправить все угловые случаи, а затем еще несколько недель, пытаясь сгладить грубые края в интерфейсе. Затем напишите тесты. Пишите документы. В конце концов, я думаю, вы не получите гораздо меньше кода, чем в библиотеке уже есть. Вы можете сэкономить, используя мультииндекс вместо ручной индексации.

Хотя дерево имеет большой интерфейс со многими функциями, изменяющими состояние дерева, оно использует подход «единой точки изменения». Каждая вставка в конечном итоге проходит через одну функцию, которая заботится о безопасности исключений и синхронизации индекса с данными. То же самое относится и к стиранию. Эта функция имеет 9 строк кода в случае вставки, и (по совпадению) также 9 в случае стирания. При использовании мульти-индекса эти функции, очевидно, будут упрощены, возможно, до 4 строк каждая. Чистая прибыль: 10 строк кода (из нескольких сотен в ptree_implementation.hpp).

Я знаю, что есть прирост производительности, но в то время я сосредоточился на том, чтобы сделать интерфейс правильным.

Дэйв

Торстен

Я думаю, что важно сосредоточиться на интерфейсе в обзоре, но я также вижу несколько преимуществ реализации, которая основывается на Boost. MultiIndex:

Я еще не использовал опции программы. Но если я правильно понимаю, обе библиотеки поддерживают хранение и доступ к данным со строками, которые могут описывать какую-то иерархию. Это, кажется, основная идея обеих библиотек - это правильно?

Что я сам использовал вашу библиотеку дерева свойств для чтения и записи файла конфигурации. Это действительно было очень легко использовать. Однако было бы еще проще, если бы это было что-то, что я знал раньше, например, итератор. На данный момент я определенно буду использовать вашу библиотеку дерева свойств, но я был бы признателен, если бы существующие концепции были повторно использованы многими разработчиками C++. Я считаю, что ваша библиотека должна быть частью Boost, но должна быть более обобщенной в будущем.

Торстен

Павел

Торстен

Правильно, но реальная ценность приходит, когда кто-то разрабатывает хороший STL-подобный интерфейс и пишет документы и т. Д., По крайней мере, это было моей точкой зрения.

Дэйв

ИМО Торстен совершенно прав. Это именно то, что можно добавить в библиотеку в рамках ее текущего обслуживания и развития (без обзора, конечно).

Хоакин

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

Если есть такой доброволец, я могу оказать ей помощь/наставничество. Мне также интересно, подходит ли эта задача для Google Summer of Code.

Торстен

Я думаю, что это было бы хорошо для SOC. B.MI заботится обо всех действительно трудных вещах, и поэтому для студента представляется разумным заполнить детали.

Дэйв

Джефф

Пожалуйста, напишите предложение!

Хоакин

Я только что это сделал:

<And then... after long hours of coding (and fun) this library saw the light.>

boost.bimap.logo


PrevUpHomeNext

Статья MultiIndex and Bimap раздела Chapter 1. Boost.Bimap History может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: History ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 03:18:17/0.0072391033172607/0