SObjectizer  5.8
Loading...
Searching...
No Matches
so_5/single_sink_binding/main.cpp
/*
* A sample of the simple case for single_sink_binding.
*/
#include <iostream>
// Main SObjectizer header files.
#include <so_5/all.hpp>
// Message that carries some data.
struct msg_data final : public so_5::message_t
{
int m_value;
msg_data( int v ) : m_value{ v } {}
};
// Agent that creates MPMC mbox and sends new msg_data to it periodically.
class data_generator final : public so_5::agent_t
{
// Signal to be used for new data generation.
struct msg_generate_next final : public so_5::signal_t {};
// Mbox to be used for data distribution.
const so_5::mbox_t m_dest;
// Counter to be used for data generation.
int m_value_counter{};
public:
data_generator( context_t ctx )
: so_5::agent_t{ std::move(ctx) }
, m_dest{ so_environment().create_mbox() }
{}
// Accessor for mbox used for data distribution.
[[nodiscard]] so_5::mbox_t distribution_mbox() const
{
return m_dest;
}
void so_define_agent() override
{
so_subscribe_self().event( &data_generator::evt_generate_next );
}
void so_evt_start() override
{
}
private:
void evt_generate_next( mhood_t< msg_generate_next > )
{
// New message has to be sent to the destination mbox.
so_5::send< msg_data >( m_dest, ++m_value_counter );
// Next iteration after some delay.
std::chrono::milliseconds{ 25 } );
}
};
// Agent that waits msg_data messages to be sent to its direct_mbox.
class data_consumer final : public so_5::agent_t
{
// Number of consumed messages.
int m_messages_consumed{};
public:
data_consumer( context_t ctx )
: so_5::agent_t{ std::move(ctx) }
{}
void so_define_agent() override
{
.event( &data_consumer::evt_data );
}
private:
void evt_data( mhood_t< msg_data > cmd )
{
std::cout << "data_consumer: new data: " << cmd->m_value << std::endl;
++m_messages_consumed;
if( m_messages_consumed > 3 )
// It's time to finish the demo.
}
};
int main()
{
try
{
// Starting SObjectizer.
[]( so_5::environment_t & env )
{
// Create a new coop with generator and consumer agents.
env.introduce_coop( []( so_5::coop_t & coop ) {
auto * generator = coop.make_agent< data_generator >();
auto * consumer = coop.make_agent< data_consumer >();
// Make a binding for msg_data message.
// Binding should live as long as consumer agent,
// so place it under the control of the coop.
auto * binding = coop.take_under_control(
std::make_unique< so_5::single_sink_binding_t >() );
// Message msg_data from generator.distribution_mbox
// should go into consumer.direct_mbox.
binding->bind< msg_data >(
generator->distribution_mbox(),
so_5::wrap_to_msink( consumer->so_direct_mbox() ) );
} );
} );
}
catch( const std::exception & ex )
{
std::cerr << "Error: " << ex.what() << std::endl;
return 1;
}
return 0;
}
A helper header file for including all public SObjectizer stuff.
A base class for agents.
Definition agent.hpp:673
virtual void so_define_agent()
Hook on define agent for SObjectizer.
Definition agent.cpp:975
subscription_bind_t so_subscribe_self()
Initiate subscription to agent's direct mbox.
Definition agent.hpp:1461
void so_deregister_agent_coop_normally()
A helper method for deregistering agent's coop in case of normal deregistration.
Definition agent.cpp:1116
virtual void so_evt_start()
Hook on agent start inside SObjectizer.
Definition agent.cpp:832
Agent cooperation.
Definition coop.hpp:389
Agent * make_agent(Args &&... args)
Helper method for simplification of agents creation.
Definition coop.hpp:792
T * take_under_control(std::unique_ptr< T > resource)
Take a user resouce under cooperation control.
Definition coop.hpp:710
SObjectizer Environment.
decltype(auto) introduce_coop(Args &&... args)
Helper method for simplification of cooperation creation and registration.
A base class for agent messages.
Definition message.hpp:47
A base class for agent signals.
Definition message.hpp:275
std::enable_if< details::is_agent_method_pointer< details::method_arity::unary, Method_Pointer >::value, subscription_bind_t & >::type event(Method_Pointer pfn, thread_safety_t thread_safety=not_thread_safe)
Make subscription to the message.
Definition agent.hpp:3657
Private part of message limit implementation.
Definition agent.cpp:33
void launch(Init_Routine &&init_routine)
Launch a SObjectizer Environment with default parameters.
Definition api.hpp:142
void send(Target &&to, Args &&... args)
A utility function for creating and delivering a message or a signal.
msink_t SO_5_FUNC wrap_to_msink(const mbox_t &mbox, priority_t sink_priority=prio::p0)
Helper for wrapping an existing mbox into message_sink.
Definition mbox.cpp:109
void send_delayed(Target &&target, std::chrono::steady_clock::duration pause, Args &&... args)
A utility function for creating and delivering a delayed message to the specified destination.
STL namespace.