Название интерфейсной государственной машины. Возможны все три фронтенда.
HistoryPolicy
Желаемая история. Это могут быть: AlwaysHistory, NoHistory, ShallowHistory. Дефолт — это история.
CompilePolicy
Производительность / время компиляции. Существуют две предопределенные политики: favor_runtime_speed и favor_compile_time. По умолчанию это favor_runtime_speed, лучшая производительность, более длительное время компиляции. См. backend.
methods
start
Методы запуска должны быть вызваны до любого вызова на process_event. Он активирует входное действие начального состояния (состояний). Это позволяет выбрать, когда может начаться государственная машина. См. backend.
void start();
process_event
Метод обработки событий реализует двойную отправку. Каждый вызов этой функции с новым типом события инстанцирует новый алгоритм отправки и увеличивает время компиляции.
Возвращает идентификаторы ныне активных государств. Обычно он вам понадобится только для отладки или лесозаготовки.
const int* current_state const();
get_state_by_id
Возвращает государство, которому дан Ид. Поскольку все состояния конкретной машины состояний имеют общее базовое состояние, возвращаемое значение является базовым состоянием. Если id не соответствует состоянию, возвращается нулевой указатель.
const BaseState* get_state_by_id const(int id);
is_contained
Помощник возвращается истинным, если государственная машина содержится в качестве подмашины другой государственной машины.
bool is_contained const();
get_state
Возвращает требуемое состояние машины состояния в качестве указателя. Ошибка компиляции произойдет, если состояние не будет найдено в машине состояния.
template <class State> State* get_state();
get_state
Возвращает требуемое состояние машины состояния в качестве ссылки. Ошибка компиляции произойдет, если состояние не будет найдено в машине состояния.
template <class State> State& get_state();
is_flag_active
Возвращается, если данный флаг активен. Флаг активен, если активное состояние одного региона помечено этим флагом (используя ИЛИ как BinaryOp) или активными состояниями всех регионов (используя И как BinaryOp)
Возвращается, если данный флаг активен. Флаг является активным, если активное состояние одного региона помечено этим флагом.
template <class Flag> bool is_flag_active();
visit_current_states
Посещение всех активных государств и их подгосударств. Состояние посещается с использованием метода принять без аргументации. Базовый класс всех государств должен обеспечивать accept_sig Тип.
void visit_current_states();
visit_current_states
Посещение всех активных государств и их подгосударств. Состояние посещается с помощью метода принять с аргументами. Базовый класс всех состояний должен обеспечивать тип accept_sig, определяющий подпись и, таким образом, число и тип параметров.
Отстаивает предоставленное событие. Этот способ может быть назван только в том случае, если по меньшей мере одно состояние отсрочивает событие или если машина состояния обеспечивает тип activate_deferred_events (см. пример ) либо непосредственно, либо с использованием конфигурации отложенных_events eUML (configure_ << deferred_events)
Количество ортогональных областей, содержащихся в государственной машине
entry_pt
Этот вложенный тип обеспечивает необходимую типдеф для псевдосостояний точки входа. state_machine<...>::entry_pt — действительная цель перехода внутри содержащей переходной таблицы машины состояния.
entry_pt { }
exit_pt
Этот вложенный тип обеспечивает необходимую типдеф для псевдосостояний точки выхода. state_machine<...>::exit_pt является действительным источником перехода внутри содержащей переходной таблицы машины состояния.
exit_pt { }
direct
Этот вложенный тип обеспечивает необходимую типдеф для явного входа в подмашину. state_machine<...>::direct — действительная цель перехода внутри содержащей переходной таблицы машины состояния.
direct { }
stt
Называя state_machine::stt возвращает mpl::vector, содержащий таблицу перехода государственной машины. Этот тип может быть использован с генерацией_state_set или генерацией_event_set.
args.hpp
Этот заголовок предоставляет один тип, args. который предоставляет необходимые типы для реализации посетителя.
msm/back/history_policies.hpp
Этот заголовок предоставляет политику истории, поддерживаемую MSM. Существует 3 таких политика.
Every history policy must implement the following methods:
set_initial_states
Этот метод называется msm::back::state_machine. Это дает политике шанс сохранить идентификаторы всех первоначальных государств (проходит как массив).
void set_initial_states()
;
(int* const);
history_exit
Этот метод называется msm::back::state_machine при выходе из подмашины. Это дает политике возможность вспомнить идентификаторы последних активных подсостояний этой подмашины (проходит как массив).
void history_exit(<1)
;
(int* const);
history_entry
Этот метод называется msm::back::state_machine при вводе подмашины. Это дает политике возможность установить активные государства в соответствии с целью политики. Политика получает в качестве параметра событие, активировавшее подмашину, и возвращает массив активных идентификаторов состояний.
template int*st history_exit(
;
(Event const&);
Out-of-the-box policies:
NoHistory
Эта политика по умолчанию используется в state_machine. Активное состояние подмашины не запоминается, и при каждой новой активации подмашины активируется начальное состояние (состояния).
AlwaysHistory
Эта политика является нестандартным расширением. Активное состояние (состояния) подмашины всегда запоминается при каждой новой активации подмашины.
ShallowHistory
Эта политика активирует активное состояние (состояния) подмашины, если событие находится в списке событий политики.
msm/back/default_compile_policy.hpp
Этот заголовок содержит определение favor_runtime_speed. Эта политика имеет две настройки:
Субмашины отправляются быстрее, потому что их переходы добавляются в таблицу перехода машины вместо простого пересылки событий.
Решает переходные конфликты во время компиляции
msm/back/favor_compile_time.hpp
Этот заголовок содержит определение favor_compile_time. Эта политика имеет две настройки:
Отправка субмашин происходит медленнее, потому что все события, даже те, у которых нет шансов на отправку, перенаправляются на субмашины. Взамен в содержащую переходную таблицу машины не добавляется строка, что сокращает время компиляции.
Решает конфликты переходов во время выполнения.
msm/back/metafunctions.hpp
Этот заголовок содержит метафункции для использования библиотекой. Для пользователя могут быть полезны три метафункции:
generate_state_set: генерирует список всех состояний, на которые ссылается таблица перехода stt. Если stt представляет собой рекурсивную таблицу (сгенерированную recursive_get_transition_table), метафункция находит рекурсивно все состояния подмашин. Нерекурсивную таблицу можно получить с помощью некоторого_backend_fsm::stt.
generate_event_set< stt>: генерирует список всех событий, на которые ссылается таблица переходов stt. Если stt представляет собой рекурсивную таблицу (сгенерированную recursive_get_transition_table), метафункция находит рекурсивно все события подмашин. Нерекурсивную таблицу можно получить с помощью некоторого_backend_fsm::stt.
recursive_get_transition_table: рекурсивно расширяет таблицу перехода государственной машины fsm таблицами из подмашин.
msm/back/tools.hpp
Этот заголовок содержит несколько инструментов метапрограммирования для получения некоторой информации из машины состояния.
fill_state_names
attributes
fill_state_names имеет атрибут:
char const** m_names: уже выделенный массив const char*, в котором сгенерированные типидом имена состояний машинного состояния будут witten.
fill_state_names используется в mpl::for_Every iterating in a state list and writing inside a pre-allocated array the state names. Пример:
typedef some_fsm::stt Stt;
typedef msm::back::generate_state_set<Stt>::type all_states; //states
static char const* state_names[mpl::size<all_states>::value];
// array to fill with names
// fill the names of the states defined in the state machine
mpl::for_each<all_states,boost::msm::wrap<mpl::placeholders::_1> >
(msm::back::fill_state_names<Stt>(state_names));
// display all active states
for (unsigned int i=0;i<some_fsm::nr_regions::value;++i)
{
std::cout << " -> "
<< state_names[my_fsm_instance.current_state()[i]]
<< std::endl;
}
get_state_name
attributes
get_state_name имеет атрибуты:
std::string& m_name: значение возврата итерации
int m_state_id: ид исследуемого государства
constructor
Конструктор принимает в качестве аргумента ссылку на строку для заполнения государственным именем и идентификатором, который необходимо искать.
Этот тип выполняется для того же поиска, что и в предыдущем примере, используя mpl::for_Every to iterate on states. После итерации была установлена ссылка на название штата.
// we need a fsm's table
typedef player::stt Stt;
typedef msm::back::generate_state_set<Stt>::type all_states; //all states
std::string name_of_open; // id of Open is 1
// fill name_of_open for state of id 1
boost::mpl::for_each<all_states,boost::msm::wrap<mpl::placeholders::_1> >
(msm::back::get_state_name<Stt>(name_of_open,1));
std::cout << "typeid-generated name Open is: " << name_of_open << std::endl;
display_type
attributes
ни одного
usage
Воспользовавшись списком штатов из предыдущего примера, мы можем вывести все названия штатов:
mpl::for_each >(msm::back::display_type ());
Статья Back-end раздела Meta State Machine (MSM) Part II. Reference может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.