Fixup utilities (#692)

* Fixed dependencies in the utility.hpp/cpp

Signed-off-by: Dmitrij Dorezyuk <dmitrij.dorezyuk@hotmail.de>

* Add missing documentation for exceptions in utility.hpp

Signed-off-by: Dmitrij Dorezyuk <dmitrij.dorezyuk@hotmail.de>

* Add rclcpp namespace to the utility.cpp

Signed-off-by: Dmitrij Dorezyuk <dmitrij.dorezyuk@hotmail.de>

* Add check for a non-negative nonros_argc value

Signed-off-by: Dmitrij Dorezyuk <dmitrij.dorezyuk@hotmail.de>

* Simplify syntax for the return_arguments

Signed-off-by: Dmitrij Dorezyuk <dmitrij.dorezyuk@hotmail.de>

* Incorporate Review

Signed-off-by: Dmitrij Dorezyuk <dmitrij.dorezyuk@hotmail.de>
This commit is contained in:
Dima Dorezyuk 2019-04-20 01:19:17 +02:00 committed by Shane Loretz
parent ddcc1ec553
commit ddf4d345b3
2 changed files with 43 additions and 39 deletions

View file

@ -18,17 +18,14 @@
#include <chrono>
#include <functional>
#include <limits>
#include <string>
#include <vector>
#include "rclcpp/context.hpp"
#include "rclcpp/init_options.hpp"
#include "rclcpp/visibility_control.hpp"
#include "rmw/macros.h"
#include "rmw/rmw.h"
#ifdef ANDROID
#include <string>
#include <sstream>
namespace std
@ -104,6 +101,7 @@ uninstall_signal_handlers();
*
* \sa rclcpp::Context::init() for more details on arguments and possible exceptions
* \returns Members of the argument vector that are not ROS arguments.
* \throws anything remove_ros_arguments can throw
*/
RCLCPP_PUBLIC
std::vector<std::string>
@ -122,6 +120,8 @@ init_and_remove_ros_arguments(
* \param[in] argc Number of arguments.
* \param[in] argv Argument vector.
* \returns Members of the argument vector that are not ROS arguments.
* \throws anything throw_from_rcl_error can throw
* \throws rclcpp::exceptions::RCLErrorBase if the parsing fails
*/
RCLCPP_PUBLIC
std::vector<std::string>

View file

@ -24,45 +24,48 @@
#include "rcl/error_handling.h"
#include "rcl/rcl.h"
void
rclcpp::init(int argc, char const * const argv[], const rclcpp::InitOptions & init_options)
namespace rclcpp
{
using rclcpp::contexts::default_context::get_global_default_context;
void
init(int argc, char const * const argv[], const InitOptions & init_options)
{
using contexts::default_context::get_global_default_context;
get_global_default_context()->init(argc, argv, init_options);
// Install the signal handlers.
rclcpp::install_signal_handlers();
install_signal_handlers();
}
bool
rclcpp::install_signal_handlers()
install_signal_handlers()
{
return rclcpp::SignalHandler::get_global_signal_handler().install();
return SignalHandler::get_global_signal_handler().install();
}
bool
rclcpp::signal_handlers_installed()
signal_handlers_installed()
{
return rclcpp::SignalHandler::get_global_signal_handler().is_installed();
return SignalHandler::get_global_signal_handler().is_installed();
}
bool
rclcpp::uninstall_signal_handlers()
uninstall_signal_handlers()
{
return rclcpp::SignalHandler::get_global_signal_handler().uninstall();
return SignalHandler::get_global_signal_handler().uninstall();
}
std::vector<std::string>
rclcpp::init_and_remove_ros_arguments(
init_and_remove_ros_arguments(
int argc,
char const * const argv[],
const rclcpp::InitOptions & init_options)
const InitOptions & init_options)
{
rclcpp::init(argc, argv, init_options);
return rclcpp::remove_ros_arguments(argc, argv);
init(argc, argv, init_options);
return remove_ros_arguments(argc, argv);
}
std::vector<std::string>
rclcpp::remove_ros_arguments(int argc, char const * const argv[])
remove_ros_arguments(int argc, char const * const argv[])
{
rcl_allocator_t alloc = rcl_get_default_allocator();
rcl_arguments_t parsed_args = rcl_get_zero_initialized_arguments();
@ -71,7 +74,7 @@ rclcpp::remove_ros_arguments(int argc, char const * const argv[])
ret = rcl_parse_arguments(argc, argv, alloc, &parsed_args);
if (RCL_RET_OK != ret) {
rclcpp::exceptions::throw_from_rcl_error(ret, "failed to parse arguments");
exceptions::throw_from_rcl_error(ret, "failed to parse arguments");
}
int nonros_argc = 0;
@ -84,9 +87,9 @@ rclcpp::remove_ros_arguments(int argc, char const * const argv[])
&nonros_argc,
&nonros_argv);
if (RCL_RET_OK != ret) {
if (RCL_RET_OK != ret || nonros_argc < 0) {
// Not using throw_from_rcl_error, because we may need to append deallocation failures.
rclcpp::exceptions::RCLErrorBase base_exc(ret, rcl_get_error_state());
exceptions::RCLErrorBase base_exc(ret, rcl_get_error_state());
rcl_reset_error();
if (NULL != nonros_argv) {
alloc.deallocate(nonros_argv, alloc.state);
@ -97,11 +100,10 @@ rclcpp::remove_ros_arguments(int argc, char const * const argv[])
rcl_get_error_string().str;
rcl_reset_error();
}
throw rclcpp::exceptions::RCLError(base_exc, "");
throw exceptions::RCLError(base_exc, "");
}
std::vector<std::string> return_arguments;
return_arguments.resize(nonros_argc);
std::vector<std::string> return_arguments(nonros_argc);
for (int ii = 0; ii < nonros_argc; ++ii) {
return_arguments[ii] = std::string(nonros_argv[ii]);
@ -113,7 +115,7 @@ rclcpp::remove_ros_arguments(int argc, char const * const argv[])
ret = rcl_arguments_fini(&parsed_args);
if (RCL_RET_OK != ret) {
rclcpp::exceptions::throw_from_rcl_error(
exceptions::throw_from_rcl_error(
ret, "failed to cleanup parsed arguments, leaking memory");
}
@ -121,9 +123,9 @@ rclcpp::remove_ros_arguments(int argc, char const * const argv[])
}
bool
rclcpp::ok(rclcpp::Context::SharedPtr context)
ok(Context::SharedPtr context)
{
using rclcpp::contexts::default_context::get_global_default_context;
using contexts::default_context::get_global_default_context;
if (nullptr == context) {
context = get_global_default_context();
}
@ -131,30 +133,30 @@ rclcpp::ok(rclcpp::Context::SharedPtr context)
}
bool
rclcpp::is_initialized(rclcpp::Context::SharedPtr context)
is_initialized(Context::SharedPtr context)
{
return rclcpp::ok(context);
return ok(context);
}
bool
rclcpp::shutdown(rclcpp::Context::SharedPtr context, const std::string & reason)
shutdown(Context::SharedPtr context, const std::string & reason)
{
using rclcpp::contexts::default_context::get_global_default_context;
using contexts::default_context::get_global_default_context;
auto default_context = get_global_default_context();
if (nullptr == context) {
context = default_context;
}
bool ret = context->shutdown(reason);
if (context == default_context) {
rclcpp::uninstall_signal_handlers();
uninstall_signal_handlers();
}
return ret;
}
void
rclcpp::on_shutdown(std::function<void()> callback, rclcpp::Context::SharedPtr context)
on_shutdown(std::function<void()> callback, Context::SharedPtr context)
{
using rclcpp::contexts::default_context::get_global_default_context;
using contexts::default_context::get_global_default_context;
if (nullptr == context) {
context = get_global_default_context();
}
@ -162,9 +164,9 @@ rclcpp::on_shutdown(std::function<void()> callback, rclcpp::Context::SharedPtr c
}
bool
rclcpp::sleep_for(const std::chrono::nanoseconds & nanoseconds, rclcpp::Context::SharedPtr context)
sleep_for(const std::chrono::nanoseconds & nanoseconds, Context::SharedPtr context)
{
using rclcpp::contexts::default_context::get_global_default_context;
using contexts::default_context::get_global_default_context;
if (nullptr == context) {
context = get_global_default_context();
}
@ -172,13 +174,15 @@ rclcpp::sleep_for(const std::chrono::nanoseconds & nanoseconds, rclcpp::Context:
}
const char *
rclcpp::get_c_string(const char * string_in)
get_c_string(const char * string_in)
{
return string_in;
}
const char *
rclcpp::get_c_string(const std::string & string_in)
get_c_string(const std::string & string_in)
{
return string_in.c_str();
}
} // namespace rclcpp