SObjectizer  5.8
Loading...
Searching...
No Matches
single_sink_binding.hpp
Go to the documentation of this file.
1/*
2 * SObjectizer-5
3 */
4
5/*!
6 * \file
7 * \brief Stuff for single_sink_binding implementation.
8 *
9 * \since v.5.8.0
10 */
11
12#pragma once
13
14#include <so_5/mbox.hpp>
15
16#include <so_5/details/rollback_on_exception.hpp>
17
18#include <optional>
19#include <type_traits>
20
21namespace so_5
22{
23
25{
26
27/*!
28 * \brief Helper metafunction to check delivery filter lambda.
29 *
30 * A delivery filter lambda can be specified in two forms:
31 * \code
32 * // The first: explicit message type as argument.
33 * [](const some_msg & msg) -> bool {...}
34 *
35 * // The second: auto detection of a message type.
36 * [](const auto & msg) -> bool {...}
37 * \endcode
38 *
39 * In the first case the type of message can be checked and error
40 * can be raised at the compile-time if a delivery filter is specified
41 * for a different message type. For example:
42 * \code
43 * struct msg_A {...};
44 * struct msg_B {...};
45 *
46 * // NOTE: it's an error!
47 * binding.bind<msg_A>(source, dest, [](const msg_B & msg) {...});
48 * \endcode
49 *
50 * This helper metafunction allows to check if delivery filter lambda
51 * have an argument with explicitly specified type.
52 *
53 * \since v.5.8.1
54 */
55template< typename Lambda, typename = void >
57
58/*!
59 * \brief Specialization for a case when delivery filter lambda has an argument
60 * with explicitly specified type.
61 *
62 * \since v.5.8.1
63 */
64template< typename Lambda >
65struct lambda_with_detectable_arg_type_t<
66 Lambda,
67 typename std::void_t<
68 typename so_5::details::lambda_traits::argument_type_if_lambda< Lambda >::type >
69 > : public std::true_type
70 {
71 using argument_t =
73 };
74
75/*!
76 * @brief Helper to have more information in compiler output if static_assert
77 * fails.
78 *
79 * If static_assert fails compiler will show actual names of Subscription_Type
80 * and Delivery_Filter_Arg_Type in an error message.
81 */
82template<
83 typename Subscription_Type,
84 typename Delivery_Filter_Arg_Type>
85void
87 {
88 static_assert(
90 "delivery filter lambda expects a different message type" );
91 }
92
93} /* namespace sink_bindings_details */
94
95//
96// single_sink_binding_t
97//
98/*!
99 * \brief Helper class for managing single sink bindings.
100 *
101 * An instance of single_sink_binding_t drops the binding in the destructor.
102 * If it's necessary to drop the binding manually then clear()/unbind() methods
103 * can be used.
104 *
105 * Usage examples:
106 * \code
107 * // Use as a part of an agent.
108 * class coordinator final : public so_5::agent_t
109 * {
110 * const so_5::mbox_t broadcasting_mbox_;
111 * so_5::single_sink_binding_t bindings_;
112 * ...
113 * void on_some_event(mhood_t<msg_some_command> cmd) {
114 * // Create a child coop and bind an agent to broadcasting mbox.
115 * so_5::introduce_child_coop(*this, [](so_5::coop_t & coop) {
116 * auto * worker = coop.make_agent<worker>(...);
117 * auto worker_msink = so_5::wrap_to_msink(worker->so_direct_mbox());
118 *
119 * bindings_.bind<msg_some_data>(broadcasting_mbox_, worker_msink);
120 * ...
121 * });
122 * }
123 * };
124 *
125 * // Use as object controlled by a coop.
126 * so_5::environment_t & env = ...;
127 * env.introduce_coop([](so_5::coop_t & coop) {
128 * const auto broadcasting_mbox = coop.environment().create_mbox();
129 * auto * first = coop.make_agent<first_worker>(...);
130 * auto * first_binding = coop.take_under_control(
131 * std::make_unique<so_5::single_sink_binding_t>() );
132 * first_binding->bind<msg_some_data>(broadcasting_mbox,
133 * so_5::wrap_to_msink(first->so_direct_mbox()));
134 *
135 * auto * second = coop.make_agent<second_worker>(...);
136 * auto * second_binding = coop.take_under_control(
137 * std::make_unique<so_5::single_sink_binding_t>() );
138 * second_binding->bind<msg_some_data>(broadcasting_mbox,
139 * so_5::wrap_to_msink(second->so_direct_mbox()));
140 * ...
141 * });
142 * \endcode
143 *
144 * There is a principial difference between single_sink_binding_t and
145 * multi_sink_binding_t: if bind() is called for single_sink_binding_t when
146 * the binding is exists, then old binding will be dropped and new binding will
147 * be created. For example, this is a valid behavior for single_sink_binding_t:
148 * \code
149 * const so_5::mbox_t & source = ...;
150 * const so_5::msink_t & dest = ...;
151 * binding.bind<my_message>(source, dest); // New binding created.
152 * ...
153 * binding.bind<my_message>(source, dest); // Old binding will be removed
154 * // and new binding will be created (despite the fact that source and dest
155 * // are the same).
156 * \endcode
157 * Contrary, multi_sink_binding_t::bind() throws if a binding for triplet
158 * (message, source, dest) already exists.
159 *
160 * \attention
161 * The instance of single_sink_binding_t is not thread safe. If a user wants
162 * to work with an instance of single_sink_binding_t from different
163 * threads then the user has to protect the instance by her/himself.
164 *
165 * \note
166 * This class is Moveable, but is not Copyable.
167 *
168 * \since v.5.8.0
169 */
171 {
172 /*!
173 * Actual information about binding.
174 */
176 {
177 //! The source mbox.
178 mbox_t m_source;
179 //! Type of message/signal.
181 //! The destination for messages/signals.
183 //! Optional delivery filter.
184 /*!
185 * May be nullptr. Can't be used for signals.
186 */
188
190 const mbox_t & source,
191 const std::type_index & msg_type,
192 const msink_t & sink_owner,
193 delivery_filter_unique_ptr_t delivery_filter ) noexcept
194 : m_source{ source }
198 {}
199 };
200
201 /*!
202 * Information about the current binding.
203 *
204 * Empty value means that there is no binding at the moment.
205 */
207
208 public:
209 friend void
211 {
212 using std::swap;
213 swap( a.m_info, b.m_info );
214 }
215
216 single_sink_binding_t() noexcept = default;
217
218// NOTE: this pragma was added because of a problem with GCC-13/14 with
219// -Werror, -Wall, -Wpedantic. GCC-13/14 complained sometimes
220// (test/so_5/mbox/sink_binding/single_sink_too_deep/main.cpp) about the use of
221// uninitialized pointer somewhere inside implementation of std::unique_ptr.
222// It seems to be a bug in the compiler.
223#if defined(__GNUG__) && !defined(__clang__)
224#pragma GCC diagnostic push
225#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
226#endif
228 {
229 clear();
230 }
231#if defined(__GNUG__) && !defined(__clang__)
232#pragma GCC diagnostic pop
233#endif
234
236 const single_sink_binding_t & ) = delete;
239 const single_sink_binding_t & ) = delete;
240
242 single_sink_binding_t && other ) noexcept
244 {}
245
248 single_sink_binding_t && other ) noexcept
249 {
250 single_sink_binding_t tmp{ std::move(other) };
251 swap( *this, tmp );
252 return *this;
253 }
254
255 /*!
256 * \retval true if binding exists
257 * \retval false if there is no binding at the moment.
258 */
259 [[nodiscard]]
260 bool
261 has_value() const noexcept { return m_info.has_value(); }
262
263 /*!
264 * \retval false if binding exists
265 * \retval true if there is no binding at the moment.
266 */
267 [[nodiscard]]
268 bool
269 empty() const noexcept { return !has_value(); }
270
271 /*!
272 * Remove the current binding.
273 *
274 * It's safe to call this method even if there is no binding
275 * at the moment.
276 *
277 * The object can be used for creation of a new binding after calling
278 * clear() method. For example:
279 * \code
280 * so_5::single_sink_binding_t & binding = ...;
281 *
282 * binding.clear(); // Object is empty now.
283 *
284 * const so_5::mbox_t & source = ...;
285 * const so_5::msink_t & dest = ...;
286 * binding.bind<my_message>(source, dest); // New binding created.
287 * \endcode
288 */
289 void
290 clear() noexcept
291 {
292 if( m_info.has_value() )
293 {
294 if( m_info->m_delivery_filter )
295 {
296 m_info->m_source->drop_delivery_filter(
297 m_info->m_msg_type,
298 m_info->m_sink_owner->sink() );
299 m_info->m_delivery_filter.reset();
300 }
301
302 m_info->m_source->unsubscribe_event_handler(
303 m_info->m_msg_type,
304 m_info->m_sink_owner->sink() );
305
306 m_info.reset();
307 }
308 }
309
310 /*!
311 * A synonym for the clear() method.
312 */
313 void
314 unbind() noexcept
315 {
316 clear();
317 }
318
319 /*!
320 * Helper method for creation of a new binding for case when
321 * the type of message/signal is represented as std::type_index.
322 *
323 * \note
324 * This method is intended to be used for internal use. It's not
325 * guaranteed that it won't be changed (or removed) in future
326 * versions of SObjectizer.
327 */
328 void
330 //! Type of the message/signal.
331 const std::type_index & msg_type,
332 //! The source mbox.
333 const mbox_t & source,
334 //! The destination for messages/signals.
335 const msink_t & sink_owner )
336 {
337 // Previous binding has to be dropped.
338 clear();
339
340 source->subscribe_event_handler(
341 msg_type,
342 sink_owner->sink() );
343
344 // Don't expect that this action can throw!
345 so_5::details::invoke_noexcept_code( [&] {
346 m_info = binding_info_t{
347 source, msg_type, sink_owner, delivery_filter_unique_ptr_t{}
348 };
349 } );
350 }
351
352 /*!
353 * Create a binding for message/signal of type \a Msg from mbox \a source
354 * to the destination \a sink_owner.
355 *
356 * This binding won't use a delivery filter.
357 *
358 * If the object already holds a binding the current binding will be
359 * removed before the creation of a new one.
360 *
361 * Usage example:
362 * \code
363 * const so_5::mbox_t & source = ...;
364 * const so_5::msink_t & dest = ...;
365 * auto binding = std::make_unique< so_5::single_sink_binding_t >();
366 *
367 * binding->bind<my_message>(source, dest);
368 * \endcode
369 *
370 * It it's required to make a binding for a mutable message then
371 * so_5::mutable_msg marker has to be used:
372 * \code
373 * const so_5::mbox_t & source = ...;
374 * const so_5::msink_t & dest = ...;
375 * auto binding = std::make_unique< so_5::single_sink_binding_t >();
376 *
377 * binding->bind< so_5::mutable_msg<my_message> >(source, dest);
378 * \endcode
379 */
380 template< typename Msg >
381 void
383 //! The source mbox.
384 const mbox_t & source,
385 //! The destination for messages/signals.
386 const msink_t & sink_owner )
387 {
388 this->bind_for_msg_type(
390 source,
391 sink_owner );
392 }
393
394 /*!
395 * Helper method for creation of a new binding for case when
396 * the type of message is represented as std::type_index.
397 *
398 * If the object already holds a binding the current binding will be
399 * removed before the creation of a new one.
400 *
401 * \note
402 * This method is intended to be used for internal use. It's not
403 * guaranteed that it won't be changed (or removed) in future
404 * versions of SObjectizer.
405 *
406 * \note
407 * This method can't be used for binding signals.
408 */
409 void
411 //! The type of the message.
412 const std::type_index & msg_type,
413 //! The source mbox.
414 const mbox_t & source,
415 //! The destination for messages.
416 const msink_t & sink_owner,
417 //! Delivery filter to be used. It shouldn't be nullptr.
418 delivery_filter_unique_ptr_t delivery_filter )
419 {
420 so_5::low_level_api::ensure_not_null( delivery_filter );
421
422 // Previous binding has to be dropped.
423 clear();
424
425 // Assume that this check was performed by caller.
426 // ensure_not_signal< Msg >();
427
428 source->set_delivery_filter(
429 msg_type,
430 *delivery_filter,
431 sink_owner->sink() );
432
433 so_5::details::do_with_rollback_on_exception(
434 [&]() {
435 source->subscribe_event_handler(
436 msg_type,
437 sink_owner->sink() );
438 },
439 [&]() {
440 source->drop_delivery_filter( msg_type, sink_owner->sink() );
441 } );
442
443 // Don't expect that this action can throw!
444 so_5::details::invoke_noexcept_code( [&] {
445 m_info = binding_info_t{
446 source, msg_type, sink_owner, std::move(delivery_filter)
447 };
448 } );
449 }
450
451 /*!
452 * Create a binding for message of type \a Msg from mbox \a source
453 * to the destination \a sink_owner.
454 *
455 * This binding should use delivery filter \a delivery_filter.
456 *
457 * If the object already holds a binding the current binding will be
458 * removed before the creation of a new one.
459 *
460 * \note
461 * This method can't be used for binding signals.
462 */
463 template< typename Msg >
464 void
466 //! The source mbox.
467 const mbox_t & source,
468 //! The destination for messages.
469 const msink_t & sink_owner,
470 //! Delivery filter to be used. It shouldn't be nullptr.
471 delivery_filter_unique_ptr_t delivery_filter )
472 {
474
476
479 source,
482 }
483
484 /*!
485 * Create a binding for message of type \a Msg from mbox \a source
486 * to the destination \a sink_owner.
487 *
488 * The lambda (or functor) \a filter will be used as delivery filter
489 * for messages.
490 *
491 * If the object already holds a binding the current binding will be
492 * removed before the creation of a new one.
493 *
494 * \note
495 * This method can't be used for binding signals.
496 *
497 * Usage example:
498 * \code
499 * const so_5::mbox_t & source = ...;
500 * const so_5::msink_t & dest = ...;
501 * auto binding = std::make_unique< so_5::single_sink_binding_t >();
502 *
503 * binding->bind<my_message>(source, dest,
504 * [](const my_message & msg) {
505 * ... // should return `true` or `false`.
506 * });
507 * \endcode
508 *
509 * It it's required to make a binding for a mutable message then
510 * so_5::mutable_msg marker has to be used, but note the type of
511 * delivery filter argument:
512 * \code
513 * const so_5::mbox_t & source = ...;
514 * const so_5::msink_t & dest = ...;
515 * auto binding = std::make_unique< so_5::single_sink_binding_t >();
516 *
517 * binding->bind< so_5::mutable_msg<my_message> >(source, dest,
518 * [](const my_message & msg) {
519 * ... // should return `true` or `false`.
520 * });
521 * \endcode
522 */
523 template< typename Msg, typename Lambda >
524 void
526 //! The source mbox.
527 const mbox_t & source,
528 //! The destination for messages.
529 const msink_t & sink_owner,
530 //! Filter to be used.
531 Lambda && filter )
532 {
534
535 using detectable_arg_type =
537
539
540 if constexpr( detectable_arg_type::value )
541 {
542 // Type of filter lambda can be checked by a static_assert.
544
545 // Try to check delivery filter lambda argument type
546 // at the compile time.
550 >();
551
554 std::move(filter) )
555 );
556
557 }
558 else
559 {
560 // Assume that filter lambda is in form:
561 //
562 // [](const auto & msg) -> bool {...}
563 //
564 // so we don't know the type of the argument.
565
567
570 std::move(filter) )
571 );
572 }
573
575 }
576 };
577
578} /* namespace so_5 */
A base class for agents.
Definition agent.hpp:673
static demand_handler_pfn_t get_demand_handler_on_message_ptr() noexcept
Definition agent.cpp:1526
static demand_handler_pfn_t get_demand_handler_on_enveloped_msg_ptr() noexcept
Definition agent.cpp:1544
It's a kind of strong typedef for coop's deregistration reason.
Definition coop.hpp:80
Type of smart handle for a cooperation.
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.
SObjectizer Environment.
Interface of event_queue_hook object.
An interface of event queue for agent.
trigger_t & trigger() const noexcept
Get a reference to activated trigger.
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 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.
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.
token_t(abstract_scenario_step_t *activated_step, abstract_scenario_step_t::token_t step_token)
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.
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.
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 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.
Definition all.cpp:449
agent_unfreezer_t & operator=(const agent_unfreezer_t &)=delete
virtual void unfreeze() noexcept=0
Issue a command to unfreeze all frozen agents.
agent_unfreezer_t & operator=(agent_unfreezer_t &&)=delete
constraint_t & operator=(constraint_t &&)=delete
virtual void start() noexcept=0
Hook for step preactivation.
constraint_t & operator=(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 agent_t * register_new_catcher(const so_5::mbox_t &from) const
Helper for registration of a new agent.
const std::chrono::steady_clock::duration m_pause
Value to be used.
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.
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.
bool check(const incident_status_t, const incident_info_t &) const noexcept override
Check for fulfillment of constraint.
preactivate_actions_container_t m_preactivate_actions
All preactivation actions.
Definition all.cpp:143
std::size_t m_triggers_activated
Count of triggers those are activated.
Definition all.cpp:175
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
Definition all.cpp:256
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.
Definition all.cpp:210
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.
Definition all.cpp:353
void setup_constraints(constraint_container_t constraints) noexcept override
Setup constraints for the step.
Definition all.cpp:301
void preactivate() noexcept override
Perform preactivation of the step.
Definition all.cpp:203
std::size_t m_last_non_activated_trigger
Index of last trigger in the first part of trigger's container.
Definition all.cpp:166
status_t status() const noexcept override
Get the current status of the step.
Definition all.cpp:273
std::size_t m_triggers_to_completion
Count of activated triggers those are not completed yet.
Definition all.cpp:184
status_t m_status
The current state of the step.
Definition all.cpp:187
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.
Definition all.cpp:230
const std::string & name() const noexcept override
Get the name of the step.
Definition all.cpp:197
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.
Definition all.cpp:367
constraint_container_t m_constraints
All constraints.
Definition all.cpp:146
void add_preactivate_action(preactivate_action_t action) override
Add another preactivation action.
Definition all.cpp:279
void setup_triggers(trigger_container_t triggers, std::size_t triggers_to_activate) noexcept override
Setup triggers for the step.
Definition all.cpp:286
void no_handler_hook(const incident_info_t &info, const message_ref_t &incoming_msg) noexcept override
Definition all.cpp:656
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.
Definition all.cpp:737
bool has_stored_state_name(const std::string &step_name, const std::string &tag) const override
Check presence of the stored state name.
Definition all.cpp:719
std::size_t m_waiting_step_index
Index of the current preactivated step.
Definition all.cpp:499
std::set< abstract_scenario_step_t * > m_active_steps
Set of active step those are not completed yet.
Definition all.cpp:496
scenario_result_t result() const noexcept override
Get the result of scenario execution.
Definition all.cpp:566
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.
Definition all.cpp:682
bool has_stored_msg_inspection_result(const std::string &step_name, const std::string &tag) const override
Is there the inspection result?
Definition all.cpp:762
std::string stored_state_name(const std::string &step_name, const std::string &tag) const override
Get the stored state name.
Definition all.cpp:694
token_t react_on_pre_handler_hook(const incident_info_t &info, const message_ref_t &incoming_msg) noexcept
Definition all.cpp:789
std::condition_variable m_completion_cv
Condition variable for waiting completion of the scenario.
Definition all.cpp:480
void react_on_no_handler_hook(const incident_info_t &info, const message_ref_t &incoming_msg) noexcept
Definition all.cpp:833
void post_handler_hook(token_t token) noexcept override
Hook that should be called just after completion of event-handler.
Definition all.cpp:627
void run_for(std::chrono::steady_clock::duration run_time) override
Run the scenario until completion or for specific amount of time.
Definition all.cpp:577
agent_unfreezer_t * m_unfreezer
Unfreezer for registered agents.
Definition all.cpp:530
void setup_unfreezer(agent_unfreezer_t &unfreezer) noexcept
Set the unfreezer for registered agents.
Definition all.cpp:541
inspection_result_map_t m_stored_inspection_results
Container for holding stored inspection results for messages.
Definition all.cpp:524
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.
Definition all.cpp:672
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.
Definition all.cpp:607
step_definition_proxy_t define_step(nonempty_name_t step_name) override
Create a new step and return proxy for it.
Definition all.cpp:548
state_name_map_t m_stored_states
Container for holding stored state names.
Definition all.cpp:518
scenario_status_t m_status
The current state of the scenario.
Definition all.cpp:483
std::vector< step_unique_ptr_t > m_steps
Scenario's steps.
Definition all.cpp:489
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
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
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_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.
void set_completion(completion_function_t fn)
Setter for completion function.
Definition all.cpp:51
void set_activation(activation_function_t fn)
Setter for activation function.
Definition all.cpp:73
void activate(const trigger_activation_context_t &context) noexcept
Do activation of the trigger.
Definition all.cpp:114
bool check(const incident_status_t incident_status, const incident_info_t &info) const noexcept
Check for activation of the trigger.
Definition all.cpp:96
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.
Definition all.cpp:28
const agent_t & target_agent() const noexcept
Get the reference of the target agent.
Definition all.cpp:45
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?
Definition all.cpp:108
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.
Definition all.cpp:122
const agent_t & m_target_agent
A reference to the target agent.
outliving_reference_t< so_5::enveloped_msg::handler_invoker_t > m_invoker
Handler invoker that has to be used for extracted message.
Definition all.cpp:1079
invoker_for_message_extraction_t(outliving_reference_t< so_5::enveloped_msg::handler_invoker_t > invoker, so_5::enveloped_msg::access_context_t access_context)
Initializing constructor.
Definition all.cpp:1089
const so_5::enveloped_msg::access_context_t m_access_context
Context for accessing enveloped message.
Definition all.cpp:1082
bool handled() const noexcept
Has the message actually been handled?
Definition all.cpp:1128
void invoke(const so_5::enveloped_msg::payload_info_t &payload) noexcept override
Call an actual handler for the enveloped message/signal.
Definition all.cpp:1099
void invoke(const payload_info_t &payload) noexcept override
Call an actual handler for the enveloped message/signal.
Definition all.cpp:1061
no_handler_invoker_t(outliving_reference_t< special_envelope_t > owner)
Initializing constructor.
Definition all.cpp:1055
outliving_reference_t< special_envelope_t > m_owner
Owner of this invoker.
Definition all.cpp:1051
outliving_reference_t< handler_invoker_t > m_actual_invoker
Invoker to be used to call the actual event handler.
Definition all.cpp:1016
void invoke(const payload_info_t &payload) noexcept override
Call an actual handler for the enveloped message/signal.
Definition all.cpp:1030
pre_handler_hook_invoker_t(outliving_reference_t< special_envelope_t > owner, outliving_reference_t< handler_invoker_t > actual_invoker)
Intializing constructor.
Definition all.cpp:1020
outliving_reference_t< special_envelope_t > m_owner
Owner of this invoker.
Definition all.cpp:1013
outliving_reference_t< details::abstract_scenario_t > m_scenario
A testing scenario for that envelope.
Definition all.cpp:1000
special_envelope_t(outliving_reference_t< details::abstract_scenario_t > scenario, const execution_demand_t &demand)
Initializing constructor.
Definition all.cpp:1136
details::incident_info_t m_demand_info
Information about enveloped message.
Definition all.cpp:1002
void access_hook(access_context_t context, handler_invoker_t &invoker) noexcept override
Definition all.cpp:1165
delivery_result_t m_delivery_result
Was this message handled by a receiver?
Definition all.cpp:1007
void unfreeze() noexcept override
Issue a command to unfreeze all frozen agents.
Definition all.cpp:1490
outliving_reference_t< details::abstract_scenario_t > m_scenario
Testing scenario for that this object is created.
Definition all.cpp:1440
void on_unbind(agent_t *, event_queue_t *queue) noexcept override
A reaction to unbinding of an agent from some event_queue.
Definition all.cpp:1480
queue_mode_t m_mode
Mode of operation for new queues.
Definition all.cpp:1437
std::vector< special_event_queue_t * > m_created_queues
List of all queues created before unfreeze was called.
Definition all.cpp:1452
special_event_queue_hook_t(outliving_reference_t< details::abstract_scenario_t > scenario)
Definition all.cpp:1455
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.
Definition all.cpp:1462
std::vector< execution_demand_t > m_buffer
Local storage for demands to be used in buffered mode.
Definition all.cpp:1280
static bool is_ordinary_demand(const execution_demand_t &demand) noexcept
Definition all.cpp:1283
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)
Definition all.cpp:1303
void push_evt_finish(execution_demand_t demand) noexcept override
Enqueue a demand for evt_finish event.
Definition all.cpp:1344
queue_mode_t m_mode
The current mode of operation.
Definition all.cpp:1278
void push_evt_start(execution_demand_t demand) override
Enqueue a demand for evt_start event.
Definition all.cpp:1337
outliving_reference_t< event_queue_t > m_original_queue
Original event_queue.
Definition all.cpp:1275
void push(execution_demand_t demand) override
Enqueue new event to the queue.
Definition all.cpp:1313
outliving_reference_t< details::abstract_scenario_t > m_scenario
Testing scenario for that this queue was created.
Definition all.cpp:1273
stop_guard_for_unfreezer_t(outliving_reference_t< details::agent_unfreezer_t > unfreezer, outliving_reference_t< environment_t > env)
Definition all.cpp:1396
outliving_reference_t< details::agent_unfreezer_t > m_unfreezer
Definition all.cpp:1392
void stop() noexcept override
Perform stop-related actions.
Definition all.cpp:1404
step_definition_proxy_t define_step(nonempty_name_t step_name)
Start definition of a new scenario's step.
Definition all.cpp:1608
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.
Definition all.cpp:1628
std::string stored_msg_inspection_result(const std::string &step_name, const std::string &tag) const
Try to get stored msg inspection result.
Definition all.cpp:1644
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?
Definition all.cpp:1636
bool has_stored_msg_inspection_result(const std::string &step_name, const std::string &tag) const
Is there the inspection result?
Definition all.cpp:1652
void run_for(std::chrono::steady_clock::duration run_time)
Runs the scenario for specified amount of time.
Definition all.cpp:1621
scenario_proxy_t(outliving_reference_t< details::abstract_scenario_t > scenario)
Definition all.cpp:1602
scenario_result_t result() const
Get the result of scenario execution.
Definition all.cpp:1615
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)
friend std::ostream & operator<<(std::ostream &to, const scenario_result_t &v)
Dump of object's content to ostream.
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.
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_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.
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.
Definition all.cpp:1694
environment_t & environment() const
Access to wrapped environment.
Definition all.cpp:1688
testing_env_t(environment_params_t &&env_params)
Definition all.cpp:1671
scenario_proxy_t scenario() noexcept
Access to the associated scenario.
Definition all.cpp:1713
void join()
Wait for complete finish of environment's work.
Definition all.cpp:1700
void tune_environment_on_start(environment_t &env)
Definition all.cpp:1719
void stop_then_join()
Send stop signal and wait for complete finish of environment's work.
Definition all.cpp:1706
testing_env_t(so_5::generic_simple_so_env_params_tuner_t env_params_tuner)
A constructor that allows to tune environment's parameters.
Definition all.cpp:1666
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.
Auxiliary class for the SObjectizer launching.
Definition api.hpp:31
Init m_init
Initialization routine.
Definition api.hpp:53
void init() override
Initialization hook.
Definition api.hpp:46
so_quick_environment_t(Init init, so_5::environment_params_t &&env_params)
Definition api.hpp:35
An interface of the additional SObjectizer Environment layer.
Definition so_layer.hpp:31
Basic parameters for advanced receive from mchain and for multi chain select.
Definition mchain.hpp:1270
Actual implementation of one multi chain select case.
actual_receive_select_case_t(mchain_t chain, Handlers &&... handlers)
Initializing constructor.
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.
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.
A holder for serie of select_cases for the case of extensible select.
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.
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.
Special class for locking extensible-select instance for modification.
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 > &&params, extensible_select_cases_holder_t &&cases) noexcept
Initializing constructor.
Special class for locking prepared-select instance for activation inside select() call.
prepared_select_data_t(mchain_select_params_t< msg_count_status_t::defined > &&params, 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.
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 &notificator) override
An attempt to handle this case.
Helper class for performing select-specific operations.
const mchain_select_params_t< msg_count_status_t::defined > & m_params
void on_send_result(select_case_t *current, const mchain_send_result_t &result)
extraction_status_t last_extraction_status() const noexcept
std::size_t m_completed_send_cases
The counter of completed send_cases.
void on_receive_result(select_case_t *current, const mchain_receive_result_t &result)
mchain_select_result_t make_result() const noexcept
select_actions_performer_t(const mchain_select_params_t< msg_count_status_t::defined > &params, const Holder &select_cases)
bool operator!=(const const_iterator &o) const noexcept
bool operator==(const const_iterator &o) const noexcept
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
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 &notificator) 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 &notificator)=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.
Definition mchain.hpp:962
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.
Definition mchain.hpp:1034
A base class for agent messages.
Definition message.hpp:47
friend message_kind_t message_kind(const so_5::intrusive_ptr_t< message_t > &what)
Helper method for quering kind of the message.
Definition message.hpp:154
A class for the name which cannot be empty.
Helper class for indication of long-lived reference via its type.
Definition outliving.hpp:98
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)
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)
An interface of stop_guard entity.
A wrapped environment.
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 &&params)
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 &&params)
wrapped_env_t(const wrapped_env_t &)=delete
std::unique_ptr< details_t > m_impl
Implementation details.
wrapped_env_t(environment_params_t &&params)
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 &&params, 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_TYPE
Definition declspec.hpp:46
#define SO_5_THROW_EXCEPTION(error_code, desc)
Definition exception.hpp:74
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.
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 &&params)
Definition all.cpp:1582
void setup_special_queue_hook(outliving_reference_t< testing_env_t::internals_t > internals, environment_params_t &to)
Definition all.cpp:1558
environment_params_t make_tuned_params(so_5::generic_simple_so_env_params_tuner_t env_params_tuner)
Definition all.cpp:1571
queue_mode_t
A mode of work for special_event_queue.
Definition all.cpp:1224
@ 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.
@ 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.
Details of SObjectizer run-time implementations.
Definition agent.cpp:905
Implementation details.
Definition mchain.hpp:37
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 > &params, 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 > &params, 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 > &params, const Holder &select_cases)
void fill_select_cases_holder(extensible_select_cases_holder_t &)
Various properties and parameters of message chains.
Definition mchain.hpp:28
msg_count_status_t
Status of limit for messages to be extracted/handled during a bulk operation on a mchain.
Definition mchain.hpp:1082
@ 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.
Definition mchain.hpp:371
@ no_messages
No available messages in the chain.
void ensure_valid_argument_for_delivery_filter()
Helper to have more information in compiler output if static_assert fails.
init_style_t
Style of handling init-functor in the constructor of wrapped_env.
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
auto make_coop_reg_notificator(mbox_t target) noexcept
Create notificator about cooperation registration completion.
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_select_result_t select(const mchain_select_params_t< Msg_Count_Status > &params, 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_select_result_t select(const extensible_select_t &extensible_select)
A select operation to be done on previously prepared extensible-select object.
message_ownership_t
Type of ownership of a message instance inside message_holder.
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_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.
void launch(Init_Routine &&init_routine, Params_Tuner &&params_tuner)
Launch a SObjectizer Environment with explicitely specified parameters.
Definition api.hpp:212
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 description of event execution demand.
demand_handler_pfn_t m_demand_handler
Demand handler.
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.
Special indicator to be used in implementation of receives trigger.
A special data object for case of store-state-name completion 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.
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.
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...
Definition all.cpp:1525
Internal data for testing environment.
Definition all.cpp:1538
impl::special_event_queue_hook_t m_special_hook
Definition all.cpp:1540
static std::unique_ptr< internals_t > make()
Definition all.cpp:1552
Description of one demand in message chain.
Definition mchain.hpp:144
A helper class for detection of payload type of message.
Definition message.hpp:783
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
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
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.
delivery_filter_unique_ptr_t m_delivery_filter
Optional delivery filter.
Helper metafunction to check delivery filter lambda.
Implementation details for wrapped_env.