Файл so_4/rt/h/sol.hpp


Подробное описание

Макросы для описания классов агентов и управления подпиской событий.

Внимание:
Вместо непосредственной загрузки данного файла необходимо загружать файл so_4/rt/h/rt.hpp.


Пространства имен

namespace  so_4
namespace  so_4::rt

Макросы

#define _SO_4_RT__SOL_HPP_
#define __SOL4_CLASS_NAMESPACE_NAME(line)
#define __SOL4_CLASS_START(full_cpp_name, line)
#define SOL4_CLASS_START(full_cpp_name)
 Начало описания класса агента.
#define SOL4_CLASS_FINISH()
 Завершение описания класса агента.
#define __SOL4_SUPER_CLASS_BINDER_NAME(line)
#define __SOL4_SUPER_CLASS(name, line)
#define SOL4_SUPER_CLASS(name)
 Указание имени базового класса.
#define SOL4_MSG_START(sol_name, full_cpp_name)
 Начало описания сообщения.
#define SOL4_MSG_FINISH()
 Завершение описания сообщения.
#define SOL4_MSG_FIELD(field_name)
 Описание поля, являющегося одиночным объектом.
#define SOL4_MSG_FIELD_ARRAY(field_name)
 Описание поля, являющегося вектором.
#define SOL4_MSG_CHECKER(full_cpp_method_name)
 Описание функции проверки экземпляра сообщения.
#define SOL4_EVENT(event_name)
 Описание события.
#define SOL4_EVENT_WITH_INCIDENT_TYPE(event_name, msg_type)
 Описание события с автоматическим контролем типа инцидента.
#define SOL4_EVENT_STC(event_name, msg_type)
 Описание события с контролем типа инцидента при подписке.
#define SOL4_EVENT_WITH_FACTORY(event_name, factory)
 Описание события со специфическим внутренним представлением.
#define SOL4_STATE_START(state_name)
 Начало описания состояния.
#define SOL4_STATE_EVENT(event_name)
 Событие, разрешенное к обработке в состоянии.
#define SOL4_STATE_ON_ENTER(method)
 Описание обработчика входа в состояние.
#define SOL4_STATE_ON_EXIT(method)
 Описание обработчика выхода из состояния.
#define SOL4_STATE_FINISH()
 Завершение описания состояния.
#define __SOL4_STATE_MERGE_VARIABLE(line)
#define __SOL4_STATE_MERGE(class_name, state_name, line)
#define SOL4_STATE_MERGE(class_name, state_name)
 Указание того, что содержимое состояние должно быть слито с содержимым указанного состояния.
#define __SOL4_STATE_EXCLUDE_EVENT_VARIABLE(line)
#define __SOL4_STATE_EXCLUDE_EVENT(event_name, line)
#define SOL4_STATE_EXCLUDE_EVENT(event_name)
 Изъятия из списка разрешенных событий указанного события.
#define SOL4_CHANGE_STATE_NOTIFY()
 Указание рассылать сообщение so_msg_state при смене состояния агента.
#define SOL4_INITIAL_STATE(name)
 Указание имени начального состояния агента.
#define SOL4_SUBSCR_EVENT_START(event_name, priority)
 Начало подписки события.
#define SOL4_SUBSCR_EVENT_MSG_SELF(message)
 Подписать событие на собственное сообщение агента.
#define SOL4_SUBSCR_EVENT_MSG(agent, message)
 Подписать событие на сообщение агента.
#define SOL4_SUBSCR_EVENT_FINISH()
 Завершение подписки события.
#define SOL4_SUBSCR_EVENT_FINISH_CERR()
 Завершение подписки события с печатью ошибок в cerr.

Функции

