17 января 2009

Different libraries

На новогодних праздниках нашлось время посмотреть разные C++ библиотеки. А то несправедливо — люди во всю стараются, делают всякие удобные, мощные, гибкие, быстрые и стабильные библиотеки со вкусными лицензиями, а я тут сижу велосипеды изобретаю.

Краткий список того, что нашел для себя интересного.

Futures
В C++0x будет замечательная вещь — futures. Коротко говоря — это лениво-вычисляемые функции. Причем их можно "отправить" вычисляться на другой тред, а потом просто забрать результат. А еще можно организовать обмен сообщениями между тредами. Парочка реализаций futures уже предлагается для включения в Boost, в том числе и версия от Anthony Williams, по которой и писался стандарт C++0x в части futures (доступна также полностью соответствующая стандарту C++0x библиотека threads).

Boost.MPI
Библиотека для взаимодействия между процессами с крайне удобным интерфейсом. Приведенные примеры использования вдохновляют.

Any Iterator
Давно подумывал написать обертку для итераторов, которая преобразует статический полиморфизм STL-ных итераторов в динамический. Например, если вы хотите иметь интерфейс с парочкой виртуальных функций RangeBegin() и RangeEnd(), то какой тип они будут возвращать? std::vector<T>::iterator или std::list<T>::iterator? Или даже boost::transform_iterator<...>? Вам не нужно знать какой конкретно тип итераторов будет использовать та или иная реализация интерфейса. Вместо этого вы делаете тип возвращаемого значения RangeBegin() и RangeEnd() как any_iretator<T>, а внутри реализации автоматически преобразовываете свой std::deque<T>::iterator или my::whatever<T>::iterator к этому типу. Подробнее — в статье, там же ссылка на саму библиотеку.

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

unique_ptr
Для тех кто уже понял чем unique_ptr лучше auto_ptr (первый заменяет собою второй в C++0x), но еще пользуется компиляторами без поддержки C++0x — готовая библиотека эмуляции unique_ptr. Да, кстати, а в Boost будет эмуляция rvalues для "старых" компиляторов.

Traversal
Boost.Iterators предоставляют хорошие возможности по трансформации итераторов, однако по иерархическим структурам с помощью них бегать достаточно трудновато. Как-то я писал STL-style итераторы для MS XML и MS DOM, так вот там бы пригодилась новая библиотека Traversal — позволяет итерироваться по иерархиям.

4 комментария:

Анонимный комментирует...

Большое спасибо за полезную информацию. К сожалению, just::thread скачать бесплатно нельзя :(.

Raider комментирует...

Да, just::tread платная. А futures из нее - бесплатные (по boost license).

Alex Ott комментирует...

посмотрите еще на Join и Channel с http://channel.sourceforge.net/
для баз данных хороша soci - http://soci.sf.net
а asio уже используете? :-)
а так, последние впечатления - в язык тащут слишком многое, что его сильно усложняет не давая реально слишком большого выигрыша. для lazy evaluation тогда уж лучше использовать haskell или другой ФП язык, благо они сейчас по быстродействию подтягиваются к С++

Raider комментирует...

Asio пока не использую - в текущих проектах все на wininet.

Декларативное программирование вовсю использую и всех коллег к нему склоняю. Но не через готовый ФП-язык, а по схеме: создать мини-язык под конкретную задачу, написать для него интерпретатор на C++. Вот для последнего как правило и помогают всякие lazy evaluation библиотеки и т.п. ;)