пятница, 18 декабря 2015 г.

[prog.c++11] SObjectizer обновился до версии 5.5.14

Состоялся релиз версии 5.5.14. Подробнее об изменениях под катом. Но сначала хотелось бы поделиться мыслями о том, что будет дальше. Не уверен, что следующая версия SO-5 выйдет так же быстро, как это происходило в последнее время. Если только не появится какая-то идея, простая в реализации, но дающая серьезную выгоду. Пока же таких идей нет :)

А так в планах на ближайшие три-четыре-пять недель следующее:

  • подготовка презентации об опыте использования SObjectizer-а и извлеченных из этого опыта уроках (вроде кому-то эта тема интересна);
  • эксперименты по интеграции SObjectizer-а в GUI-приложения посредством использования механизма mchain-ов;
  • подготовка еще одной, может быть двух, презентаций для серии Deep Dive into SObjectizer-5.5. По крайней мере нужно рассказать подробнее о диспетчерах. Ну и об mchain-ах, если получится;
  • проработка двух больших фич для следующих версий SO-5: возможность представления агентов в виде иерархических конечных автоматов (с историческими состояниями, с реакциями на вход-выход и т.д.) и возможность использования в диспетчерах преаллоцированных буферов в качестве очередей сообщений (при этом экземпляр сообщения не создается динамически, как сейчас, а конструируется in-place в буфере диспетчера). Имхо, фичи очень важные, особенно для определенных классов задач. Но пока понятные для меня лишь в общих чертах. Так что здесь еще над чем подумать. Если кому-то интересно, то приглашаю присоединиться к обсуждению;

В общем планов много, так что даже не знаю, когда ждать 5.5.15 и 5.6.0. Вряд ли раньше января, а то и февраля.

Ну а теперь чуть подробнее о релизе 5.5.14...

С момента добавления в SO-5 возможности задавать обработчики событий в виде лямбда-функций возникла некоторая дискриминация по типам обработчиков. Если обработчик представлял из себя обычный нестатический метод класса, то он мог получать сообщение-инцидент в виде обертки event_data_t<MSG>. А это оказывалось полезно в двух случаях. Во-первых, если нужно было переслать этот же самый экземпляр сообщения кому-то еще. Метод event_data_t::make_reference возвращал умный указатель на экземпляр сообщения и этот указатель можно было передать в deliver_message. Во-вторых, обработчики событий с аргументом типа event_data_t<MSG> имели одинаковый формат и когда MSG был типом сообщения, и когда MSG был типом сигнала. Это серьезно упрощало определение обработчиков событий внутри шаблонов.

В то же время, обработчики событий в виде лямбда-функций не имели возможности получать сообщения в виде обертки event_data_t<MSG>. Что оказалось не очень хорошо, особенно при активном использовании шаблонов, т.к. внутри шаблонов очень часто обработчики событий определялись именно лямбда-функциями.

Более того, ситуация стала еще запутаннее, когда в версии 5.5.9 появилась возможность отсылать в качестве сообщений объекты произвольных типов, без их обязательного наследования от so_5::message_t. Так, можно было отослать std::string в качестве сообщения, но обработать его в виде event_data_t<std::string> было нельзя, т.к. event_data_t ожидал получить наследника message_t.

Версия 5.5.14 устраняет этот зоопарк несовместимых между собой форматов. Теперь любой обработчик событий (будь то нестатический метод класса или лямбда-функция) может иметь один из следующих форматов:

// Длинные форма, применимые как для сообщений, так и для сигналов.
return_type handler( so_5::mhood_t< message_type > );
return_type handler( const so_5::mhood_t< message_type > & );

// Короткая форма только для обработчиков сообщений.
// Выгодна для случаев, когда message_type слишком дорогой для копирования тип.
return_type handler( const message_type & );

// Короткая форма только для обработчиков сообщений.
// Выгодна для случаев, когда message_type дешевый для копирования тип (например, int или long).
return_type handler( message_type );

// Короткая форма только для обработчиков сигналов.
return_type handler();

Класс mhood_t может возвратить умный указатель на экземпляр сообщения даже если типом сообщения является произвольный пользовательский тип, не унаследованный от message_t. Это дает возможность переадресовывать сообщения произвольных типов, чего до версии 5.5.14 не было.

Кроме того, сейчас имя event_data_t -- это всего лишь псевдоним для mhood_t, так что особых проблем с переходом на версию 5.5.14 быть не должно.

Полный список изменений можно увидеть здесь.

Взять версию 5.5.14 можно с SourceForge, либо в виде архивов в секции Files, либо из Subversion-репозитория, или из зеркала на GitHub.

Прошу учесть, что на SF.net теперь выкладывается всего три zip-овских архива: с исходниками и с бинарниками (x86, x64) скомпилированными посредством VC++ 14.0 update1. Если кому-то нужны другие архивы (например, бинарники собранные VC++12.0), дайте знать -- сделаем и выложим.

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