2
3
6
7
8
9
10
14#include <so_5/msinks/transform_then_redirect.hpp>
16#include <so_5/single_sink_binding.hpp>
17#include <so_5/multi_sink_binding.hpp>
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96template<
typename Binding,
typename Transformer >
102 const so_5::mbox_t & src_mbox,
105 Transformer && transformer )
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186template<
typename Binding,
typename Transformer,
typename Delivery_Filter >
192 const so_5::mbox_t & src_mbox,
195 Transformer && transformer,
197 Delivery_Filter && filter )
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303template<
typename Expected_Msg,
typename Binding,
typename Transformer >
309 const so_5::mbox_t & src_mbox,
312 Transformer && transformer )
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
409 typename Expected_Msg,
411 typename Transformer,
412 typename Delivery_Filter >
418 const so_5::mbox_t & src_mbox,
421 Transformer && transformer,
423 Delivery_Filter && delivery_filter )
Interface for message sink.
static demand_handler_pfn_t get_demand_handler_on_message_ptr() noexcept
static demand_handler_pfn_t get_demand_handler_on_enveloped_msg_ptr() noexcept
It's a kind of strong typedef for coop's deregistration reason.
Type of smart handle for a cooperation.
An interface of delivery filter object.
An interface of envelope with some message/signal inside.
virtual void access_hook(access_context_t context, handler_invoker_t &invoker) noexcept=0
An extended version of handling_context which can be used for calling event handler.
An information about payload inside envelope.
message_ref_t & message() const noexcept
Parameters for the SObjectizer Environment initialization.
environment_params_t()
Constructor.
Interface of event_queue_hook object.
An interface of event queue for agent.
trigger_t & trigger() const noexcept
Get a reference to activated trigger.
token_t(trigger_t *trigger) noexcept
trigger_t * m_trigger
Activated trigger.
bool valid() const noexcept
An interface of testing scenario step.
virtual void no_handler_hook(const scenario_in_progress_accessor_t &scenario_accessor, const incident_info_t &info, const message_ref_t &incoming_msg) noexcept=0
abstract_scenario_step_t & operator=(const abstract_scenario_step_t &)=delete
virtual ~abstract_scenario_step_t()=default
virtual void add_preactivate_action(preactivate_action_t action)=0
Add another preactivation action.
virtual void setup_triggers(trigger_container_t triggers, std::size_t triggers_to_activate) noexcept=0
Setup triggers for the step.
abstract_scenario_step_t(abstract_scenario_step_t &&)=delete
virtual void setup_constraints(constraint_container_t constraints) noexcept=0
Setup constraints for the step.
virtual const std::string & name() const noexcept=0
Get the name of the step.
virtual void post_handler_hook(const scenario_in_progress_accessor_t &scenario_accessor, token_t token) noexcept=0
Hook that should be called just after completion of event-handler.
abstract_scenario_step_t & operator=(abstract_scenario_step_t &&)=delete
virtual void preactivate() noexcept=0
Perform preactivation of the step.
virtual token_t pre_handler_hook(const scenario_in_progress_accessor_t &scenario_accessor, const incident_info_t &info, const message_ref_t &incoming_msg) noexcept=0
Hook that should be called before invocation of event-handler.
abstract_scenario_step_t(const abstract_scenario_step_t &)=delete
virtual status_t status() const noexcept=0
Get the current status of the step.
abstract_scenario_step_t()=default
abstract_scenario_step_t & activated_step() const noexcept
abstract_scenario_step_t::token_t m_step_token
abstract_scenario_step_t::token_t step_token() const noexcept
abstract_scenario_step_t * m_activated_step
token_t(abstract_scenario_step_t *activated_step, abstract_scenario_step_t::token_t step_token)
bool valid() const noexcept
An interface of testing scenario.
virtual void store_msg_inspection_result(const scenario_in_progress_accessor_t &, const abstract_scenario_step_t &step, const std::string &tag, const std::string &inspection_result)=0
Store msg inspection result in the scenario.
scenario_in_progress_accessor_t make_accessor() noexcept
Helper method for creation of scenario_in_progress_accessor instance.
abstract_scenario_t(abstract_scenario_t &&)=delete
virtual void run_for(std::chrono::steady_clock::duration run_time)=0
Run the scenario until completion or for specific amount of time.
virtual token_t pre_handler_hook(const incident_info_t &info, const message_ref_t &incoming_msg) noexcept=0
Hook that should be called before invocation of event-handler.
abstract_scenario_t()=default
virtual std::string stored_msg_inspection_result(const std::string &step_name, const std::string &tag) const =0
Get a value of stored msg inspection result.
virtual ~abstract_scenario_t()=default
virtual void post_handler_hook(token_t token) noexcept=0
Hook that should be called just after completion of event-handler.
virtual void no_handler_hook(const incident_info_t &info, const message_ref_t &incoming_msg) noexcept=0
abstract_scenario_t & operator=(const abstract_scenario_t &)=delete
virtual void store_state_name(const scenario_in_progress_accessor_t &, const abstract_scenario_step_t &step, const std::string &tag, const std::string &state_name)=0
Store a name of an agent state in the scenario.
virtual bool has_stored_state_name(const std::string &step_name, const std::string &tag) const =0
Check presence of the stored state name.
virtual std::string stored_state_name(const std::string &step_name, const std::string &tag) const =0
Get the stored state name.
abstract_scenario_t & operator=(abstract_scenario_t &&)=delete
virtual scenario_result_t result() const noexcept=0
Get the result of scenario execution.
virtual step_definition_proxy_t define_step(nonempty_name_t step_name)=0
Create a new step and return proxy for it.
abstract_scenario_t(const abstract_scenario_t &)=delete
virtual bool has_stored_msg_inspection_result(const std::string &step_name, const std::string &tag) const =0
Is there the inspection result?
An interface for object that will unfreeze all registered agents when testing scenario starts.
agent_unfreezer_t(const agent_unfreezer_t &)=delete
agent_unfreezer_t & operator=(const agent_unfreezer_t &)=delete
agent_unfreezer_t()=default
virtual void unfreeze() noexcept=0
Issue a command to unfreeze all frozen agents.
agent_unfreezer_t(agent_unfreezer_t &&)=delete
agent_unfreezer_t & operator=(agent_unfreezer_t &&)=delete
virtual ~agent_unfreezer_t()=default
An interface of step's constraints.
constraint_t & operator=(constraint_t &&)=delete
virtual void start() noexcept=0
Hook for step preactivation.
constraint_t & operator=(const constraint_t &)=delete
virtual ~constraint_t() noexcept=default
constraint_t(constraint_t &&)=delete
constraint_t(const constraint_t &)=delete
virtual bool check(const incident_status_t incident_status, const incident_info_t &info) const noexcept=0
Check for fulfillment of constraint.
virtual void finish() noexcept=0
Hook for step completion.
const mbox_t m_from
Source for a message.
void so_define_agent() override
Hook on define agent for SObjectizer.
void evt_msg_arrived(mhood_t< Msg >)
a_msg_catcher_t(context_t ctx, mbox_t from)
std::mutex m_lock
The lock for thread safety.
msg_catcher_map_layer_t()
~msg_catcher_map_layer_t() noexcept override
agents_map_t m_agents
The map of already created catcher agents.
const agent_t * register_new_catcher(const so_5::mbox_t &from) const
Helper for registration of a new agent.
catcher_info_t catcher_for_mbox(const so_5::mbox_t &from)
void start() noexcept override
Hook for step preactivation.
const std::chrono::steady_clock::duration m_pause
Value to be used.
void finish() noexcept override
Hook for step completion.
std::chrono::steady_clock::time_point m_started_at
Time point of step preactivation.
bool check(const incident_status_t, const incident_info_t &) const noexcept override
Check for fulfillment of constraint.
not_after_constraint_t(std::chrono::steady_clock::duration pause)
void start() noexcept override
Hook for step preactivation.
std::chrono::steady_clock::time_point m_started_at
Time point of step preactivation.
const std::chrono::steady_clock::duration m_pause
Value to be used.
void finish() noexcept override
Hook for step completion.
bool check(const incident_status_t, const incident_info_t &) const noexcept override
Check for fulfillment of constraint.
not_before_constraint_t(std::chrono::steady_clock::duration pause)
preactivate_actions_container_t m_preactivate_actions
All preactivation actions.
std::size_t m_triggers_activated
Count of triggers those are activated.
void no_handler_hook(const scenario_in_progress_accessor_t &scenario_accessor, const incident_info_t &info, const message_ref_t &incoming_msg) noexcept override
token_t pre_handler_hook(const scenario_in_progress_accessor_t &scenario_accessor, const incident_info_t &info, const message_ref_t &incoming_msg) noexcept override
Hook that should be called before invocation of event-handler.
bool try_pass_constraints(const incident_status_t incident_status, const incident_info_t &info) const noexcept
An attempt to check constraints for a new incident.
void setup_constraints(constraint_container_t constraints) noexcept override
Setup constraints for the step.
void preactivate() noexcept override
Perform preactivation of the step.
const std::string m_name
Name of a step.
std::size_t m_last_non_activated_trigger
Index of last trigger in the first part of trigger's container.
std::size_t m_triggers_to_activate
status_t status() const noexcept override
Get the current status of the step.
std::size_t m_triggers_to_completion
Count of activated triggers those are not completed yet.
status_t m_status
The current state of the step.
void post_handler_hook(const scenario_in_progress_accessor_t &scenario_accessor, token_t token) noexcept override
Hook that should be called just after completion of event-handler.
const std::string & name() const noexcept override
Get the name of the step.
token_t try_activate(const trigger_activation_context_t &context, const incident_status_t incident_status, const incident_info_t &info) noexcept
An attempt to activate the step when a new incident arrives.
constraint_container_t m_constraints
All constraints.
trigger_container_t m_triggers
All triggers.
real_scenario_step_t(std::string name)
void add_preactivate_action(preactivate_action_t action) override
Add another preactivation action.
void setup_triggers(trigger_container_t triggers, std::size_t triggers_to_activate) noexcept override
Setup triggers for the step.
void change_status(status_t status) noexcept
void no_handler_hook(const incident_info_t &info, const message_ref_t &incoming_msg) noexcept override
std::string stored_msg_inspection_result(const std::string &step_name, const std::string &tag) const override
Get a value of stored msg inspection result.
bool has_stored_state_name(const std::string &step_name, const std::string &tag) const override
Check presence of the stored state name.
void check_scenario_completion() noexcept
std::size_t m_waiting_step_index
Index of the current preactivated step.
void switch_to_next_step_if_possible()
std::set< abstract_scenario_step_t * > m_active_steps
Set of active step those are not completed yet.
scenario_result_t result() const noexcept override
Get the result of scenario execution.
void store_msg_inspection_result(const scenario_in_progress_accessor_t &, const abstract_scenario_step_t &step, const std::string &tag, const std::string &inspection_result) override
Store msg inspection result in the scenario.
std::string describe_current_state() const
bool has_stored_msg_inspection_result(const std::string &step_name, const std::string &tag) const override
Is there the inspection result?
std::string stored_state_name(const std::string &step_name, const std::string &tag) const override
Get the stored state name.
token_t react_on_pre_handler_hook(const incident_info_t &info, const message_ref_t &incoming_msg) noexcept
std::condition_variable m_completion_cv
Condition variable for waiting completion of the scenario.
void react_on_no_handler_hook(const incident_info_t &info, const message_ref_t &incoming_msg) noexcept
void preactivate_current_step()
void post_handler_hook(token_t token) noexcept override
Hook that should be called just after completion of event-handler.
void run_for(std::chrono::steady_clock::duration run_time) override
Run the scenario until completion or for specific amount of time.
agent_unfreezer_t * m_unfreezer
Unfreezer for registered agents.
real_scenario_t()=default
void setup_unfreezer(agent_unfreezer_t &unfreezer) noexcept
Set the unfreezer for registered agents.
inspection_result_map_t m_stored_inspection_results
Container for holding stored inspection results for messages.
void store_state_name(const scenario_in_progress_accessor_t &, const abstract_scenario_step_t &step, const std::string &tag, const std::string &state_name) override
Store a name of an agent state in the scenario.
token_t pre_handler_hook(const incident_info_t &info, const message_ref_t &incoming_msg) noexcept override
Hook that should be called before invocation of event-handler.
std::mutex m_lock
Object lock.
step_definition_proxy_t define_step(nonempty_name_t step_name) override
Create a new step and return proxy for it.
state_name_map_t m_stored_states
Container for holding stored state names.
scenario_status_t m_status
The current state of the scenario.
std::vector< step_unique_ptr_t > m_steps
Scenario's steps.
scenario_in_progress_accessor_t & operator=(scenario_in_progress_accessor_t &&)=delete
scenario_in_progress_accessor_t(outliving_reference_t< abstract_scenario_t > scenario)
scenario_in_progress_accessor_t(scenario_in_progress_accessor_t &&)=delete
abstract_scenario_t & scenario() const noexcept
scenario_in_progress_accessor_t & operator=(const scenario_in_progress_accessor_t &)=delete
scenario_in_progress_accessor_t(const scenario_in_progress_accessor_t &)=delete
outliving_reference_t< abstract_scenario_t > m_scenario
trigger_holder_t(const trigger_holder_t &)=delete
trigger_holder_t & operator=(trigger_holder_t &&) noexcept=default
trigger_holder_t & operator=(const trigger_holder_t &)=delete
trigger_holder_t(trigger_holder_t &&) noexcept=default
trigger_holder_t(trigger_unique_ptr_t trigger) noexcept
trigger_unique_ptr_t m_trigger
trigger_unique_ptr_t giveout_trigger() noexcept
Get the trigger object from the holder.
activation_function_t m_activation
Optional function for activation of the trigger.
const std::type_index m_msg_type
Type of message/signal to activate the trigger.
completion_function_t m_completion
Optional function for completion of the trigger.
trigger_t(trigger_t &&)=delete
void set_completion(completion_function_t fn)
Setter for completion function.
void set_activation(activation_function_t fn)
Setter for activation function.
void activate(const trigger_activation_context_t &context) noexcept
Do activation of the trigger.
bool check(const incident_status_t incident_status, const incident_info_t &info) const noexcept
Check for activation of the trigger.
const mbox_id_t m_src_mbox_id
ID of source mbox of message/signal to activate the trigger.
trigger_t(incident_status_t incident_status, const agent_t &target, std::type_index msg_type, mbox_id_t src_mbox_id)
Initializing constructor.
const agent_t & target_agent() const noexcept
Get the reference of the target agent.
const incident_status_t m_incident_status
What should happen with initial message/signal.
bool requires_completion() const noexcept
Does this trigger require separate completion action?
const mbox_id_t m_target_id
The unique ID of target's direct mbox.
void complete(const trigger_completion_context_t &context) noexcept
Do completion of a trigger.
trigger_t(const trigger_t &)=delete
const agent_t & m_target_agent
A reference to the target agent.
void invoke(const payload_info_t &payload) noexcept override
Call an actual handler for the enveloped message/signal.
no_handler_invoker_t(outliving_reference_t< special_envelope_t > owner)
Initializing constructor.
outliving_reference_t< special_envelope_t > m_owner
Owner of this invoker.
outliving_reference_t< handler_invoker_t > m_actual_invoker
Invoker to be used to call the actual event handler.
void invoke(const payload_info_t &payload) noexcept override
Call an actual handler for the enveloped message/signal.
pre_handler_hook_invoker_t(outliving_reference_t< special_envelope_t > owner, outliving_reference_t< handler_invoker_t > actual_invoker)
Intializing constructor.
outliving_reference_t< special_envelope_t > m_owner
Owner of this invoker.
outliving_reference_t< details::abstract_scenario_t > m_scenario
A testing scenario for that envelope.
~special_envelope_t() noexcept override
@ delivered
Message delivered to the destination agent.
@ suppressed_by_envelope
Message suppressed by a nested envelope.
@ ignored
Message ignored by the destination agent.
special_envelope_t(outliving_reference_t< details::abstract_scenario_t > scenario, const execution_demand_t &demand)
Initializing constructor.
message_ref_t m_message
Enveloped message.
details::incident_info_t m_demand_info
Information about enveloped message.
void access_hook(access_context_t context, handler_invoker_t &invoker) noexcept override
delivery_result_t m_delivery_result
Was this message handled by a receiver?
void unfreeze() noexcept override
Issue a command to unfreeze all frozen agents.
std::mutex m_lock
Lock for this object.
outliving_reference_t< details::abstract_scenario_t > m_scenario
Testing scenario for that this object is created.
void on_unbind(agent_t *, event_queue_t *queue) noexcept override
A reaction to unbinding of an agent from some event_queue.
queue_mode_t m_mode
Mode of operation for new queues.
std::vector< special_event_queue_t * > m_created_queues
List of all queues created before unfreeze was called.
special_event_queue_hook_t(outliving_reference_t< details::abstract_scenario_t > scenario)
event_queue_t * on_bind(agent_t *, event_queue_t *original_queue) noexcept override
A reaction to binding of an agent to some event_queue.
std::vector< execution_demand_t > m_buffer
Local storage for demands to be used in buffered mode.
static bool is_ordinary_demand(const execution_demand_t &demand) noexcept
special_event_queue_t(outliving_reference_t< details::abstract_scenario_t > scenario, outliving_reference_t< event_queue_t > original_queue, queue_mode_t queue_mode)
void push_to_queue(execution_demand_t demand)
void push_evt_finish(execution_demand_t demand) noexcept override
Enqueue a demand for evt_finish event.
queue_mode_t m_mode
The current mode of operation.
std::mutex m_lock
Object lock.
void push_evt_start(execution_demand_t demand) override
Enqueue a demand for evt_start event.
outliving_reference_t< event_queue_t > m_original_queue
Original event_queue.
void switch_to_direct_mode()
void push(execution_demand_t demand) override
Enqueue new event to the queue.
outliving_reference_t< details::abstract_scenario_t > m_scenario
Testing scenario for that this queue was created.
stop_guard_for_unfreezer_t(outliving_reference_t< details::agent_unfreezer_t > unfreezer, outliving_reference_t< environment_t > env)
outliving_reference_t< details::agent_unfreezer_t > m_unfreezer
outliving_reference_t< environment_t > m_env
void stop() noexcept override
Perform stop-related actions.
step_definition_proxy_t define_step(nonempty_name_t step_name)
Start definition of a new scenario's step.
std::string stored_state_name(const std::string &step_name, const std::string &tag) const
Try to get stored name of an agent's state.
std::string stored_msg_inspection_result(const std::string &step_name, const std::string &tag) const
Try to get stored msg inspection result.
outliving_reference_t< details::abstract_scenario_t > m_scenario
bool has_stored_state_name(const std::string &step_name, const std::string &tag) const
Is there the inspection result?
bool has_stored_msg_inspection_result(const std::string &step_name, const std::string &tag) const
Is there the inspection result?
void run_for(std::chrono::steady_clock::duration run_time)
Runs the scenario for specified amount of time.
scenario_proxy_t(outliving_reference_t< details::abstract_scenario_t > scenario)
scenario_result_t result() const
Get the result of scenario execution.
The result of run of testing scenario.
scenario_result_t(scenario_status_t status)
The constructor for a case when there is only status of scenario.
scenario_result_t(scenario_status_t status, std::string description)
scenario_status_t m_status
friend std::ostream & operator<<(std::ostream &to, const scenario_result_t &v)
Dump of object's content to ostream.
optional< std::string > m_description
bool operator!=(const scenario_result_t &o) const noexcept
Check for inequality.
bool operator==(const scenario_result_t &o) const noexcept
Check for equality.
A special object that should be used for definition of a step of a testing scenario.
details::abstract_scenario_step_t * m_step
step_definition_proxy_t(details::abstract_scenario_step_t *step)
Initializing constructor.
step_definition_proxy_t & impact(Lambda &&lambda)
Add preactivation action in form of lambda-object.
step_definition_proxy_t & when_all(details::trigger_holder_t< Status > event, Args &&...args)
Add a list of tiggers for activation of that step.
void append_constraint_to(details::constraint_container_t &)
void append_trigger_to(details::trigger_container_t &to, details::trigger_holder_t< Status > event, Args &&...args)
void append_constraint_to(details::constraint_container_t &to, details::constraint_unique_ptr_t head, Args &&...tail)
step_definition_proxy_t & impact(Target &&target, Args &&...args)
Define a preactivation action in form of sending a message/signal to the specified target.
void append_trigger_to(details::trigger_container_t &)
step_definition_proxy_t & constraints(details::constraint_unique_ptr_t head, Args &&...tail)
Add a list of constraints for that step.
step_definition_proxy_t & when_any(details::trigger_holder_t< Status > event, Args &&...args)
Add a list of tiggers for activation of that step.
step_definition_proxy_t & when(details::trigger_holder_t< Status > event)
Add a tigger for activation of that step.
A special testing environment that should be used for testing of agents.
void stop()
Send stop signal to environment.
environment_t & environment() const
Access to wrapped environment.
testing_env_t()
Default constructor.
testing_env_t(environment_params_t &&env_params)
void wait_init_completion()
scenario_proxy_t scenario() noexcept
Access to the associated scenario.
void join()
Wait for complete finish of environment's work.
wrapped_env_t m_sobjectizer
std::unique_ptr< internals_t > m_internals
void tune_environment_on_start(environment_t &env)
void stop_then_join()
Send stop signal and wait for complete finish of environment's work.
testing_env_t(so_5::generic_simple_so_env_params_tuner_t env_params_tuner)
A constructor that allows to tune environment's parameters.
Special container for holding select parameters and select cases.
extensible_select_t & operator=(extensible_select_t &&other) noexcept
Move operator.
extensible_select_t()=default
Default constructor.
extensible_select_t(extensible_select_t &&other) noexcept
Move constructor.
friend void swap(extensible_select_t &a, extensible_select_t &b) noexcept
Swap operation.
bool empty() const noexcept
Is this handle empty?
std::unique_ptr< mchain_props::details::extensible_select_data_t > m_data
Actual data for that extensible-select.
auto & data() const noexcept
extensible_select_t & operator=(const extensible_select_t &)=delete
extensible_select_t(const extensible_select_t &)=delete
extensible_select_t(std::unique_ptr< mchain_props::details::extensible_select_data_t > data)
Actual initializing constructor.
friend extensible_select_t make_extensible_select(mchain_select_params_t< Msg_Count_Status > params, Cases &&... cases)
Creation of extensible-select instance.
An information block about one subscription to one message type with presence of message_sink.
void set_filter(const delivery_filter_t &filter)
Set the delivery filter for the subscriber.
void drop_filter()
Drop the delivery filter for the subscriber.
abstract_message_sink_t * m_sink
Message sink for a subscriber.
subscription_info_with_sink_t(const delivery_filter_t &filter)
void drop_sink()
Inform about removal of a subscription.
abstract_message_sink_t & sink_reference() const noexcept
Get a reference to the subscribed sink.
abstract_message_sink_t * sink_pointer() const noexcept
Get a pointer to the subscribed sink.
const delivery_filter_t * m_filter
Delivery filter for that message for that subscription.
bool empty() const noexcept
subscription_info_with_sink_t(abstract_message_sink_t &sink, const delivery_filter_t &filter)
subscription_info_with_sink_t()
Default constructor. Creates an empty object.
delivery_possibility_t must_be_delivered(const message_ref_t &msg, Msg_Ref_Extractor msg_extractor) const
Must a message be delivered to the subscriber?
void set_sink(abstract_message_sink_t &sink)
Inform about addition of a subscription.
subscription_info_with_sink_t(abstract_message_sink_t &sink)
An information block about one subscription to one message type.
subscription_info_without_sink_t(subscription_present_t)
state_t
Current status of the subscription.
@ subscriptions_and_filter
delivery_possibility_t must_be_delivered(abstract_message_sink_t &subscriber, const message_ref_t &msg, Msg_Ref_Extractor msg_extractor) const
Must a message be delivered to the subscriber?
subscription_info_without_sink_t()
Default constructor. Creates an empty object.
void set_filter(const delivery_filter_t &filter)
Set the delivery filter for the subscriber.
state_t m_state
Current state of the subscription parameters.
void drop_filter()
Drop the delivery filter for the subscriber.
void subscription_defined()
Inform about addition of a subscription.
const delivery_filter_t * m_filter
Delivery filter for that message for that subscription.
void subscription_dropped()
Inform about removal of a subscription.
subscription_info_without_sink_t(const delivery_filter_t &filter)
Auxiliary class for the SObjectizer launching.
Init m_init
Initialization routine.
void init() override
Initialization hook.
so_quick_environment_t(Init init, so_5::environment_params_t &&env_params)
An interface of the additional SObjectizer Environment layer.
Main class for auto close operation.
auto_closer_t & operator=(const auto_closer_t &)=delete
so_5::mchain_props::close_mode_t m_close_mode
auto_closer_t(auto_closer_t &&o) noexcept
auto_closer_t(so_5::mchain_props::close_mode_t close_mode)
auto_closer_t(const auto_closer_t &)=delete
void set_mchain(std::size_t index, mchain_t ch)
std::array< mchain_t, N > m_chains
auto_closer_t & operator=(auto_closer_t &&o) noexcept
friend void swap(auto_closer_t &a, auto_closer_t &b) noexcept
Basic parameters for advanced receive from mchain and for multi chain select.
Helper class for automatic close of a mchain at the destruction of master handle instance.
const mchain_t & get() const noexcept
Get the mchain.
mchain_master_handle_t(mchain_master_handle_t &&handle) noexcept
Move constructor.
mchain_master_handle_t(mchain_t chain, mchain_props::close_mode_t close_mode) noexcept
Initializing constructor.
const mchain_t & operator*() const noexcept
Get the mchain.
static mchain_master_handle_t make(mchain_t chain, mchain_props::close_mode_t close_mode) noexcept
static mchain_master_handle_t with_retain_content(mchain_t chain) noexcept
mchain_master_handle_t & operator=(const mchain_master_handle_t &)=delete
friend void swap(mchain_master_handle_t &a, mchain_master_handle_t &b) noexcept
Swap operation.
~mchain_master_handle_t()
Destructor closes the chain.
mchain_props::close_mode_t m_close_mode
Close mode for mchain.
mchain_t m_chain
Chain to be hold.
mchain_master_handle_t(const mchain_master_handle_t &)=delete
static mchain_master_handle_t with_drop_content(mchain_t chain) noexcept
mchain_master_handle_t & operator=(mchain_master_handle_t &&handle) noexcept
Move operator.
Actual implementation of one multi chain select case.
actual_receive_select_case_t(mchain_t chain, Handlers &&... handlers)
Initializing constructor.
so_5::details::handlers_bunch_t< N > m_handlers
mchain_receive_result_t try_handle_extracted_message(demand_t &demand) override
Attempt to handle extracted message.
Actual implementation of notificator for multi chain select.
select_case_t * m_tail
Queue of already notified select_cases.
actual_select_notificator_t(Fwd_it b, Fwd_it e)
Initializing constructor.
void push_to_notified_chain(select_case_t &what) noexcept
select_case_t * wait(duration_t wait_time)
Wait for any notified select_case.
std::condition_variable m_condition
void return_to_ready_chain(select_case_t &what) noexcept
Return specifed select_case object to the chain of 'notified select_cases'.
void notify(select_case_t &what) noexcept override
The actual implementation of select_case for the case of sending a message.
void on_successful_push() override
Hook for handling successful push attempt.
actual_send_select_case_t(mchain_t chain, std::type_index msg_type, message_ref_t message, const On_Success_Handler &success_handler)
Initializing constructor for the case when success_handler is a const lvalue.
On_Success_Handler m_success_handler
Actual handler of successful send attempt.
actual_send_select_case_t(mchain_t chain, std::type_index msg_type, message_ref_t message, On_Success_Handler &&success_handler)
Initializing constructor for the case when success_handler is a rvalue.
Iterator class for accessing select_cases.
bool operator!=(const const_iterator &o) const noexcept
const_iterator & operator++() noexcept
select_case_t & operator*() const noexcept
bool operator==(const const_iterator &o) const noexcept
select_case_t * operator->() const noexcept
const_iterator(actual_it_t it) noexcept
const_iterator operator++(int) noexcept
A holder for serie of select_cases for the case of extensible select.
array_type_t m_cases
Storage for select_cases.
extensible_select_cases_holder_t(const extensible_select_cases_holder_t &)=delete
extensible_select_cases_holder_t & operator=(extensible_select_cases_holder_t &&o) noexcept
Move operator.
extensible_select_cases_holder_t & operator=(const extensible_select_cases_holder_t &)=delete
extensible_select_cases_holder_t(extensible_select_cases_holder_t &&o) noexcept
Move constructor.
extensible_select_cases_holder_t()
Default constructor.
friend void swap(extensible_select_cases_holder_t &a, extensible_select_cases_holder_t &b) noexcept
Swap operation.
extensible_select_cases_holder_t(std::size_t initial_capacity)
Constructor with initial capacity.
const_iterator end() const noexcept
Get iterator for the item just behind the last item in select_cases_holder.
std::size_t size() const noexcept
Get count of select_cases in holder.
const_iterator begin() const noexcept
Get iterator for the first item in select_cases_holder.
void add_case(select_case_unique_ptr_t c)
Helper method for setting up specific select_case.
Special class for locking extensible-select instance for activation inside select() call.
activation_locker_t(activation_locker_t &&)=delete
activation_locker_t(const activation_locker_t &)=delete
outliving_reference_t< extensible_select_data_t > m_data
Special class for locking extensible-select instance for modification.
outliving_reference_t< extensible_select_data_t > m_data
modification_locker_t(modification_locker_t &&)=delete
modification_locker_t(const modification_locker_t &)=delete
std::lock_guard< std::mutex > m_lock
A data for extensible-select instance.
std::mutex m_lock
The object's lock.
const mchain_select_params_t< mchain_props::msg_count_status_t::defined > m_params
Parameters for select.
extensible_select_status_t m_status
The current status of extensible-select object.
extensible_select_cases_holder_t m_cases
A list of cases for extensible-select operation.
extensible_select_data_t(const extensible_select_data_t &)=delete
extensible_select_data_t(extensible_select_data_t &&)=delete
extensible_select_data_t(mchain_select_params_t< msg_count_status_t::defined > &¶ms, extensible_select_cases_holder_t &&cases) noexcept
Initializing constructor.
Special class for locking prepared-select instance for activation inside select() call.
activation_locker_t(activation_locker_t &&)=delete
outliving_reference_t< prepared_select_data_t > m_data
activation_locker_t(const activation_locker_t &)=delete
A data for prepared-select instance.
prepared_select_data_t(mchain_select_params_t< msg_count_status_t::defined > &¶ms, Cases &&...cases) noexcept
Initializing constructor.
prepared_select_data_t(prepared_select_data_t &&)=delete
select_cases_holder_t< Cases_Count > m_cases
A list of cases for extensible-select operation.
std::mutex m_lock
The object's lock.
prepared_select_data_t(const prepared_select_data_t &)=delete
prepared_select_status_t m_status
The current status of extensible-select object.
const mchain_select_params_t< mchain_props::msg_count_status_t::defined > m_params
Parameters for select.
A base class for implementations of select_case for the case of receiving messages.
virtual mchain_receive_result_t try_handle_extracted_message(demand_t &demand)=0
Attempt to handle extracted message.
handling_result_t try_handle(select_notificator_t ¬ificator) override
An attempt to handle this case.
Iterator class for accessing select_cases.
select_case_t & operator*() const noexcept
bool operator!=(const const_iterator &o) const noexcept
const_iterator(actual_it_t it) noexcept
select_case_t * operator->() const noexcept
bool operator==(const const_iterator &o) const noexcept
const_iterator & operator++() noexcept
const_iterator operator++(int) noexcept
A holder for serie of select_cases.
select_cases_holder_t & operator=(select_cases_holder_t &&o) noexcept
Move operator.
void set_case(std::size_t index, select_case_unique_ptr_t c) noexcept
Helper method for setting up specific select_case.
const_iterator end() const noexcept
Get iterator for the item just behind the last item in select_cases_holder.
select_cases_holder_t(const select_cases_holder_t &)=delete
select_cases_holder_t()
Default constructor.
friend void swap(select_cases_holder_t &a, select_cases_holder_t &b) noexcept
Swap operation.
const_iterator begin() const noexcept
Get iterator for the first item in select_cases_holder.
select_cases_holder_t(select_cases_holder_t &&o) noexcept
Move constructor.
array_type_t m_cases
Storage for select_cases.
select_cases_holder_t & operator=(const select_cases_holder_t &)=delete
std::size_t size() const noexcept
Get count of select_cases in holder.
A base class for implementations of select_case for the case of sending messages.
std::type_index m_msg_type
Type of message to be sent.
virtual void on_successful_push()=0
Hook for handling successful push attempt.
send_select_case_t(mchain_t chain, std::type_index msg_type, message_ref_t message)
Initializing constructor.
message_ref_t m_message
Message to be sent.
handling_result_t try_handle(select_notificator_t ¬ificator) override
An attempt to handle this case.
Base class for representation of one case in multi chain select.
const mchain_t & chain() const noexcept
Get the underlying mchain.
auto push(const std::type_index &msg_type, const message_ref_t &message)
Helper method for calling push method of the target mchain.
select_case_t * query_next() const noexcept
auto extract(demand_t &demand)
Helper method for calling extract method of the target mchain.
void set_next(select_case_t *next) noexcept
Set the next item in the current queue to which select_case belongs.
select_case_t(const select_case_t &)=delete
select_case_t(mchain_t chain)
Initialized constructor.
select_case_t * giveout_next() noexcept
virtual handling_result_t try_handle(select_notificator_t ¬ificator)=0
An attempt to handle this case.
select_notificator_t * m_notificator
Notificator to be used for notify sleeping thread.
void notify() noexcept
Notification for all waiting select_cases.
select_case_t * m_next
Next select_case in queue.
mchain_t m_chain
Message chain to receive message from.
void on_select_finish() noexcept
Reaction to the end of select work.
select_case_t(select_case_t &&)=delete
An interface of select_case notificator.
virtual void notify(select_case_t &what) noexcept=0
A result of receive from mchain.
mchain_select_params_t(typename base_type::data_type data)
Initializing constructor for the case of cloning.
mchain_select_params_t()=default
The default constructor.
decltype(auto) so5_clone_if_necessary() noexcept
A result of select from several mchains.
std::size_t m_closed
Count of closed chains.
std::size_t m_handled
Count of handled incoming messages.
std::size_t handled() const noexcept
Count of handled incoming messages.
bool was_extracted() const noexcept
mchain_select_result_t(std::size_t extracted, std::size_t handled, std::size_t sent, std::size_t closed) noexcept
Initializing constructor.
mchain_select_result_t() noexcept
Default constructor.
std::size_t m_sent
Count of messages sent.
bool was_sent_or_received() const noexcept
std::size_t closed() const noexcept
Count of closed chains.
std::size_t sent() const noexcept
Count of messages sent.
bool was_closed() const noexcept
std::size_t m_extracted
Count of extracted incoming messages.
std::size_t extracted() const noexcept
Count of extracted incoming messages.
bool was_sent() const noexcept
bool was_handled() const noexcept
A result of attempt of sending messages to a message chain.
A base class for agent messages.
friend message_kind_t message_kind(const so_5::intrusive_ptr_t< message_t > &what)
Helper method for quering kind of the message.
Class that actually holds multiple sinks bindings.
void do_actual_bind(const std::type_index &msg_type, const mbox_t &from, const msink_t &dest, Single_Sink_Modificator &&single_sink_modificator)
Implementation of bind procedure.
void do_bind(const mbox_t &from, const msink_t &dest)
void do_unbind(const mbox_t &from, const msink_t &dest) noexcept
bindings_map_t m_bindings
All bindings.
void do_bind(const mbox_t &from, const msink_t &dest, delivery_filter_unique_ptr_t delivery_filter)
void do_unbind_all_for(const mbox_t &from, const msink_t &dest) noexcept
iterator_type operator->() const
~insertion_it_with_auto_erase_if_not_committed_t() noexcept
insertion_it_with_auto_erase_if_not_committed_t(const insertion_it_with_auto_erase_if_not_committed_t &)=delete
insertion_it_with_auto_erase_if_not_committed_t(insertion_it_with_auto_erase_if_not_committed_t &&)=delete
bool modified() const noexcept
insertion_it_with_auto_erase_if_not_committed_t(Container &container, typename Container::key_type const &k)
Initializing constructor.
Helper class for managing multiple sink bindings.
multi_sink_binding_t & operator=(multi_sink_binding_t &&)=delete
void bind(const mbox_t &from, const msink_t &dest)
multi_sink_binding_t()=default
void bind(const mbox_t &from, const msink_t &dest, delivery_filter_unique_ptr_t delivery_filter)
void unbind(const mbox_t &from, const msink_t &dest) noexcept
void bind(const mbox_t &from, const msink_t &dest, Lambda &&filter)
multi_sink_binding_t & operator=(const multi_sink_binding_t &)=delete
multi_sink_binding_t(multi_sink_binding_t &&)=delete
void unbind_all_for(const mbox_t &from, const msink_t &dest) noexcept
multi_sink_binding_t(const multi_sink_binding_t &)=delete
A class for the name which cannot be empty.
Helper class for indication of long-lived reference via its type.
Special container for holding select parameters and select cases.
auto & data() const noexcept
friend prepared_select_t< sizeof...(Cases) > prepare_select(mchain_select_params_t< Msg_Count_Status > params, Cases &&... cases)
Create prepared select statement to be used later.
prepared_select_t & operator=(prepared_select_t &&other) noexcept
Move operator.
prepared_select_t(prepared_select_t &&other) noexcept
Move constructor.
prepared_select_t & operator=(const prepared_select_t &)=delete
std::unique_ptr< mchain_props::details::prepared_select_data_t< Cases_Count > > m_data
The actual prepared-select object.
prepared_select_t(mchain_select_params_t< mchain_props::msg_count_status_t::defined > params, Cases &&... cases)
Initializing constructor.
prepared_select_t(const prepared_select_t &)=delete
bool empty() const noexcept
Is this handle empty?
friend void swap(prepared_select_t &a, prepared_select_t &b) noexcept
Swap operation.
Helper class for managing single sink bindings.
void bind(const mbox_t &source, const msink_t &sink_owner)
single_sink_binding_t(single_sink_binding_t &&other) noexcept
single_sink_binding_t(const single_sink_binding_t &)=delete
single_sink_binding_t & operator=(single_sink_binding_t &&other) noexcept
std::optional< binding_info_t > m_info
void bind(const mbox_t &source, const msink_t &sink_owner, delivery_filter_unique_ptr_t delivery_filter)
single_sink_binding_t & operator=(const single_sink_binding_t &)=delete
void bind(const mbox_t &source, const msink_t &sink_owner, Lambda &&filter)
bool empty() const noexcept
bool has_value() const noexcept
void bind_for_msg_type(const std::type_index &msg_type, const mbox_t &source, const msink_t &sink_owner)
friend void swap(single_sink_binding_t &a, single_sink_binding_t &b) noexcept
single_sink_binding_t() noexcept=default
void bind_for_msg_type(const std::type_index &msg_type, const mbox_t &source, const msink_t &sink_owner, delivery_filter_unique_ptr_t delivery_filter)
~single_sink_binding_t() noexcept
An interface of stop_guard entity.
Main class for auto join operation.
std::array< std::thread *, N > m_threads
friend void swap(auto_joiner_t &a, auto_joiner_t &b) noexcept
auto_joiner_t & operator=(const auto_joiner_t &)=delete
auto_joiner_t(auto_joiner_t &&o) noexcept
auto_joiner_t(const auto_joiner_t &)=delete
void set_thread(std::size_t index, std::thread &t)
auto_joiner_t & operator=(auto_joiner_t &&o) noexcept
std::string query_name() const override
Get the mbox name.
void modify_and_remove_subscriber_if_needed(const std::type_index &msg_type, abstract_message_sink_t &subscriber, Info_Changer changer)
void do_deliver_message_impl(typename Tracing_Base::deliver_op_tracer const &tracer, message_delivery_mode_t delivery_mode, const std::type_index &msg_type, const message_ref_t &message, unsigned int redirection_deep)
environment_t & environment() const noexcept override
SObjectizer Environment for which the mbox is created.
void do_deliver_message(message_delivery_mode_t delivery_mode, const std::type_index &msg_type, const message_ref_t &message, unsigned int redirection_deep) override
Deliver message for all subscribers with respect to message limits.
void insert_or_modify_subscriber(const std::type_index &msg_type, abstract_message_sink_t &subscriber, Info_Maker maker, Info_Changer changer)
void subscribe_event_handler(const std::type_index &msg_type, abstract_message_sink_t &subscriber) override
Add the message handler.
actual_mbox_t(mbox_id_t id, outliving_reference_t< environment_t > env, Tracing_Args &&... args)
void drop_delivery_filter(const std::type_index &msg_type, abstract_message_sink_t &subscriber) noexcept override
Removes delivery filter for message type and subscriber.
mbox_type_t type() const override
Get the type of message box.
void set_delivery_filter(const std::type_index &msg_type, const delivery_filter_t &filter, abstract_message_sink_t &subscriber) override
Set a delivery filter for message type and subscriber.
void do_deliver_message_to_subscriber(const subscriber_info_t &subscriber_info, typename Tracing_Base::deliver_op_tracer const &tracer, message_delivery_mode_t delivery_mode, const std::type_index &msg_type, const message_ref_t &message, unsigned int redirection_deep) const
void unsubscribe_event_handler(const std::type_index &msg_type, abstract_message_sink_t &subscriber) noexcept override
Remove all message handlers.
mbox_id_t id() const override
Unique ID of this mbox.
void stop()
Send stop signal to environment.
wrapped_env_t(wait_init_completion_t wait_init_completion_indicator, so_5::generic_simple_init_t init_func, environment_params_t &¶ms)
A constructor for synchronous mode which receives initialization function and already prepared enviro...
void stop_then_join()
Send stop signal and wait for complete finish of environment's work.
wrapped_env_t(so_5::generic_simple_init_t init_func, environment_params_t &¶ms)
wrapped_env_t(const wrapped_env_t &)=delete
std::unique_ptr< details_t > m_impl
Implementation details.
wrapped_env_t(environment_params_t &¶ms)
A constructor which receives already prepared environment's params.
wrapped_env_t(so_5::generic_simple_init_t init_func)
A constructor which receives only initialization function.
wrapped_env_t(wrapped_env_t &&)=delete
wrapped_env_t()
Default constructor.
static constexpr wait_init_completion_t wait_init_completion
Special indicator that tells that synchronous mode has to be used for calling init-function.
~wrapped_env_t()
Destructor.
wrapped_env_t(wait_init_completion_t wait_init_completion_indicator, so_5::generic_simple_init_t init_func, so_5::generic_simple_so_env_params_tuner_t params_tuner)
A constructor for synchronous mode which receives initialization function and a function for environm...
wrapped_env_t(wait_init_completion_t wait_init_completion_indicator, so_5::generic_simple_init_t init_func)
A constructor for synchronous mode which receives only initialization function.
wrapped_env_t(so_5::generic_simple_init_t init_func, so_5::generic_simple_so_env_params_tuner_t params_tuner)
A constructor which receives initialization function and a function for environment's params tuning.
void join()
Wait for complete finish of environment's work.
environment_t & environment() const
Access to wrapped environment.
wrapped_env_t(so_5::generic_simple_init_t init_func, environment_params_t &¶ms, wrapped_env_details::init_style_t init_style)
The main initializing constructor.
wait_init_completion_t
Helper type to be used as indicator of synchronous mode.
#define SO_5_THROW_EXCEPTION(error_code, desc)
Some reusable and low-level classes/functions which can be used in public header files.
bool wait_for_big_interval(std::unique_lock< std::mutex > &lock, std::condition_variable &cv, std::chrono::steady_clock::duration timeout, Predicate pred)
Helper function for safe call of condition_variable::wait_for with possible big timeouts.
envelope_t & message_to_envelope(const message_ref_t &src_msg)
A helper function for casting message instance to envelope instance.
access_context_t
Information about context on that enveloped message is handled.
trigger_holder_t< incident_status_t::handled > operator&(trigger_holder_t< incident_status_t::handled > &&old_holder, wait_event_handler_completion_t)
A helper operator to create a tigger that requires the completion of an event handler.
trigger_holder_t< Status > operator&(trigger_holder_t< Status > &&old_holder, store_msg_inspection_result_t inspection_info)
A helper operator to create a tigger that inspects the incoming message and stores the result into th...
trigger_holder_t< incident_status_t::handled > operator&(const mbox_t &from, receives_indicator_t< Msg >)
A helper operator to create a tigger that receives a message/signal from specified mbox.
trigger_holder_t< Status > operator&(const so_5::agent_t &agent, const trigger_source_t< Status > &src)
A helper operator to create a trigger for the specified agent.
incident_status_t
What happened with source of an event.
@ handled
Message or signal has been handled.
@ ignored
Message or signal has been ignored.
trigger_holder_t< incident_status_t::handled > operator&(trigger_holder_t< incident_status_t::handled > &&old_holder, store_agent_state_name_t data_to_store)
A helper operator to create a tigger that stores the name of the current agent's state.
environment_params_t make_special_params(outliving_reference_t< testing_env_t::internals_t > internals, environment_params_t &¶ms)
void setup_special_queue_hook(outliving_reference_t< testing_env_t::internals_t > internals, environment_params_t &to)
environment_params_t make_tuned_params(so_5::generic_simple_so_env_params_tuner_t env_params_tuner)
queue_mode_t
A mode of work for special_event_queue.
@ direct
All messages should go to the original queue without buffering.
@ buffer
All messages must be stored locally.
scenario_result_t completed()
Create a value that means that scenario completed successfuly.
details::receives_indicator_t< Msg > receives()
Helper function to be used for a trigger that receives a message/singal from a mbox.
details::trigger_source_t< details::incident_status_t::ignored > ignores()
Define a trigger that activates when an agent rejects a message from the direct mbox.
scenario_status_t
Status of testing scenario.
@ completed
Testing scenario is successfuly completed.
details::constraint_unique_ptr_t not_after(std::chrono::steady_clock::duration pause)
Create a constraint not-after.
details::store_msg_inspection_result_t inspect_msg(std::string tag, Lambda &&inspector)
Create a special marker for a trigger for inspecting an incoming message and storing the inspection r...
details::store_agent_state_name_t store_state_name(std::string tag)
Create a special marker for a trigger for storing agent's state name inside scenario.
details::trigger_source_t< details::incident_status_t::handled > reacts_to()
Define a trigger that activates when an agent receives and handles a message from the direct mbox.
details::trigger_source_t< details::incident_status_t::handled > reacts_to(const so_5::mbox_t &mbox)
Define a trigger that activates when an agent receives and handles a message from the specific mbox.
details::constraint_unique_ptr_t not_before(std::chrono::steady_clock::duration pause)
Create a constraint not-before.
details::trigger_source_t< details::incident_status_t::ignored > ignores(const so_5::mbox_t &mbox)
Define a trigger that activates when an agent rejects a message from the direct mbox.
details::wait_event_handler_completion_t wait_event_handler_completion()
Create a special marker for a trigger that requires waiting for completion of an event handler.
Implementation details for MPMC mboxes.
Details of SObjectizer run-time implementations.
void add_to_closer(Closer &to, std::size_t index, mchain_t ch, Tail &&... tail)
Helper for filling auto_closer object.
void add_to_closer(Closer &to, std::size_t index, mchain_t ch)
Helper for filling auto_closer object.
void fill_select_cases_holder(extensible_select_cases_holder_t &holder, select_case_unique_ptr_t c, Cases &&... other_cases)
mchain_select_result_t perform_select(const mchain_select_params_t< msg_count_status_t::defined > ¶ms, const Cases_Holder &cases_holder)
Helper function with implementation of main select action.
prepared_select_status_t
The current status of prepared-select instance.
@ passive
Prepared-select instance is not used in select() call.
@ active
Prepared-select instance is used in select() call now.
void fill_select_cases_holder(Holder &holder, std::size_t index, select_case_unique_ptr_t c, Cases &&... other_cases)
mchain_select_result_t do_adv_select_without_total_time(const mchain_select_params_t< msg_count_status_t::defined > ¶ms, const Holder &select_cases)
extensible_select_status_t
The current status of extensible-select instance.
@ passive
Extensible-select instance is not used in select() call.
@ active
Extensible-select instance is used in select() call now.
void fill_select_cases_holder(Holder &holder, std::size_t index, select_case_unique_ptr_t c)
mchain_select_result_t do_adv_select_with_total_time(const mchain_select_params_t< msg_count_status_t::defined > ¶ms, const Holder &select_cases)
void fill_select_cases_holder(extensible_select_cases_holder_t &)
Various properties and parameters of message chains.
close_mode_t
What to do with chain's content at close.
overflow_reaction_t
What reaction must be performed on attempt to push new message to the full message chain.
msg_count_status_t
Status of limit for messages to be extracted/handled during a bulk operation on a mchain.
@ undefined
Message count limit is not set yet.
@ defined
Message count limit is set.
extraction_status_t
Result of extraction of message from a message chain.
@ no_messages
No available messages in the chain.
memory_usage_t
Memory allocation for storage for size-limited chains.
insertion_it_with_auto_erase_if_not_committed_t(C &, const K &) -> insertion_it_with_auto_erase_if_not_committed_t< C >
void ensure_valid_argument_for_delivery_filter()
Helper to have more information in compiler output if static_assert fails.
void add_to_joiner(Joiner &to, std::size_t index, std::thread &t)
Helper for filling auto_joiner object.
void add_to_joiner(Joiner &to, std::size_t index, std::thread &t, Tail &&... tail)
Helper for filling auto_joiner object.
init_style_t
Style of handling init-functor in the constructor of wrapped_env.
Private part of message limit implementation.
mchain_t create_mchain(environment_t &env, std::size_t max_size, mchain_props::memory_usage_t memory_usage, mchain_props::overflow_reaction_t overflow_reaction)
Create size-limited chain without waiting on overflow.
message_delivery_mode_t
Possible modes of message/signal delivery.
void launch(Init_Routine &&init_routine)
Launch a SObjectizer Environment with default parameters.
mchain_t create_mchain(wrapped_env_t &sobj)
Create size-unlimited chain.
thread_auto_join_details::auto_joiner_t< 1+sizeof...(Tail) > auto_join(std::thread &first_thread, Tail &&... tail)
Helper function for creation of automatic joiner of std::threads.
mbox_type_t
Type of the message box.
mbox_t make_unique_subscribers_mbox(so_5::environment_t &env)
Factory function for creation of a new instance of unique_subscribers mbox.
auto make_coop_reg_notificator(mbox_t target) noexcept
Create notificator about cooperation registration completion.
void bind_transformer(Binding &binding, const so_5::mbox_t &src_mbox, Transformer &&transformer)
Helper function to add transform_then_redirect msink to a binding object.
void bind_transformer(Binding &binding, const so_5::mbox_t &src_mbox, Transformer &&transformer, Delivery_Filter &&delivery_filter)
Helper function to add transform_then_redirect msink to a binding object (with a delivery filter).
mchain_auto_close_details::auto_closer_t< sizeof...(Tail) > auto_close_drop_content(Tail &&... tail)
Helper function for automatic closing of mchains with dropping their content.
mchain_t create_mchain(environment_t &env)
Create size-unlimited chain.
void add_select_cases(extensible_select_t &extensible_select, Cases &&... cases)
Add a portion of cases to extensible-select instance.
mchain_select_params_t< mchain_props::msg_count_status_t::undefined > from_all()
Helper function for creation of mchain_select_params instance with default values.
mchain_t create_mchain(environment_t &env, mchain_props::duration_t waiting_time, std::size_t max_size, mchain_props::memory_usage_t memory_usage, mchain_props::overflow_reaction_t overflow_reaction)
Create size-limited chain with waiting on overflow.
mchain_select_result_t select(const mchain_select_params_t< Msg_Count_Status > ¶ms, Cases &&... cases)
An advanced form of multi chain select.
@ user_type_message
Message is an user type message.
@ enveloped_msg
Message is an envelope with some other message inside.
mchain_auto_close_details::auto_closer_t< sizeof...(Tail) > auto_close_retain_content(Tail &&... tail)
Helper function for automatic closing of mchains with retaining their content.
mchain_select_result_t select(const extensible_select_t &extensible_select)
A select operation to be done on previously prepared extensible-select object.
mchain_auto_close_details::auto_closer_t< sizeof...(Tail) > auto_close_mchains(mchain_props::close_mode_t close_mode, Tail &&... tail)
Helper function for creation of automatic closer of mchains.
message_ownership_t
Type of ownership of a message instance inside message_holder.
delivery_possibility_t
Result of checking delivery posibility.
mchain_props::select_case_unique_ptr_t receive_case(mchain_t chain, Handlers &&... handlers)
A helper for creation of select_case object for one multi chain select.
mchain_t create_mchain(wrapped_env_t &sobj, mchain_props::duration_t waiting_time, std::size_t max_size, mchain_props::memory_usage_t memory_usage, mchain_props::overflow_reaction_t overflow_reaction)
Create size-limited chain without waiting on overflow.
mchain_props::select_case_unique_ptr_t send_case(mchain_t chain, message_holder_t< Msg, Ownership > msg, On_Success_Handler &&handler)
A helper for creation of select_case object for one send-case of a multi chain select.
mchain_select_result_t select(const prepared_select_t< Cases_Count > &prepared)
A select operation to be done on previously prepared select params.
auto make_coop_dereg_notificator(mbox_t target) noexcept
Create notificator about cooperation deregistration completion.
mchain_t create_mchain(wrapped_env_t &sobj, std::size_t max_size, mchain_props::memory_usage_t memory_usage, mchain_props::overflow_reaction_t overflow_reaction)
Create size-limited chain without waiting on overflow.
void bind_transformer(Binding &binding, const so_5::mbox_t &src_mbox, Transformer &&transformer)
Helper function to add transform_then_redirect msink to a binding object.
void bind_transformer(Binding &binding, const so_5::mbox_t &src_mbox, Transformer &&transformer, Delivery_Filter &&filter)
Helper function to add transform_then_redirect msink to a binding object (with a delivery filter).
void launch(Init_Routine &&init_routine, Params_Tuner &¶ms_tuner)
Launch a SObjectizer Environment with explicitely specified parameters.
prepared_select_t< sizeof...(Cases) > prepare_select(mchain_select_params_t< Msg_Count_Status > params, Cases &&... cases)
Create prepared select statement to be used later.
A selector of actual lock_holder type in dependency of lock type.
A description of event execution demand.
demand_handler_pfn_t m_demand_handler
Demand handler.
const agent_t * m_agent
Target of an event.
const std::type_index m_msg_type
Type of message or signal.
incident_info_t(const agent_t *agent, const std::type_index &msg_type, mbox_id_t src_mbox_id)
mbox_id_t m_src_mbox_id
ID of mbox from that message/signal was received.
catcher_info_t(const agent_t *target_agent)
Initializing constructor.
const agent_t * m_target_agent
Pointer to the agent.
Special indicator to be used in implementation of receives trigger.
A special data object for case of store-state-name completion action.
std::string m_tag
Name of tag for store-state-name action.
A special data object for case when a message inspector has to be used on an incoming message.
std::function< std::string(const message_ref_t &) > m_inspector
Inspector for a message.
std::string m_tag
Name of a tag for store-msg-inspection action.
Description of context on that an attempt to activate a trigger is performing.
const scenario_in_progress_accessor_t & m_scenario_accessor
Access to the running scenario.
abstract_scenario_step_t & m_step
The current step for that activation is being performed.
const message_ref_t & m_incoming_msg
Incoming message or signal.
Description of context on that a trigger is completed.
abstract_scenario_step_t & m_step
const scenario_in_progress_accessor_t & m_scenario_accessor
std::type_index m_msg_type
trigger_source_t(std::type_index msg_type)
optional< mbox_id_t > m_src_mbox_id
trigger_source_t(std::type_index msg_type, mbox_id_t src_mbox_id)
A special data object for case when a step should be completed only after returning from the event ha...
A helper object for synchronization between helper worker where testing environment is launched and u...
std::promise< void > m_completed
Internal data for testing environment.
impl::init_completed_data_t m_init_completed
impl::special_event_queue_hook_t m_special_hook
details::real_scenario_t m_scenario
static std::unique_ptr< internals_t > make()
Helper type that tells that subscription is present.
Description of one demand in message chain.
A helper class for detection of payload type of message.
Message about cooperation deregistration completion.
msg_coop_deregistered(coop_handle_t coop, coop_dereg_reason_t reason) noexcept
msg_coop_deregistered & operator=(const msg_coop_deregistered &)=delete
msg_coop_deregistered(const msg_coop_deregistered &)=delete
msg_coop_deregistered & operator=(msg_coop_deregistered &&)=delete
msg_coop_deregistered(msg_coop_deregistered &&)=delete
const coop_handle_t m_coop
const coop_dereg_reason_t m_reason
Message about cooperation registration completion.
msg_coop_registered & operator=(msg_coop_registered &&)=delete
msg_coop_registered(const msg_coop_registered &)=delete
msg_coop_registered(coop_handle_t coop) noexcept
const coop_handle_t m_coop
msg_coop_registered & operator=(const msg_coop_registered &)=delete
msg_coop_registered(msg_coop_registered &&)=delete
binding_info_t(const mbox_t &source, const std::type_index &msg_type, const msink_t &sink_owner, delivery_filter_unique_ptr_t delivery_filter) noexcept
std::type_index m_msg_type
Type of message/signal.
msink_t m_sink_owner
The destination for messages/signals.
mbox_t m_source
The source mbox.
delivery_filter_unique_ptr_t m_delivery_filter
Optional delivery filter.
Helper metafunction to check delivery filter lambda.
A coolection of data required for local mbox implementation.
environment_t & m_env
Environment for which the mbox is created.
messages_table_t m_subscribers
Map of subscribers to messages.
const mbox_id_t m_id
ID of this mbox.
data_t(mbox_id_t id, environment_t &env)
Implementation details for wrapped_env.