Функции для вызова метода-события в зависимости от его формата.
template<class A, class A2>
void so_4::rt::call_event (A *a, void(A2::*evt)(), const event_data_t &e)
template<class A, class A2>
void so_4::rt::call_event (A *a, void(A2::*evt)(const event_data_t &), const event_data_t &e)
template<class A, class A2, class M>
void so_4::rt::call_event (A *a, void(A2::*evt)(const event_data_t &, const M *), const event_data_t &e, const M *m)
template<class A, class A2, class M>
void so_4::rt::call_event (A *a, void(A2::*evt)(const event_data_t &, const M &), const event_data_t &e, const M *m)
template<class A, class A2, class M>
void so_4::rt::call_event (A *a, void(A2::*evt)(const M *), const event_data_t &e, const M *m)
template<class A, class A2, class M>
void so_4::rt::call_event (A *a, void(A2::*evt)(const M &), const event_data_t &e, const M *m)


Макросы

 
#define SOL4_CHANGE_STATE_NOTIFY (  ) 

Указание рассылать сообщение so_msg_state при смене состояния агента.

Делает агента владельцем сообщения с именем "so_msg_state", реализуемого типом so_4::rt::so_msg_state.

Внимание:
макрос предписывает осуществлять рассылку сообщений только о тех состояниях, которые были описаны перед макросом SOL4_CHANGE_STATE_NOTIFY. Например, в случае:
	SOL4_STATE_START( st_1 )
	SOL4_STATE_FINISH()

	SOL4_STATE_START( st_2 )
	SOL4_STATE_FINISH()

	SOL4_CHANGE_STATE_NOTIFY()

	SOL4_STATE_START( st_3 )
	SOL4_STATE_FINISH()
	
сообщение об изменении состояния будет рассылаться только, если агент входит в состояние st_1 или st_2, но не будет рассылаться, если агент входит в состояние st_3.
Примеры:
sample/chstate/main.cpp.

 
#define SOL4_CLASS_FINISH (  ) 

#define SOL4_CLASS_START ( full_cpp_name   ) 

Начало описания класса агента.

Описание класса агента завершается макросом SOL4_CLASS_FINISH().

В описании класса агента могут перечисляться сообщения агентов данного класса (SOL4_MSG_START(), SOL4_MSG_FINISH()); события (SOL4_EVENT()), состояния (SOL4_STATE_START(), SOL4_STATE_FINISH()). Так же может использоваться макрос SOL4_CHANGE_STATE_NOTIFY().

Аргументы:
full_cpp_name имя С++ класса который реализует агентов данного класса. С одной стороны -- это должно быть корректное C++ имя (с учетом пространств имен, областей видимости и т.д.). С другой стороны -- это имя будет именем класса агентов в словаре SObjectizer-а и, поэтому, должно быть уникальным именем.
Примеры:
sample/chstate/main.cpp, sample/destroyable_traits/main.cpp, sample/dyn_coop_controlled/main.cpp, sample/dyn_reg/main.cpp, sample/filter/c1.cpp, sample/filter/c1i.cpp, sample/filter/c2.cpp, sample/filter/c2i.cpp, sample/filter/server.cpp, sample/hello_all/main.cpp, sample/hello_delay/main.cpp, sample/hello_periodic/main.cpp, sample/hello_world/main.cpp, sample/high_traffic/client.cpp, sample/high_traffic/common.cpp, sample/high_traffic/server.cpp, sample/inheritance/main.cpp, sample/parent_insend/main.cpp, sample/qt_ring/main.cpp, sample/qt_ui/main.cpp, sample/raw_channel/tcp_cln.cpp, sample/raw_channel/tcp_srv.cpp и sample/subscr_hook/main.cpp.

#define SOL4_EVENT ( event_name   ) 

Описание события.

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

void  A::evt();
void  A::evt( const event_data_t & );

Аргументы:
event_name имя события, которое существует у агентов данного типа. В C++ классе, реализующем агента, должен быть доступный (public), не статический метод с именем event_name.
Примеры:
sample/chstate/main.cpp, sample/destroyable_traits/main.cpp, sample/dyn_coop_controlled/main.cpp, sample/dyn_reg/main.cpp, sample/filter/c1.cpp, sample/filter/c2.cpp, sample/filter/server.cpp, sample/hello_all/main.cpp, sample/hello_delay/main.cpp, sample/hello_periodic/main.cpp, sample/hello_world/main.cpp, sample/high_traffic/client.cpp, sample/inheritance/main.cpp, sample/parent_insend/main.cpp, sample/qt_ring/main.cpp, sample/qt_ui/main.cpp и sample/subscr_hook/main.cpp.

