SObjectizer  5.8
Loading...
Searching...
No Matches
enveloped_msg.cpp
Go to the documentation of this file.
1/*
2 * SObjectizer-5
3 */
4
5/*!
6 * \file
7 *
8 * \brief Stuff related to enveloped messages.
9 *
10 * \since v.5.5.23
11 */
12
13#include <so_5/enveloped_msg.hpp>
14
15#include <so_5/impl/enveloped_msg_details.hpp>
16
17namespace so_5 {
18
19namespace enveloped_msg {
20
21namespace {
22
23#if defined(__clang__)
24#pragma clang diagnostic push
25#pragma clang diagnostic ignored "-Wnon-virtual-dtor"
26#endif
27
28//
29// payload_access_handler_invoker_t
30//
31/*!
32 * \brief An implementation of handler_invoker interface for
33 * extraction of payload because of various reasons.
34 *
35 * \since v.5.5.23
36 */
37class payload_access_handler_invoker_t final : public handler_invoker_t
38 {
40
42
43 public:
45 access_context_t context )
46 : m_context{ context }
47 {}
48
50
51 void
53 const payload_info_t & payload ) noexcept override
54 {
55 using namespace so_5::enveloped_msg::impl;
56
57 switch( message_kind( payload.message() ) )
58 {
59 case message_t::kind_t::signal : [[fallthrough]];
60 case message_t::kind_t::classical_message : [[fallthrough]];
61 case message_t::kind_t::user_type_message :
62 m_payload = payload;
63 break;
64
66 auto & envelope = message_to_envelope( payload.message() );
67 envelope.access_hook( m_context, *this );
68 break;
69 }
70 }
71
72 [[nodiscard]]
75 const message_ref_t & envelope_to_process ) noexcept
76 {
77 using namespace so_5::enveloped_msg::impl;
78
79 auto & actual_envelope = message_to_envelope( envelope_to_process );
80 actual_envelope.access_hook( m_context, *this );
81
82 return m_payload;
83 }
84 };
85
86#if defined(__clang__)
87#pragma clang diagnostic pop
88#endif
89
90} /* namespace anonymous */
91
92[[nodiscard]]
97 {
98 return payload_access_handler_invoker_t{
100 }.try_get_payload( envelope_to_process );
101 }
102
103[[nodiscard]]
108 {
109 message_ref_t result = msg_or_envelope;
110 switch( message_kind( msg_or_envelope ) )
111 {
112 case message_t::kind_t::signal: // Already has a value.
113 break;
114
115 case message_t::kind_t::classical_message: // Already has a value.
116 break;
117
118 case message_t::kind_t::user_type_message: // Already has a value.
119 break;
120
122 {
123 auto opt_payload = payload_access_handler_invoker_t{
125 }.try_get_payload( msg_or_envelope );
126
127 if( opt_payload )
128 result = opt_payload->message();
129 }
130 break;
131 }
132
133 return { result };
134 }
135
136} /* namespace enveloped_msg */
137
138} /* namespace so_5 */
void invoke(const payload_info_t &payload) noexcept override
Call an actual handler for the enveloped message/signal.
optional< so_5::enveloped_msg::payload_info_t > try_get_payload(const message_ref_t &envelope_to_process) noexcept
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
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
#define SO_5_FUNC
Definition declspec.hpp:48
envelope_t & message_to_envelope(const message_ref_t &src_msg)
A helper function for casting message instance to envelope instance.
SO_5_FUNC optional< message_ref_t > message_to_be_inspected(const message_ref_t &msg_or_envelope)
Helper function for extraction of a payload from enveloped message.
SO_5_FUNC optional< payload_info_t > extract_payload_for_message_transformation(const message_ref_t &envelope)
Helper function for extraction of a payload from enveloped message.
access_context_t
Information about context on that enveloped message is handled.
Private part of message limit implementation.
Definition agent.cpp:33
@ user_type_message
Message is an user type message.
@ enveloped_msg
Message is an envelope with some other message inside.