Мы можем найти для таблицы переходов больше применений, чем мы видели до сих пор. Предположим, вам нужно написать инструмент покрытия. Государственная машина была бы идеальной для такой работы, если бы только она могла предоставить некоторую информацию о своей структуре. Благодаря переходной таблице и Boost. MPL, это так.
Что необходимо для инструмента покрытия? Вы должны знать, сколько штатов определено в государственной машине, и сколько событий может быть запущено. Таким образом, вы можете регистрировать события и состояния, посещенные в жизни конкретной машины, и быть в состоянии выполнить некоторый анализ покрытия, как “ уволил 65% всех возможных событий и посетил 80% государств, определенных в государственной машине ”. Для этого MSM предоставляет несколько полезных инструментов:
generate_state_set: возвращает mpl::set всех состояний, определенных в таблице.
generate_event_set: возвращает mpl::set всех событий, определенных в таблице.
используя mpl::size<>::value можно получить количество элементов в наборе.
display_type определяет оператор() отправки typeid(Type.name() на cout.
fill_state_names заполняет массив char const* именами всех государств (обнаруженных по типиду)
с использованием mpl::for_each на результате генерации_state_set и генерации_event_set pass display_type в качестве аргумента будут отображаться все состояния машины состояния.
Предположим, что вам нужно рекурсивно найти состояния и события, определенные в составных состояниях, и, таким образом, также иметь таблицу перехода. Назвав recursive_get_transition_table, вы получите таблицу переходов композитного состояния, рекурсивно добавив таблицы переходов всех суб-состояний и суб-суб-состояний. Затем вызовите generate_state_set или generate_event_set на результат, чтобы получить полный список состояний и событий.
Статья Metaprogramming tools раздела Meta State Machine (MSM) Chapter 6. Internals может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.