#define SOL4_EVENT_STC ( event_name,
msg_type   ) 

Описание события с контролем типа инцидента при подписке.

Начиная с:
v.4.2.6
Предназначен для описания обработчиков событий, имеющих один из следующих форматов:
void  A::evt_handler(
  const so_4::rt::event_data_t &,
  const M * cmd );
void  A::evt_handler(
  const so_4::rt::event_data_t &,
  const M & cmd );
void  A::evt_handler(
  const M * cmd );
void  A::evt_handler(
  const M & cmd );

При подписке данного события будет проверена совместимость реального типа инцидента и разрешенного типа инцидента. Если реальный тип инцидента окажется не совместимым, то подписка события окажется неудачной.

Отличие этого макроса от макроса SOL4_EVENT_WITH_INCIDENT_TYPE() состоит в том, что описываемые с помощью этого макроса обработчики константный указатель (ссылка) на инцидент.

Заметки:
Ипользование данного макроса предпочтительнее использования макроса SOL4_EVENT_WITH_INCIDENT_TYPE().
Аргументы:
event_name имя события, которое существует у агентов данного типа. В C++ классе, реализующем агента, должен быть доступный (public), не статический метод с именем event_name.
msg_type имя C++ класса, реализующего инцидента данного события.
Примеры:
sample/chstate/main.cpp, sample/dyn_reg/main.cpp, sample/filter/c1.cpp, sample/filter/c2.cpp, sample/filter/server.cpp, sample/hello_all/main.cpp, sample/hello_periodic/main.cpp, sample/high_traffic/server.cpp, sample/inheritance/main.cpp, sample/parent_insend/main.cpp, sample/qt_ring/main.cpp, sample/qt_ui/main.cpp, sample/raw_channel/tcp_cln.cpp и sample/raw_channel/tcp_srv.cpp.

#define SOL4_EVENT_WITH_FACTORY ( event_name,
factory   ) 

Описание события со специфическим внутренним представлением.

Для каждого события внутри SObjectizer-а создается внутренне представление, определяющее логику обработки сообытия. В большинстве случаев используется "общая" логика обработки события. Но в некоторых случаях (например, для поддержки SOP) необходимо применять "специфическую" логику. Для этих случаев предназначен макрос SOL4_EVENT_WITH_FACTORY.

Заметки:
часть внутренней реализации SObjectizer-а.
Аргументы:
event_name имя события, которое существует у агентов данного типа. В C++ классе, реализующем агента, должен быть доступный (public), не статический метод с именем event_name.
factory создатель объекта, отвечающего за специфическое внутреннее представление события.

#define SOL4_EVENT_WITH_INCIDENT_TYPE ( event_name,
msg_type   ) 

Описание события с автоматическим контролем типа инцидента.

Предназначен для описания обработчиков событий, имеющих один из следующих форматов:

void  A::evt_handler(
  const so_4::rt::event_data_t &,
  const msg_type * cmd );
void  A::evt_handler(
  const so_4::rt::event_data_t &,
  msg_type * cmd );

При подписке данного события будет проверена совместимость реального типа инцидента и разрешенного типа инцидента. Если реальный тип инцидента окажется не совместимым, то подписка события окажется неудачной.

Внимание:
Данный макрос оставлен в неизменном виде для обеспечения совместимости с написанным ранее кодом обработчиков, которые оперировали неконстантным указателем на инцидент:
void  A::evt_handler(
  const so_4::rt::event_data_t &,
  msg_type * cmd );
Аргументы:
event_name имя события, которое существует у агентов данного типа. В C++ классе, реализующем агента, должен быть доступный (public), не статический метод с именем event_name.
msg_type имя C++ класса, реализующего инцидента данного события.
Примеры:
sample/high_traffic/client.cpp.

#define SOL4_INITIAL_STATE ( name   ) 

Указание имени начального состояния агента.

Если класс ничего не наследует, то начальным состоянием агентов этого класса будет первое из описанных в классе состояний. При наличии наследования, особенно множественного, необходимо явно указывать, какое состояние является начальным для агентов данного класса. Макрос SOL4_INITIAL_STATE() предназначен для того, чтобы указать имя начального состояния.

