Don't hardcode int64_t for duration type representations (#648)

In LLVM's `libcxx`, `int64_t` doesn't match chrono literals. See example below. To compile, run  `clang++-6.0 -stdlib=libc++ -std=c++14 TEST.cpp`

```
using namespace std::chrono_literals;

template<typename RatioT = std::milli>
bool
wait_for_service(
   std::chrono::duration<int64_t, RatioT> timeout
)
{
   return timeout == std::chrono::nanoseconds(0);
}

int main() {
   wait_for_service(2s);
   return 0;
}

```

Result of compilation
```
TEST.cpp:6:1: note: candidate template ignored: could not match 'long' against 'long long'
wait_for_service(
```

Signed-off-by: Emerson Knapp <eknapp@amazon.com>
Signed-off-by: Steven! Ragnarök <steven@nuclearsandwich.com>
This commit is contained in:
Emerson Knapp 2019-03-12 15:32:41 -07:00 committed by Steven! Ragnarök
parent fce1d4b86f
commit 83beaf8a3f
9 changed files with 32 additions and 30 deletions

View file

@ -78,10 +78,10 @@ public:
bool bool
service_is_ready() const; service_is_ready() const;
template<typename RatioT = std::milli> template<typename RepT = int64_t, typename RatioT = std::milli>
bool bool
wait_for_service( wait_for_service(
std::chrono::duration<int64_t, RatioT> timeout = std::chrono::duration<int64_t, RatioT>(-1)) std::chrono::duration<RepT, RatioT> timeout = std::chrono::duration<RepT, RatioT>(-1))
{ {
return wait_for_service_nanoseconds( return wait_for_service_nanoseconds(
std::chrono::duration_cast<std::chrono::nanoseconds>(timeout) std::chrono::duration_cast<std::chrono::nanoseconds>(timeout)

View file

@ -151,11 +151,11 @@ public:
* spin_node_once to block indefinitely (the default behavior). A timeout of 0 causes this * spin_node_once to block indefinitely (the default behavior). A timeout of 0 causes this
* function to be non-blocking. * function to be non-blocking.
*/ */
template<typename T = std::milli> template<typename RepT = int64_t, typename T = std::milli>
void void
spin_node_once( spin_node_once(
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node, rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node,
std::chrono::duration<int64_t, T> timeout = std::chrono::duration<int64_t, T>(-1)) std::chrono::duration<RepT, T> timeout = std::chrono::duration<RepT, T>(-1))
{ {
return spin_node_once_nanoseconds( return spin_node_once_nanoseconds(
node, node,
@ -164,11 +164,11 @@ public:
} }
/// Convenience function which takes Node and forwards NodeBaseInterface. /// Convenience function which takes Node and forwards NodeBaseInterface.
template<typename NodeT = rclcpp::Node, typename T = std::milli> template<typename NodeT = rclcpp::Node, typename RepT = int64_t, typename T = std::milli>
void void
spin_node_once( spin_node_once(
std::shared_ptr<NodeT> node, std::shared_ptr<NodeT> node,
std::chrono::duration<int64_t, T> timeout = std::chrono::duration<int64_t, T>(-1)) std::chrono::duration<RepT, T> timeout = std::chrono::duration<RepT, T>(-1))
{ {
return spin_node_once_nanoseconds( return spin_node_once_nanoseconds(
node->get_node_base_interface(), node->get_node_base_interface(),
@ -218,11 +218,11 @@ public:
* code. * code.
* \return The return code, one of `SUCCESS`, `INTERRUPTED`, or `TIMEOUT`. * \return The return code, one of `SUCCESS`, `INTERRUPTED`, or `TIMEOUT`.
*/ */
template<typename ResponseT, typename TimeT = std::milli> template<typename ResponseT, typename TimeRepT = int64_t, typename TimeT = std::milli>
FutureReturnCode FutureReturnCode
spin_until_future_complete( spin_until_future_complete(
std::shared_future<ResponseT> & future, std::shared_future<ResponseT> & future,
std::chrono::duration<int64_t, TimeT> timeout = std::chrono::duration<int64_t, TimeT>(-1)) std::chrono::duration<TimeRepT, TimeT> timeout = std::chrono::duration<TimeRepT, TimeT>(-1))
{ {
// TODO(wjwwood): does not work recursively; can't call spin_node_until_future_complete // TODO(wjwwood): does not work recursively; can't call spin_node_until_future_complete
// inside a callback executed by an executor. // inside a callback executed by an executor.

View file

@ -65,13 +65,13 @@ using rclcpp::executors::SingleThreadedExecutor;
* If the time spent inside the blocking loop exceeds this timeout, return a `TIMEOUT` return code. * If the time spent inside the blocking loop exceeds this timeout, return a `TIMEOUT` return code.
* \return The return code, one of `SUCCESS`, `INTERRUPTED`, or `TIMEOUT`. * \return The return code, one of `SUCCESS`, `INTERRUPTED`, or `TIMEOUT`.
*/ */
template<typename ResponseT, typename TimeT = std::milli> template<typename ResponseT, typename TimeRepT = int64_t, typename TimeT = std::milli>
rclcpp::executor::FutureReturnCode rclcpp::executor::FutureReturnCode
spin_node_until_future_complete( spin_node_until_future_complete(
rclcpp::executor::Executor & executor, rclcpp::executor::Executor & executor,
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr, rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr,
std::shared_future<ResponseT> & future, std::shared_future<ResponseT> & future,
std::chrono::duration<int64_t, TimeT> timeout = std::chrono::duration<int64_t, TimeT>(-1)) std::chrono::duration<TimeRepT, TimeT> timeout = std::chrono::duration<TimeRepT, TimeT>(-1))
{ {
// TODO(wjwwood): does not work recursively; can't call spin_node_until_future_complete // TODO(wjwwood): does not work recursively; can't call spin_node_until_future_complete
// inside a callback executed by an executor. // inside a callback executed by an executor.
@ -81,13 +81,14 @@ spin_node_until_future_complete(
return retcode; return retcode;
} }
template<typename NodeT = rclcpp::Node, typename ResponseT, typename TimeT = std::milli> template<typename NodeT = rclcpp::Node, typename ResponseT, typename TimeRepT = int64_t,
typename TimeT = std::milli>
rclcpp::executor::FutureReturnCode rclcpp::executor::FutureReturnCode
spin_node_until_future_complete( spin_node_until_future_complete(
rclcpp::executor::Executor & executor, rclcpp::executor::Executor & executor,
std::shared_ptr<NodeT> node_ptr, std::shared_ptr<NodeT> node_ptr,
std::shared_future<ResponseT> & future, std::shared_future<ResponseT> & future,
std::chrono::duration<int64_t, TimeT> timeout = std::chrono::duration<int64_t, TimeT>(-1)) std::chrono::duration<TimeRepT, TimeT> timeout = std::chrono::duration<TimeRepT, TimeT>(-1))
{ {
return rclcpp::executors::spin_node_until_future_complete( return rclcpp::executors::spin_node_until_future_complete(
executor, executor,
@ -98,23 +99,24 @@ spin_node_until_future_complete(
} // namespace executors } // namespace executors
template<typename FutureT, typename TimeT = std::milli> template<typename FutureT, typename TimeRepT = int64_t, typename TimeT = std::milli>
rclcpp::executor::FutureReturnCode rclcpp::executor::FutureReturnCode
spin_until_future_complete( spin_until_future_complete(
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr, rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr,
std::shared_future<FutureT> & future, std::shared_future<FutureT> & future,
std::chrono::duration<int64_t, TimeT> timeout = std::chrono::duration<int64_t, TimeT>(-1)) std::chrono::duration<TimeRepT, TimeT> timeout = std::chrono::duration<TimeRepT, TimeT>(-1))
{ {
rclcpp::executors::SingleThreadedExecutor executor; rclcpp::executors::SingleThreadedExecutor executor;
return executors::spin_node_until_future_complete<FutureT>(executor, node_ptr, future, timeout); return executors::spin_node_until_future_complete<FutureT>(executor, node_ptr, future, timeout);
} }
template<typename NodeT = rclcpp::Node, typename FutureT, typename TimeT = std::milli> template<typename NodeT = rclcpp::Node, typename FutureT, typename TimeRepT = int64_t,
typename TimeT = std::milli>
rclcpp::executor::FutureReturnCode rclcpp::executor::FutureReturnCode
spin_until_future_complete( spin_until_future_complete(
std::shared_ptr<NodeT> node_ptr, std::shared_ptr<NodeT> node_ptr,
std::shared_future<FutureT> & future, std::shared_future<FutureT> & future,
std::chrono::duration<int64_t, TimeT> timeout = std::chrono::duration<int64_t, TimeT>(-1)) std::chrono::duration<TimeRepT, TimeT> timeout = std::chrono::duration<TimeRepT, TimeT>(-1))
{ {
return rclcpp::spin_until_future_complete(node_ptr->get_node_base_interface(), future, timeout); return rclcpp::spin_until_future_complete(node_ptr->get_node_base_interface(), future, timeout);
} }

View file

@ -234,10 +234,10 @@ public:
* \param[in] callback User-defined callback function. * \param[in] callback User-defined callback function.
* \param[in] group Callback group to execute this timer's callback in. * \param[in] group Callback group to execute this timer's callback in.
*/ */
template<typename DurationT = std::milli, typename CallbackT> template<typename DurationRepT = int64_t, typename DurationT = std::milli, typename CallbackT>
typename rclcpp::WallTimer<CallbackT>::SharedPtr typename rclcpp::WallTimer<CallbackT>::SharedPtr
create_wall_timer( create_wall_timer(
std::chrono::duration<int64_t, DurationT> period, std::chrono::duration<DurationRepT, DurationT> period,
CallbackT callback, CallbackT callback,
rclcpp::callback_group::CallbackGroup::SharedPtr group = nullptr); rclcpp::callback_group::CallbackGroup::SharedPtr group = nullptr);

View file

@ -165,10 +165,10 @@ Node::create_subscription(
allocator); allocator);
} }
template<typename DurationT, typename CallbackT> template<typename DurationRepT, typename DurationT, typename CallbackT>
typename rclcpp::WallTimer<CallbackT>::SharedPtr typename rclcpp::WallTimer<CallbackT>::SharedPtr
Node::create_wall_timer( Node::create_wall_timer(
std::chrono::duration<int64_t, DurationT> period, std::chrono::duration<DurationRepT, DurationT> period,
CallbackT callback, CallbackT callback,
rclcpp::callback_group::CallbackGroup::SharedPtr group) rclcpp::callback_group::CallbackGroup::SharedPtr group)
{ {

View file

@ -138,10 +138,10 @@ public:
bool bool
service_is_ready() const; service_is_ready() const;
template<typename RatioT = std::milli> template<typename RepT = int64_t, typename RatioT = std::milli>
bool bool
wait_for_service( wait_for_service(
std::chrono::duration<int64_t, RatioT> timeout = std::chrono::duration<int64_t, RatioT>(-1)) std::chrono::duration<RepT, RatioT> timeout = std::chrono::duration<RepT, RatioT>(-1))
{ {
return wait_for_service_nanoseconds( return wait_for_service_nanoseconds(
std::chrono::duration_cast<std::chrono::nanoseconds>(timeout) std::chrono::duration_cast<std::chrono::nanoseconds>(timeout)
@ -281,10 +281,10 @@ public:
return async_parameters_client_->service_is_ready(); return async_parameters_client_->service_is_ready();
} }
template<typename RatioT = std::milli> template<typename RepT = int64_t, typename RatioT = std::milli>
bool bool
wait_for_service( wait_for_service(
std::chrono::duration<int64_t, RatioT> timeout = std::chrono::duration<int64_t, RatioT>(-1)) std::chrono::duration<RepT, RatioT> timeout = std::chrono::duration<RepT, RatioT>(-1))
{ {
return async_parameters_client_->wait_for_service(timeout); return async_parameters_client_->wait_for_service(timeout);
} }

View file

@ -66,10 +66,10 @@ public:
action_server_is_ready() const; action_server_is_ready() const;
/// Wait for action_server_is_ready() to become true, or until the given timeout is reached. /// Wait for action_server_is_ready() to become true, or until the given timeout is reached.
template<typename RatioT = std::milli> template<typename RepT = int64_t, typename RatioT = std::milli>
bool bool
wait_for_action_server( wait_for_action_server(
std::chrono::duration<int64_t, RatioT> timeout = std::chrono::duration<int64_t, RatioT>(-1)) std::chrono::duration<RepT, RatioT> timeout = std::chrono::duration<RepT, RatioT>(-1))
{ {
return wait_for_action_server_nanoseconds( return wait_for_action_server_nanoseconds(
std::chrono::duration_cast<std::chrono::nanoseconds>(timeout) std::chrono::duration_cast<std::chrono::nanoseconds>(timeout)

View file

@ -222,10 +222,10 @@ public:
* \param[in] callback User-defined callback function. * \param[in] callback User-defined callback function.
* \param[in] group Callback group to execute this timer's callback in. * \param[in] group Callback group to execute this timer's callback in.
*/ */
template<typename DurationT = std::milli, typename CallbackT> template<typename DurationRepT = int64_t, typename DurationT = std::milli, typename CallbackT>
typename rclcpp::WallTimer<CallbackT>::SharedPtr typename rclcpp::WallTimer<CallbackT>::SharedPtr
create_wall_timer( create_wall_timer(
std::chrono::duration<int64_t, DurationT> period, std::chrono::duration<DurationRepT, DurationT> period,
CallbackT callback, CallbackT callback,
rclcpp::callback_group::CallbackGroup::SharedPtr group = nullptr); rclcpp::callback_group::CallbackGroup::SharedPtr group = nullptr);

View file

@ -132,10 +132,10 @@ LifecycleNode::create_subscription(
allocator); allocator);
} }
template<typename DurationT, typename CallbackT> template<typename DurationRepT, typename DurationT, typename CallbackT>
typename rclcpp::WallTimer<CallbackT>::SharedPtr typename rclcpp::WallTimer<CallbackT>::SharedPtr
LifecycleNode::create_wall_timer( LifecycleNode::create_wall_timer(
std::chrono::duration<int64_t, DurationT> period, std::chrono::duration<DurationRepT, DurationT> period,
CallbackT callback, CallbackT callback,
rclcpp::callback_group::CallbackGroup::SharedPtr group) rclcpp::callback_group::CallbackGroup::SharedPtr group)
{ {