11 #include <so_5_extra/error_ranges.hpp> 13 #include <so_5_extra/mchains/fixed_size.hpp> 15 #include <so_5/version.hpp> 16 #if SO_5_VERSION < SO_5_VERSION_MAKE(5u
, 7u
, 3u
) 17 #error "SObjectizer-5.7.3 is required" 20 #include <so_5/send_functions.hpp> 22 #include <so_5/details/always_false.hpp> 63 template<
typename T >
69 template<
typename T >
73 "so_5::immutable_msg<T> modificator can't be used with " 74 "so_5::extra::sync::request_reply_t" );
77 template<
typename T >
81 "so_5::mutable_msg<T> modificator can't be used with " 82 "so_5::extra::sync::request_reply_t" );
88 template<
typename T >
89 using ensure_no_mutability_modificators_t =
118 class reply_target_holder_t
final 130 struct closer_t
final {
131 void operator()(
const mchain_t & ch )
const noexcept {
138 close_retain_content( so_5::terminate_if_throws, ch );
140 void operator()(
const mbox_t & )
const noexcept {
145 std::visit( closer_t{}, m_target );
153 target()
const noexcept {
return m_target; }
170 mbox_t operator()(
const mchain_t & ch )
const noexcept {
171 return ch->as_mbox();
173 mbox_t operator()(
const mbox_t & mbox )
const noexcept {
178 return std::visit( extractor_t{}, rt );
187 template<
typename Request,
typename Reply >
208 "Reply type should be MoveAssignable or CopyAssignable" );
235 template<
typename Base,
bool is_signal >
236 class request_holder_part_t;
245 template<
typename Base >
246 class request_holder_part_t<Base,
false> :
public Base
253 template<
typename... Args >
255 reply_target_t reply_target,
257 : Base{ std::move(reply_target) }
258 , m_request{ std::forward<Args>(args)... }
276 template<
typename Base >
277 class request_holder_part_t<Base,
true> :
public Base
577 template<
typename Request,
typename Reply>
677 template<
typename Reply_Receiver >
681 Reply_Receiver & result )
691 template<
typename Target,
typename Duration,
typename... Args>
703 auto reply_ch = initiate(
704 std::forward<Target>(target),
705 std::forward<Args>(args)... );
707 bool result_received{
false};
709 from(reply_ch).handle_n(1).empty_timeout(duration),
710 [&result, &result_received]( reply_mhood_t cmd ) {
711 result_received =
true;
712 borrow_from_reply_mhood( cmd, result );
715 if( !result_received )
717 SO_5_THROW_EXCEPTION( errors::rc_no_reply,
718 std::string{
"no reply received, request_reply type: " } +
719 typeid(request_reply_t).name() );
727 template<
typename Target,
typename Duration,
typename... Args>
737 auto result = ask_opt_value(
738 std::forward<Target>(target),
740 std::forward<Args>(args)... );
744 SO_5_THROW_EXCEPTION( errors::rc_no_reply,
745 std::string{
"no reply received, request_reply type: " } +
746 typeid(request_reply_t).name() );
749 if constexpr( is_reply_moveable )
750 return std::move(*result);
782 template<
typename Target,
typename... Args >
830 template<
typename Target,
typename... Args >
833 const Target & target,
834 const mbox_t & reply_to,
871 template<
typename Target,
typename... Args >
874 const Target & target,
875 const agent_t & reply_to,
904 template<
typename Target,
typename... Args >
907 const Target & target,
908 const mchain_t & reply_ch,
954 template<
typename... Args >
960 std::
string{
"reply has already been sent, " 961 "request_reply type: " } +
1010 template<
typename Target,
typename Duration,
typename... Args>
1018 auto reply_ch = initiate(
1019 std::forward<Target>(target),
1020 std::forward<Args>(args)... );
1022 optional<reply_t> result;
1024 from(reply_ch).handle_n(1).empty_timeout(duration),
1025 [&result]( reply_mhood_t cmd ) {
1026 borrow_from_reply_mhood( cmd, result );
1067 template<
typename Target,
typename Duration,
typename... Args>
1075 if constexpr( std::is_default_constructible_v<reply_t> )
1076 return ask_default_constructible_value(
1077 std::forward<Target>(target),
1079 std::forward<Args>(args)... );
1081 return ask_not_default_constructible_value(
1082 std::forward<Target>(target),
1084 std::forward<Args>(args)... );
1106 template<
typename Request,
typename Reply >
1115 template<
typename Request,
typename Reply >
1139 typename Request,
typename Reply,
1140 typename Target,
typename Duration,
typename... Args>
1148 return request_reply_t<Request, Reply>::ask_value(
1149 std::forward<Target>(target),
1151 std::forward<Args>(args)... );
1178 typename Request,
typename Reply,
1179 typename Target,
typename Duration,
typename... Args>
1187 return request_reply_t<Request, Reply>::ask_opt_value(
1188 std::forward<Target>(target),
1190 std::forward<Args>(args)... );
Ranges for error codes of each submodules.