В описании класса должно быть указано только одно стартовое состояние.

Имя указываемого в SOL4_INITIAL_STATE() состояния может быть именем унаследованого состояния.

Внимание:
Применение SOL4_INITIAL_STATE даже для описаний классов без наследования является крайне желательным. Применение SOL4_INITIAL_STATE в большистве случаев с наследованием (множественое, при определении собственных состояний в производных классах) является обязательным. Класс будет считаться некорректным в случае можественного наследования, даже если только один из базовых классов имеет состояния.
Принцип определения начального состояния, если оно явно не указано
Если общий (с учетом унаследованных) список состояний не пуст:
  • если нет наследования, то начальным состоянием является первое из описанных в классе состояний;
  • если применяется одиночное наследование и класс не имеет собственных состояний, то начальным является начальное состояние базового класса;
  • в остальных случаях класс считается некорректным.
Пример:
SOL4_CLASS_START( connect::a_tcp_connect_t )
  SOL4_SUPER_CLASS( connect::a_base_connect_t )

  SOL4_INITIAL_STATE( st_not_connected )
SOL4_CLASS_FINISH()
Аргументы:
name - простой С++ идентификатор, имя стартового состояния.
Начиная с:
2003.02.14
Примеры:
sample/inheritance/main.cpp.

#define SOL4_MSG_CHECKER ( full_cpp_method_name   ) 

Описание функции проверки экземпляра сообщения.

Указанная функция будет использоваться для проверки корректности экземпляра сообщения.

Аргументы:
full_cpp_method_name полное имя C++ функции или статического метода. Имя должно быть корректным именем с учетом пространств имен и области видимости.
Примеры:
sample/hello_all/main.cpp, sample/hello_periodic/main.cpp, sample/high_traffic/common.cpp, sample/parent_insend/main.cpp и sample/qt_ui/main.cpp.

#define SOL4_MSG_FIELD ( field_name   ) 

Описание поля, являющегося одиночным объектом.

Описывает поле-одиночный объект для SOP. Поле должно иметь один из типов: char, unsigned char, signed char, short, unsigned short, int, unsigned int, float, double, std::string, so_4::rt::comm_buf_t.

Для описанного подобным образом поля можно установить значение при отправке сообщения средствами SOP.

Внимание:
Поле должно быть доступным (public) атрибутом типа, реализующего сообщения.
Аргументы:
field_name имя поля сообщения.
Примеры:
sample/hello_all/main.cpp, sample/high_traffic/common.cpp и sample/qt_ui/main.cpp.

#define SOL4_MSG_FIELD_ARRAY ( field_name   ) 

Описание поля, являющегося вектором.

Описывает поле-вектор для SOP. Поле должно иметь один из типов: char, unsigned char, signed char, short, unsigned short, int, unsigned int, float, double.

Для описанного подобным образом поля можно установить значение при отправке сообщения средствами SOP.

Внимание:
Поле должно быть доступным (public) атрибутом типа, реализующего сообщения.
Аргументы:
field_name имя поля сообщения.

 
#define SOL4_MSG_FINISH (  ) 

#define SOL4_MSG_START ( sol_name,
full_cpp_name   ) 

Начало описания сообщения.

Описание сообщения завершается макросом SOL4_MSG_FINISH().

Описание сообщения может содержать описания полей (SOL4_MSG_FIELD(), SOL4_MSG_FIELD_ARRAY()) и функции проверки корректности экземпляра сообщения (SOL4_MSG_CHECKER()).

