From 444b56c281eea9a4949372c848d00a2ec27d0c88 Mon Sep 17 00:00:00 2001 From: Esteve Fernandez Date: Thu, 15 Jan 2015 18:24:45 -0800 Subject: [PATCH] Extend async_request to take accept a callback as an argument --- rclcpp/include/rclcpp/client.hpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/rclcpp/include/rclcpp/client.hpp b/rclcpp/include/rclcpp/client.hpp index f6635f7..66976d5 100644 --- a/rclcpp/include/rclcpp/client.hpp +++ b/rclcpp/include/rclcpp/client.hpp @@ -74,9 +74,11 @@ template class Client : public ClientBase { public: - typedef std::promise Promise; - typedef std::shared_ptr SharedPromise; - typedef std::shared_future SharedFuture; + typedef std::promise Promise; + typedef std::shared_ptr SharedPromise; + typedef std::shared_future SharedFuture; + + typedef std::function CallbackType; RCLCPP_MAKE_SHARED_DEFINITIONS(Client); @@ -106,29 +108,39 @@ public: auto typed_req_id = std::static_pointer_cast(req_id); auto typed_response = std::static_pointer_cast(response); int64_t sequence_number = typed_req_id->sequence_number; - auto pair = this->pending_requests_[sequence_number]; - auto call_promise = pair.first; + auto tuple = this->pending_requests_[sequence_number]; + auto call_promise = std::get<0>(tuple); + auto callback = std::get<1>(tuple); + auto future = std::get<2>(tuple); this->pending_requests_.erase(sequence_number); call_promise->set_value(typed_response); + callback(future); } SharedFuture async_send_request( typename ServiceT::Request::Ptr &request, typename ServiceT::Response::Ptr &response) + { + return async_send_request(request, response, [] (SharedFuture f) { }); + } + + SharedFuture async_send_request( + typename ServiceT::Request::Ptr &request, + typename ServiceT::Response::Ptr &response, + CallbackType cb) { int64_t sequence_number = ::ros_middleware_interface::send_request(get_client_handle(), request.get()); SharedPromise call_promise = std::make_shared(); - pending_requests_[sequence_number] = std::make_pair(call_promise, response); - SharedFuture f(call_promise->get_future()); + pending_requests_[sequence_number] = std::make_tuple(call_promise, cb, f); return f; } private: RCLCPP_DISABLE_COPY(Client); - std::map > pending_requests_; + std::map > pending_requests_; }; } /* namespace client */