The traditional way of sending messages and signals have two small drawbacks.
- There is some level of verbosity in preparing and sending messages:
auto msg = std::unique_ptr< my_message >( new my_message( some_args ) );
mbox->deliver_message( std::move( msg ) );
Especially when sending a delayed messages:
auto msg = std::unique_ptr< my_message >( new my_message( some_args ) );
so_environment().single_timer( std::move( msg ), mbox, pause );
- There is a difference in sending messages and signals:
mbox->deliver_message( msg );
mbox->deliver_signal< my_signal >();
This makes template-based programming a little bit difficult.
To simplify SObjectizer usage and reduce verbosity of the code a new family of so_5::send
functions is introduced.
The simple message sending can be written as:
so_5::send< my_message >(
mbox, some_args );
It is an equivalent of:
auto msg = std::unique< my_message >( new my_message( some_args ) );
mbox->deliver_message( std::move( msg ) );
By utilizing variadic templates of C++11 the some_args
can me a sequence of arguments:
so_5::send< msg_connect >(
mbox, ip_address, ip_port, waiting_time );
The same form of so_5::send
is used for signal sending:
so_5::send< my_signal >(
mbox );
Usually it is necessary to send messages to the agent's direct mbox. So instead of writing:
so_5::send< msg >( agent.so_direct_mbox(), ... );
it is possible to use so_5::send_to_agent
function:
so_5::send_to_agent< msg >( agent, ... );
There are so_5::send_delayed
functions for sending delayed messages/signals:
so_5::send_delayed< my_message >(
mbox, pause, some_args );
so_5::send_delayed< my_signal >(
mbox, pause );
There are so_5::send_delayed_to_agent
functions for sending delayed messages/signals to an agent's direct mbox:
so_5::send_delayed_to_agent< my_message >( agent, pause, some_args );
so_5::send_delayed_to_agent< my_signal >( agent, pause );
There also are so_5::send_periodic
functions for sending periodic messages/signals:
so_5::send_periodic< my_message >(
mbox, pause, period, some_args );
so_5::send_delayed< my_signal >(
mbox, pause, period );
There are so_5::send_periodic_to_agent
functions for sending periodic messages/signals to an agent's direct mbox:
so_5::send_periodic_to_agent< my_message >( agent, pause, period, some_args );
so_5::send_periodic_to_agent< my_signal >( agent, pause, period );