Аргументы:
sol_name имя сообщения в SObjectizer-е. Должно быть корректным, простым C++ идентификатором.
full_cpp_name имя C++ типа (класса или структуры), объекты которого будут являться экземплярами данного сообщения. SObjectizer предполагает, что экземпляр сообщения относится к данному типу или производному от данного типа типу. full_cpp_name должно быть корректным C++ именем (с учетом пространств имен и области видимости).
Примеры:
sample/chstate/main.cpp, sample/dyn_reg/main.cpp, sample/filter/c1.cpp, sample/filter/c1i.cpp, sample/filter/c2i.cpp, sample/hello_all/main.cpp, sample/hello_delay/main.cpp, sample/hello_periodic/main.cpp, sample/high_traffic/client.cpp, sample/high_traffic/common.cpp, sample/inheritance/main.cpp, sample/parent_insend/main.cpp, sample/qt_ring/main.cpp, sample/qt_ui/main.cpp и sample/subscr_hook/main.cpp.

#define SOL4_STATE_EVENT ( event_name   ) 

Событие, разрешенное к обработке в состоянии.

Должен использоваться только внутри макросов SOL4_STATE_START(), SOL4_STATE_FINISH().

Внимание:
событие должно быть предварительно описано посредством макроса SOL4_EVENT().
Аргументы:
event_name имя события.
Примеры:
sample/chstate/main.cpp, sample/destroyable_traits/main.cpp, sample/dyn_coop_controlled/main.cpp, sample/dyn_reg/main.cpp, sample/filter/c1.cpp, sample/filter/c2.cpp, sample/filter/server.cpp, sample/hello_all/main.cpp, sample/hello_delay/main.cpp, sample/hello_periodic/main.cpp, sample/hello_world/main.cpp, sample/high_traffic/client.cpp, sample/high_traffic/server.cpp, sample/inheritance/main.cpp, sample/parent_insend/main.cpp, sample/qt_ring/main.cpp, sample/qt_ui/main.cpp, sample/raw_channel/tcp_cln.cpp, sample/raw_channel/tcp_srv.cpp и sample/subscr_hook/main.cpp.

#define SOL4_STATE_EXCLUDE_EVENT ( event_name   ) 

Изъятия из списка разрешенных событий указанного события.

Начиная с:
v.4.2.7 Подробнее см. so_4: Версия 4.2.7. Слияние содержимого состояний.

 
#define SOL4_STATE_FINISH (  ) 

#define SOL4_STATE_MERGE ( class_name,
state_name   ) 

Указание того, что содержимое состояние должно быть слито с содержимым указанного состояния.

Начиная с:
v.4.2.7 Подробнее см. so_4: Версия 4.2.7. Слияние содержимого состояний.
Примеры:
sample/inheritance/main.cpp.

#define SOL4_STATE_ON_ENTER ( method   ) 

Описание обработчика входа в состояние.

Может быть указано несколько обработчиков входа в состояние. Порядок, в котором обработчики будут вызываться при входе в состоянии не определен.

Аргументы:
method имя доступного (public), не статического метода C++ класса, реализующего агента. Этот метод будет вызываться при входе в состояние.
Примеры:
sample/chstate/main.cpp и sample/inheritance/main.cpp.

#define SOL4_STATE_ON_EXIT ( method   ) 

Описание обработчика выхода из состояния.

Может быть указано несколько обработчиков выхода из состояния. Порядок, в котором обработчики будут вызываться при выходе из состояния не определен.

Аргументы:
method имя доступного (public), не статического метода C++ класса, реализующего агента. Этот метод будет вызываться при выходе из состояния.
Примеры:
sample/chstate/main.cpp.

#define SOL4_STATE_START ( state_name   ) 

Начало описания состояния.

Описание состояния завершается макросом SOL4_STATE_FINISH().

Описание состояния может содержать описания событий, разрешенных к обработке в данном состоянии (SOL4_STATE_EVENT()), и функций обработки входа и выхода в состояние. (SOL4_STATE_ON_ENTER(), SOL4_STATE_ON_EXIT()).

Аргументы:
state_name имя состояния агента в SObjectizer-е. Должно быть корректным, простым C++ идентификатором.
Примеры:
sample/chstate/main.cpp, sample/destroyable_traits/main.cpp, sample/dyn_coop_controlled/main.cpp, sample/dyn_reg/main.cpp, sample/filter/c1.cpp, sample/filter/c2.cpp, sample/filter/server.cpp, sample/hello_all/main.cpp, sample/hello_delay/main.cpp, sample/hello_periodic/main.cpp, sample/hello_world/main.cpp, sample/high_traffic/client.cpp, sample/high_traffic/server.cpp, sample/inheritance/main.cpp, sample/parent_insend/main.cpp, sample/qt_ring/main.cpp, sample/qt_ui/main.cpp, sample/raw_channel/tcp_cln.cpp, sample/raw_channel/tcp_srv.cpp и sample/subscr_hook/main.cpp.

 
#define SOL4_SUBSCR_EVENT_FINISH (  ) 

