11 #include <so_5_extra/error_ranges.hpp> 13 #include <so_5_extra/mchains/fixed_size.hpp> 15 #include <so_5/send_functions.hpp> 17 #include <so_5/details/always_false.hpp> 58 template<
typename T >
64 template<
typename T >
68 "so_5::immutable_msg<T> modificator can't be used with " 69 "so_5::extra::sync::request_reply_t" );
72 template<
typename T >
76 "so_5::mutable_msg<T> modificator can't be used with " 77 "so_5::extra::sync::request_reply_t" );
83 template<
typename T >
84 using ensure_no_mutability_modificators_t =
113 class reply_target_holder_t
final 125 struct closer_t
final {
126 void operator()(
const mchain_t & ch )
const noexcept {
130 close_retain_content( ch );
132 void operator()(
const mbox_t & )
const noexcept {
137 std::visit( closer_t{}, m_target );
145 target()
const noexcept {
return m_target; }
162 mbox_t operator()(
const mchain_t & ch )
const noexcept {
163 return ch->as_mbox();
165 mbox_t operator()(
const mbox_t & mbox )
const noexcept {
170 return std::visit( extractor_t{}, rt );
179 template<
typename Request,
typename Reply >
200 "Reply type should be MoveAssignable or CopyAssignable" );
227 template<
typename Base,
bool is_signal >
228 class request_holder_part_t;
237 template<
typename Base >
238 class request_holder_part_t<Base,
false> :
public Base
245 template<
typename... Args >
247 reply_target_t reply_target,
249 : Base{ std::move(reply_target) }
250 , m_request{ std::forward<Args>(args)... }
268 template<
typename Base >
269 class request_holder_part_t<Base,
true> :
public Base
569 template<
typename Request,
typename Reply>
669 template<
typename Reply_Receiver >
673 Reply_Receiver & result )
683 template<
typename Target,
typename Duration,
typename... Args>
695 auto reply_ch = initiate(
696 std::forward<Target>(target),
697 std::forward<Args>(args)... );
699 bool result_received{
false};
701 from(reply_ch).handle_n(1).empty_timeout(duration),
702 [&result, &result_received]( reply_mhood_t cmd ) {
703 result_received =
true;
704 borrow_from_reply_mhood( cmd, result );
707 if( !result_received )
709 SO_5_THROW_EXCEPTION( errors::rc_no_reply,
710 std::string{
"no reply received, request_reply type: " } +
711 typeid(request_reply_t).name() );
719 template<
typename Target,
typename Duration,
typename... Args>
729 auto result = ask_opt_value(
730 std::forward<Target>(target),
732 std::forward<Args>(args)... );
736 SO_5_THROW_EXCEPTION( errors::rc_no_reply,
737 std::string{
"no reply received, request_reply type: " } +
738 typeid(request_reply_t).name() );
771 template<
typename Target,
typename... Args >
819 template<
typename Target,
typename... Args >
822 const Target & target,
823 const mbox_t & reply_to,
860 template<
typename Target,
typename... Args >
863 const Target & target,
864 const agent_t & reply_to,
893 template<
typename Target,
typename... Args >
896 const Target & target,
897 const mchain_t & reply_ch,
943 template<
typename... Args >
949 std::
string{
"reply has already been sent, " 950 "request_reply type: " } +
999 template<
typename Target,
typename Duration,
typename... Args>
1007 auto reply_ch = initiate(
1008 std::forward<Target>(target),
1009 std::forward<Args>(args)... );
1011 optional<reply_t> result;
1013 from(reply_ch).handle_n(1).empty_timeout(duration),
1014 [&result]( reply_mhood_t cmd ) {
1015 borrow_from_reply_mhood( cmd, result );
1056 template<
typename Target,
typename Duration,
typename... Args>
1064 if constexpr( std::is_default_constructible_v<reply_t> )
1065 return ask_default_constructible_value(
1066 std::forward<Target>(target),
1068 std::forward<Args>(args)... );
1070 return ask_not_default_constructible_value(
1071 std::forward<Target>(target),
1073 std::forward<Args>(args)... );
1095 template<
typename Request,
typename Reply >
1104 template<
typename Request,
typename Reply >
1128 typename Request,
typename Reply,
1129 typename Target,
typename Duration,
typename... Args>
1137 return request_reply_t<Request, Reply>::ask_value(
1138 std::forward<Target>(target),
1140 std::forward<Args>(args)... );
1167 typename Request,
typename Reply,
1168 typename Target,
typename Duration,
typename... Args>
1176 return request_reply_t<Request, Reply>::ask_opt_value(
1177 std::forward<Target>(target),
1179 std::forward<Args>(args)... );
Ranges for error codes of each submodules.