1 #ifndef ISIMUD_EXCHANGES_COMMON_MIT_processing_rules_hpp
2 #define ISIMUD_EXCHANGES_COMMON_MIT_processing_rules_hpp
22 #include "../../common/processing_rules.hpp"
24 #include "core/msm.hpp"
34 template<
class SrcMsgDetails,
class DestMsgDetails>
35 class client_to_exchange_transformations final
39 client_to_exchange_transformations<SrcMsgDetails, DestMsgDetails>,
46 client_to_exchange_transformations<SrcMsgDetails, DestMsgDetails>,
47 typename SrcMsgDetails::client_to_exchange_messages_t
49 using src_msg_details_t=
typename base_t::src_msg_details_t;
50 using dest_msg_details_t=
typename base_t::dest_msg_details_t;
53 : sequenceNumber(sn) {
60 bool process_msg(
typename src_msg_details_t::msg_buffer_t
const &buff, SktT &exchg_skt, SktT &dest_skt);
65 struct state_machine_t;
68 typename dest_msg_details_t::SeqNum_t sequenceNumber;
69 const machine msm{
std::ref(sequenceNumber),
std::ref(sequenceNumber),
std::ref(sequenceNumber),
std::ref(sequenceNumber)};
72 template<
class SrcMsgDetails,
class DestMsgDetails>
inline std::ostream &
73 operator<<(
std::ostream &os, client_to_exchange_transformations<SrcMsgDetails, DestMsgDetails>
const &ec)
noexcept(
false);
81 template<
class SrcMsgDetails,
class DestMsgDetails>
82 class exchange_to_client_transformations final
86 exchange_to_client_transformations<SrcMsgDetails, DestMsgDetails>,
93 exchange_to_client_transformations<SrcMsgDetails, DestMsgDetails>,
94 typename SrcMsgDetails::exchange_to_client_messages_t
96 using src_msg_details_t=
typename base_t::src_msg_details_t;
97 using dest_msg_details_t=
typename base_t::dest_msg_details_t;
100 : sequenceNumber(seq_num) {
106 template<
class SktT,
class ClientCxn>
107 bool process_msg(
typename src_msg_details_t::msg_buffer_t
const &buff, SktT &exchg_skt, ClientCxn &client_skt);
112 struct business_state_machine_t;
113 struct admin_state_machine_t;
114 using business_machine=libjmmcg::
msm::
unroll::
machine<business_state_machine_t>;
117 typename dest_msg_details_t::SeqNum_t sequenceNumber;
118 const business_machine business_msm{
std::ref(sequenceNumber),
std::ref(sequenceNumber),
std::ref(sequenceNumber),
std::ref(sequenceNumber),
std::ref(sequenceNumber),
std::ref(sequenceNumber)};
119 const admin_machine admin_msm{
std::make_tuple(
std::ref(sequenceNumber), business_msm),
std::make_tuple(
std::ref(sequenceNumber), business_msm),
std::make_tuple(
std::ref(sequenceNumber), business_msm)};
122 template<
class SrcMsgDetails,
class DestMsgDetails>
inline std::ostream &
123 operator<<(
std::ostream &os, exchange_to_client_transformations<SrcMsgDetails, DestMsgDetails>
const &ec)
noexcept(
false);
131 template<
class SrcMsgDetails>
132 class simulator_responses final :
public exchanges::common::
simulator_responses<SrcMsgDetails, simulator_responses<SrcMsgDetails>> {
135 using msg_details_t=
typename base_t::msg_details_t;
143 : base_t(), msm{
std::ref(*
this),
std::ref(*
this),
std::ref(*
this),
std::ref(*
this),
std::ref(*
this),
std::ref(*
this),
std::ref(*
this)} {
146 : base_t(sr), msm{
std::ref(*
this),
std::ref(*
this),
std::ref(*
this),
std::ref(*
this),
std::ref(*
this),
std::ref(*
this),
std::ref(*
this)} {
152 template<
class SktT,
class ClientCxn>
153 bool process_msg(
typename msg_details_t::msg_buffer_t
const &buff, SktT &exchg_skt, ClientCxn &client_skt);
158 struct state_machine_t;
164 template<
class SrcMsgDetails>
inline std::ostream &
165 operator<<(
std::ostream &os, simulator_responses<SrcMsgDetails>
const &ec)
noexcept(
false);