578class request_reply_t
final
579 :
public details::request_holder_part_t<
580 details::basic_request_reply_part_t<Request, Reply>,
581 is_signal<Request>::value >
583 using base_type = details::request_holder_part_t<
584 details::basic_request_reply_part_t<Request, Reply>,
585 is_signal<Request>::value >;
589 using request_t =
typename base_type::request_t;
591 using reply_t =
typename base_type::reply_t;
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616 using request_mhood_t = mutable_mhood_t< request_reply_t >;
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645 using reply_mhood_t = mutable_mhood_t< reply_t >;
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665 using holder_t = message_holder_t< mutable_msg<request_reply_t> >;
668 using base_type::base_type;
670 using base_type::is_reply_moveable;
671 using base_type::is_reply_copyable;
673 using msg_holder_t = message_holder_t< mutable_msg< request_reply_t > >;
677 template<
typename Reply_Receiver >
681 Reply_Receiver & result )
683 if constexpr( is_reply_moveable )
684 result = std::move(*cmd);
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);
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782 template<
typename Target,
typename... Args >
788 auto mchain = so_5::extra::mchains::fixed_size::create_mchain<1>(
789 so_5::send_functions_details::arg_to_env( target ),
790 so_5::mchain_props::overflow_reaction_t::throw_exception );
795 new request_reply_t{ mchain, std::forward<Args>(args)... }
798 send( target, std::move(msg) );
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830 template<
typename Target,
typename... Args >
833 const Target & target,
834 const mbox_t & reply_to,
840 new request_reply_t{ reply_to, std::forward<Args>(args)... }
843 send( target, std::move(msg) );
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871 template<
typename Target,
typename... Args >
874 const Target & target,
875 const agent_t & reply_to,
882 reply_to.so_direct_mbox(), std::forward<Args>(args)... }
885 send( target, std::move(msg) );
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904 template<
typename Target,
typename... Args >
907 const Target & target,
908 const mchain_t & reply_ch,
916 case close_reply_chain:
917 msg = msg_holder_t{
new request_reply_t{
919 std::forward<Args>(args)... } };
922 case do_not_close_reply_chain:
923 msg = msg_holder_t{
new request_reply_t{
925 std::forward<Args>(args)... } };
929 send( target, std::move(msg) );
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954 template<
typename... Args >
958 if(
this->m_reply_sent )
959 SO_5_THROW_EXCEPTION( errors::rc_reply_was_sent,
960 std::string{
"reply has already been sent, "
961 "request_reply type: " } +
962 typeid(request_reply_t).name() );
964 so_5::send< so_5::mutable_msg<reply_t> >(
965 details::query_actual_reply_target(
966 this->m_reply_target.target() ),
967 std::forward<Args>(args)... );
969 this->m_reply_sent =
true;
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
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 );
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
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)... );