Завершение подписки события.

Подписка события должна быть начата макросом SOL4_SUBSCR_EVENT_START.

В своей реализации обращается к so_4::api::subscribe_event(). Код возврата subscribe_event игнорируется. Поэтому нет возможности определить, успешно ли выполнена подписка.

Параметр subscr_flag функции subscribe_event устанавливается равным so_4::rt::evt_subscr_t::e_change_all.

 
#define SOL4_SUBSCR_EVENT_FINISH_CERR (  ) 

Завершение подписки события с печатью ошибок в cerr.

Подписка события должна быть начата макросом SOL4_SUBSCR_EVENT_START.

В своей реализации обращается к so_4::api::subscribe_event(). Если код возврата subscribe_event отличен от 0, то код возврата отображается в cerr.

Параметр subscr_flag функции subscribe_event устанавливается равным so_4::rt::evt_subscr_t::e_change_all.

Используется в so_4::rt::comm::a_channel_processor_base_t::so_on_subscription().

#define SOL4_SUBSCR_EVENT_MSG ( agent,
message   ) 

Подписать событие на сообщение агента.

Аргументы:
agent строковое имя агента-владельца сообщения или выражение, возвращающее строку (например, "a_main" или sobjectizer_agent_name()).
message строковое имя сообщения (например, "msg_start").

Используется в so_4::rt::comm::a_channel_processor_base_t::so_on_subscription().

#define SOL4_SUBSCR_EVENT_MSG_SELF ( message   ) 

Подписать событие на собственное сообщение агента.

Аргументы:
message строковое имя сообщения (например, "msg_start").

Используется в so_4::rt::comm::a_channel_processor_base_t::so_on_subscription().

#define SOL4_SUBSCR_EVENT_START ( event_name,
priority   ) 

Начало подписки события.

Внимание:
должен применяться только внутри не статических методов C++ класса, реализующего агента.
Подписка события завершается макросом SOL4_SUBSCR_EVENT_FINISH() или SOL4_SUBSCR_EVENT_FINISH_CERR().

Между макросами SOL4_SUBSCR_EVENT_START и SOL4_SUBSCR_EVENT_FINISH* могут использоваться макросы SOL4_SUBSCR_EVENT_MSG() и/или SOL4_SUBSCR_EVENT_MSG_SELF().

Аргументы:
event_name имя подписываемого события. Это имя, которое было использовано в макросе SOL4_EVENT().
priority приоритет события. Целое число. Ограничения на приоритет устанавливаются конкретным диспетчером.

Используется в so_4::rt::comm::a_channel_processor_base_t::so_on_subscription().

#define SOL4_SUPER_CLASS ( name   ) 

Указание имени базового класса.

При указании имени базового класса не обязательно, чтобы указываемое C++ имя было известно в текущей области видимости.

Пример:
SOL4_CLASS_START( connect::a_tcp_connect_t )
  SOL4_SUPER_CLASS( connect::a_base_connect_t )
SOL4_CLASS_FINISH()

SOL4_CLASS_START( trx::a_abstract_trx_t )
  ...
SOL4_CLASS_FINISH()

SOL4_CLASS_START( trx::a_change_amount_trx_t )
  SOL4_SUPER_CLASS( trx::a_abstract_trx_t )
SOL4_CLASS_FINISH()
Начиная с:
2003.02.10
Аргументы:
name - С++ идентификатор базового класса (возможно составной идентификатор).
Примеры:
sample/inheritance/main.cpp.


Документация по SObjectizer v.4.4 'Тебуломста'. Последние изменения: Thu Sep 18 10:26:47 2008. Создано системой  doxygen1.5.6 Intervale SourceForge.net Logo