вторник, 10 февраля 2009 г.

Boost 1.38.0

Вот и вышла следующая версия Boost 1.38.0. После беглого взгляда добавили не очень то много, но зато поправили достаточно изрядно. Впрочем для меня интересным введением была библиотека Flyweight. Как раз сейчас пытаюсь применить ее как решение к некоторым задачам. Тесты на производительности и занимаемую память обнадеживают.

Так же интересным введением стала ScopeExit. Достаточно странный макрос на первый взгляд. Обычные смарт-поинтеры при высвобождении делают одну операцию - delete, но как отмечается в документации бывает накладно каждый раз писать класс, который принимает и как-то высвобождает ресурс. К примеру, хендл на файл (закрыть при исключении), хранилище объектов, которое возвращается в предыдущее состояние если какая-либо операция не удалась. Библиотека предлагает обойтись одним лишь макросом, которые встраивается прямо в функцию, которая испольняет какую либу операцию и нуждается в откате, если в ней произошло исключение. Выглядит это примерно так:
void Container::insert(Object const& obj) 
{
bool commit = false;
m_vector.push_back(obj);
BOOST_SCOPE_EXIT( (&commit)(&m_vector) )
{
if(!commit)
m_vector.pop_back();
} BOOST_SCOPE_EXIT_END
// ... other operations ...
commit = true;
}

Здесь макрос создает оббертку прямо внутри функции, которая будет вызвана при выходе из функции в любой случае - через исключение и "нормальным" путем. В эту оббертку он передает ссылки на commit и m_vector, которые можно будет посмотреть/модифицировать при завершении функции. В данном примере, если дело не дошло до commit = true, то внутри BOOST_SCOPE_EXIT совершится откат на один элемент (к примеру исключение было брошено копи-конструктором класса Object). Вот так все просто и незатейливо. Стало даже интересно покопаться и посмотреть как все это реализовано, возможно идиома может быть полезна и в других задачах.

Буду писать далее, по возможности, про новые фичи и чем они могут быть полезны.

Комментариев нет:

Отправить комментарий