diff --git a/CMakeLists.txt b/CMakeLists.txt index 07dd977..6f6d6f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,6 @@ add_library(${PROJECT_NAME} "src/dynamic_message_type_support_struct.c" "src/identifier.c" - "src/types.c" ) if(WIN32) target_compile_definitions(${PROJECT_NAME} diff --git a/README.md b/README.md index 5993fd6..7433e09 100644 --- a/README.md +++ b/README.md @@ -10,13 +10,16 @@ Properly implemented, a user should be able to, given a serialized buffer, the s ```cpp // Init Serialization Support (in this case, using FastRTPS) -rosidl_dynamic_typesupport_serialization_support_t * serialization_support = - rosidl_dynamic_typesupport_serialization_support_create( - rosidl_dynamic_typesupport_fastrtps_create_serialization_support_impl(), - rosidl_dynamic_typesupport_fastrtps_create_serialization_support_interface()); +rosidl_dynamic_typesupport_serialization_support_t serialization_support; + rosidl_dynamic_typesupport_serialization_support_init( + rosidl_dynamic_typesupport_fastrtps_init_serialization_support_impl(), + rosidl_dynamic_typesupport_fastrtps_init_serialization_support_interface(), + rcutils_get_default_allocator(), + &serialization_support); // Configure Dynamic Type Builder -rosidl_dynamic_typesupport_dynamic_type_builder_t * flat_builder = rosidl_dynamic_typesupport_dynamic_type_builder_create(serialization_support, "flat"); +rosidl_dynamic_typesupport_dynamic_type_builder_t * flat_builder = + rosidl_dynamic_typesupport_dynamic_type_builder_init(&serialization_support, "flat"); rosidl_dynamic_typesupport_dynamic_type_builder_add_bool_member(flat_builder, 0, "bool_field"); rosidl_dynamic_typesupport_dynamic_type_builder_add_int32_member(flat_builder, 1, "int32_field"); rosidl_dynamic_typesupport_dynamic_type_builder_add_string_member(flat_builder, 2, "string_field"); @@ -24,11 +27,11 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_string_member(flat_builder, // Create Dynamic Type rosidl_dynamic_typesupport_dynamic_type_t * flat_type = rosidl_dynamic_typesupport_dynamic_type_builder_build(flat_builder); -rosidl_dynamic_typesupport_dynamic_type_builder_destroy(flat_builder); +rosidl_dynamic_typesupport_dynamic_type_builder_fini(flat_builder); // Create Dynamic Data rosidl_dynamic_typesupport_dynamic_data_t * flat_data = - rosidl_dynamic_typesupport_dynamic_data_create_from_dynamic_type(flat_type); + rosidl_dynamic_typesupport_dynamic_data_init_from_dynamic_type(flat_type); // Dynamic Data Setters rosidl_dynamic_typesupport_dynamic_data_set_bool_value(flat_data, 0, true); @@ -46,7 +49,7 @@ rosidl_dynamic_typesupport_dynamic_data_get_string_value(flat_data, 2, &c); // // Cleanup free(c); -rosidl_dynamic_typesupport_dynamic_data_destroy(flat_data); +rosidl_dynamic_typesupport_dynamic_data_fini(flat_data); ``` diff --git a/include/rosidl_dynamic_typesupport/api/dynamic_data.h b/include/rosidl_dynamic_typesupport/api/dynamic_data.h index 07d16b3..f5a2a6e 100644 --- a/include/rosidl_dynamic_typesupport/api/dynamic_data.h +++ b/include/rosidl_dynamic_typesupport/api/dynamic_data.h @@ -22,12 +22,39 @@ extern "C" { #endif +#include #include #include -#include -#include -#include +#include "rosidl_dynamic_typesupport/api/serialization_support.h" +#include "rosidl_dynamic_typesupport/api/serialization_support_interface.h" +#include "rosidl_dynamic_typesupport/visibility_control.h" +#include "rosidl_dynamic_typesupport/types.h" +#include "rosidl_dynamic_typesupport/uchar.h" + +// Dynamic Data Impl +struct rosidl_dynamic_typesupport_dynamic_data_impl_s +{ + rcutils_allocator_t allocator; + void * handle; +}; + +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rosidl_dynamic_typesupport_dynamic_data_impl_t +rosidl_dynamic_typesupport_get_zero_initialized_dynamic_data_impl(void); + +// Dynamic Data +struct rosidl_dynamic_typesupport_dynamic_data_s +{ + rcutils_allocator_t allocator; + rosidl_dynamic_typesupport_dynamic_data_impl_t impl; + // !!! Lifetime is NOT managed by this struct + rosidl_dynamic_typesupport_serialization_support_t * serialization_support; +}; + +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rosidl_dynamic_typesupport_dynamic_data_t +rosidl_dynamic_typesupport_get_zero_initialized_dynamic_data(void); // =============================================================================================== // DYNAMIC DATA @@ -90,7 +117,8 @@ rcutils_ret_t rosidl_dynamic_typesupport_dynamic_data_loan_value( rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data, rosidl_dynamic_typesupport_member_id_t id, - rosidl_dynamic_typesupport_dynamic_data_t ** loaned_dynamic_data); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_t * loaned_dynamic_data); // OUT ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t @@ -98,6 +126,12 @@ rosidl_dynamic_typesupport_dynamic_data_return_loaned_value( rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data, rosidl_dynamic_typesupport_dynamic_data_t * inner_dynamic_data); +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rcutils_ret_t +rosidl_dynamic_typesupport_dynamic_data_return_and_destroy_loaned_value( + rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data, + rosidl_dynamic_typesupport_dynamic_data_t * inner_dynamic_data); + ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t rosidl_dynamic_typesupport_dynamic_data_get_name( @@ -109,21 +143,29 @@ rosidl_dynamic_typesupport_dynamic_data_get_name( // DYNAMIC DATA CONSTRUCTION ======================================================================= ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_data_create_from_dynamic_type_builder( +rosidl_dynamic_typesupport_dynamic_data_init_from_dynamic_type_builder( rosidl_dynamic_typesupport_dynamic_type_builder_t * dynamic_type_builder, - rosidl_dynamic_typesupport_dynamic_data_t ** dynamic_data); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data); // OUT ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_data_create_from_dynamic_type( +rosidl_dynamic_typesupport_dynamic_data_init_from_dynamic_type( rosidl_dynamic_typesupport_dynamic_type_t * dynamic_type, - rosidl_dynamic_typesupport_dynamic_data_t ** dynamic_data); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data); // OUT ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t rosidl_dynamic_typesupport_dynamic_data_clone( const rosidl_dynamic_typesupport_dynamic_data_t * other_dynamic_data, - rosidl_dynamic_typesupport_dynamic_data_t ** dynamic_data); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data); // OUT + +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rcutils_ret_t +rosidl_dynamic_typesupport_dynamic_data_fini( + rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data); ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t @@ -136,15 +178,13 @@ ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t rosidl_dynamic_typesupport_dynamic_data_serialize( rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data, - rcutils_uint8_array_t * buffer, // OUT - bool * serialized); // OUT + rcutils_uint8_array_t * buffer); // OUT ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t rosidl_dynamic_typesupport_dynamic_data_deserialize( rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data, // OUT - rcutils_uint8_array_t * buffer, - bool * success); // OUT + rcutils_uint8_array_t * buffer); // DYNAMIC DATA PRIMITIVE MEMBER GETTERS =========================================================== @@ -564,7 +604,9 @@ ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t rosidl_dynamic_typesupport_dynamic_data_get_complex_value( const rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data, - rosidl_dynamic_typesupport_member_id_t id, rosidl_dynamic_typesupport_dynamic_data_t ** value); + rosidl_dynamic_typesupport_member_id_t id, + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_t * value); ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t diff --git a/include/rosidl_dynamic_typesupport/api/dynamic_type.h b/include/rosidl_dynamic_typesupport/api/dynamic_type.h index 249e963..000e97a 100644 --- a/include/rosidl_dynamic_typesupport/api/dynamic_type.h +++ b/include/rosidl_dynamic_typesupport/api/dynamic_type.h @@ -22,11 +22,61 @@ extern "C" { #endif +#include #include -#include -#include +#include "rosidl_dynamic_typesupport/api/serialization_support.h" +#include "rosidl_dynamic_typesupport/api/serialization_support_interface.h" +#include "rosidl_dynamic_typesupport/types.h" +#include "rosidl_dynamic_typesupport/visibility_control.h" +// Dynamic Type Builder Impl +struct rosidl_dynamic_typesupport_dynamic_type_builder_impl_s +{ + rcutils_allocator_t allocator; + void * handle; +}; + +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rosidl_dynamic_typesupport_dynamic_type_builder_impl_t +rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_builder_impl(void); + +// Dynamic Type Builder +struct rosidl_dynamic_typesupport_dynamic_type_builder_s +{ + rcutils_allocator_t allocator; + rosidl_dynamic_typesupport_dynamic_type_builder_impl_t impl; + // !!! Lifetime is NOT managed by this struct + rosidl_dynamic_typesupport_serialization_support_t * serialization_support; +}; + +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rosidl_dynamic_typesupport_dynamic_type_builder_t +rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_builder(void); + +// Dynamic Type Impl +struct rosidl_dynamic_typesupport_dynamic_type_impl_s +{ + rcutils_allocator_t allocator; + void * handle; +}; + +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rosidl_dynamic_typesupport_dynamic_type_impl_t +rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_impl(void); + +// Dynamic Type +struct rosidl_dynamic_typesupport_dynamic_type_s +{ + rcutils_allocator_t allocator; + rosidl_dynamic_typesupport_dynamic_type_impl_t impl; + // !!! Lifetime is NOT managed by this struct + rosidl_dynamic_typesupport_serialization_support_t * serialization_support; +}; + +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rosidl_dynamic_typesupport_dynamic_type_t +rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type(void); // ================================================================================================= // DYNAMIC TYPE @@ -50,23 +100,31 @@ rosidl_dynamic_typesupport_dynamic_type_get_member_count( // DYNAMIC TYPE CONSTRUCTION ======================================================================= ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_type_builder_create( +rosidl_dynamic_typesupport_dynamic_type_builder_init( rosidl_dynamic_typesupport_serialization_support_t * serialization_support, const char * name, size_t name_length, - rosidl_dynamic_typesupport_dynamic_type_builder_t ** dynamic_type_builder); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_builder_t * dynamic_type_builder); // OUT ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t rosidl_dynamic_typesupport_dynamic_type_builder_clone( const rosidl_dynamic_typesupport_dynamic_type_builder_t * other, - rosidl_dynamic_typesupport_dynamic_type_builder_t ** dynamic_type_builder); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_builder_t * dynamic_type_builder); // OUT ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description( +rosidl_dynamic_typesupport_dynamic_type_builder_init_from_description( rosidl_dynamic_typesupport_serialization_support_t * serialization_support, const rosidl_runtime_c__type_description__TypeDescription * description, - rosidl_dynamic_typesupport_dynamic_type_builder_t ** dynamic_type_builder); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_builder_t * dynamic_type_builder); // OUT + +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rcutils_ret_t +rosidl_dynamic_typesupport_dynamic_type_builder_fini( + rosidl_dynamic_typesupport_dynamic_type_builder_t * dynamic_type_builder); ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t @@ -75,22 +133,30 @@ rosidl_dynamic_typesupport_dynamic_type_builder_destroy( ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_type_create_from_dynamic_type_builder( +rosidl_dynamic_typesupport_dynamic_type_init_from_dynamic_type_builder( rosidl_dynamic_typesupport_dynamic_type_builder_t * dynamic_type_builder, - rosidl_dynamic_typesupport_dynamic_type_t ** dynamic_type); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_t * dynamic_type); // OUT ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_type_create_from_description( +rosidl_dynamic_typesupport_dynamic_type_init_from_description( rosidl_dynamic_typesupport_serialization_support_t * serialization_support, const rosidl_runtime_c__type_description__TypeDescription * description, - rosidl_dynamic_typesupport_dynamic_type_t ** dynamic_type); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_t * dynamic_type); // OUT ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t rosidl_dynamic_typesupport_dynamic_type_clone( const rosidl_dynamic_typesupport_dynamic_type_t * other, - rosidl_dynamic_typesupport_dynamic_type_t ** dynamic_type); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_t * dynamic_type); // OUT + +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rcutils_ret_t +rosidl_dynamic_typesupport_dynamic_type_fini( + rosidl_dynamic_typesupport_dynamic_type_t * dynamic_type); ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t diff --git a/include/rosidl_dynamic_typesupport/api/serialization_support.h b/include/rosidl_dynamic_typesupport/api/serialization_support.h index 6702907..c3c463d 100644 --- a/include/rosidl_dynamic_typesupport/api/serialization_support.h +++ b/include/rosidl_dynamic_typesupport/api/serialization_support.h @@ -22,8 +22,6 @@ extern "C" { #endif -#include - #include #include #include @@ -31,6 +29,40 @@ extern "C" { #include +#include "rosidl_dynamic_typesupport/types.h" + +/// Serialization Support Impl +/// For anything necessary or useful for the operation of the serialization lib +/// (e.g. singleton dynamic type and dynamic data factories) +struct rosidl_dynamic_typesupport_serialization_support_impl_s +{ + rcutils_allocator_t allocator; + const char * serialization_library_identifier; + void * handle; +}; + +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rosidl_dynamic_typesupport_serialization_support_impl_t +rosidl_dynamic_typesupport_get_zero_initialized_serialization_support_impl(void); + +/// Serialization Support +/// This is the main structure that encompasses: +/// - impl - The library-specific objects or implementation details +/// - methods - The shared serialization support interface, populated with serialization +/// library-specific function pointers +struct rosidl_dynamic_typesupport_serialization_support_s +{ + rcutils_allocator_t allocator; + const char * serialization_library_identifier; + + rosidl_dynamic_typesupport_serialization_support_impl_t impl; + // Can't call it `interface` because it's a reserved term in some Windows versions... + rosidl_dynamic_typesupport_serialization_support_interface_t methods; +}; + +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rosidl_dynamic_typesupport_serialization_support_t +rosidl_dynamic_typesupport_get_zero_initialized_serialization_support(void); // CORE ============================================================================================ ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC @@ -40,17 +72,17 @@ rosidl_dynamic_typesupport_serialization_support_get_library_identifier( ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t -rosidl_dynamic_typesupport_serialization_support_create( +rosidl_dynamic_typesupport_serialization_support_init( rosidl_dynamic_typesupport_serialization_support_impl_t * impl, rosidl_dynamic_typesupport_serialization_support_interface_t * methods, - rosidl_dynamic_typesupport_serialization_support_t ** serialization_support); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_serialization_support_t * serialization_support); // OUT ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t -rosidl_dynamic_typesupport_serialization_support_destroy( +rosidl_dynamic_typesupport_serialization_support_fini( rosidl_dynamic_typesupport_serialization_support_t * serialization_support); - #ifdef __cplusplus } #endif diff --git a/include/rosidl_dynamic_typesupport/api/serialization_support_interface.h b/include/rosidl_dynamic_typesupport/api/serialization_support_interface.h index 158371b..470c03a 100644 --- a/include/rosidl_dynamic_typesupport/api/serialization_support_interface.h +++ b/include/rosidl_dynamic_typesupport/api/serialization_support_interface.h @@ -25,12 +25,14 @@ extern "C" { #include #include +#include #include #include -#include -#include #include +#include "rosidl_dynamic_typesupport/types.h" +#include "rosidl_dynamic_typesupport/uchar.h" + /// This interface must be adopted by all downstream serialization library implementations // ================================================================================================= @@ -53,12 +55,13 @@ struct rosidl_dynamic_typesupport_serialization_support_interface_s */ // CORE - const char * library_identifier; + rcutils_allocator_t allocator; + const char * serialization_library_identifier; - rcutils_ret_t (* serialization_support_impl_destroy)( + rcutils_ret_t (* serialization_support_impl_fini)( rosidl_dynamic_typesupport_serialization_support_impl_t * impl); - rcutils_ret_t (* serialization_support_interface_destroy)( + rcutils_ret_t (* serialization_support_interface_fini)( rosidl_dynamic_typesupport_serialization_support_interface_t * methods); // =============================================================================================== @@ -80,32 +83,36 @@ struct rosidl_dynamic_typesupport_serialization_support_interface_s // DYNAMIC TYPE CONSTRUCTION - rcutils_ret_t (* dynamic_type_builder_create)( + rcutils_ret_t (* dynamic_type_builder_init)( rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, const char * name, size_t name_length, - rosidl_dynamic_typesupport_dynamic_type_builder_impl_t ** dynamic_type_builder); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_builder_impl_t * dynamic_type_builder); // OUT rcutils_ret_t (* dynamic_type_builder_clone)( rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, const rosidl_dynamic_typesupport_dynamic_type_builder_impl_t * other, - rosidl_dynamic_typesupport_dynamic_type_builder_impl_t ** dynamic_type_builder); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_builder_impl_t * dynamic_type_builder); // OUT - rcutils_ret_t (* dynamic_type_builder_destroy)( + rcutils_ret_t (* dynamic_type_builder_fini)( rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, rosidl_dynamic_typesupport_dynamic_type_builder_impl_t * dynamic_type_builder); - rcutils_ret_t (* dynamic_type_create_from_dynamic_type_builder)( + rcutils_ret_t (* dynamic_type_init_from_dynamic_type_builder)( rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, rosidl_dynamic_typesupport_dynamic_type_builder_impl_t * dynamic_type_builder, - rosidl_dynamic_typesupport_dynamic_type_impl_t ** dynamic_type); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_impl_t * dynamic_type); // OUT rcutils_ret_t (* dynamic_type_clone)( rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, const rosidl_dynamic_typesupport_dynamic_type_impl_t * other, - rosidl_dynamic_typesupport_dynamic_type_impl_t ** dynamic_type); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_impl_t * dynamic_type); // OUT - rcutils_ret_t (* dynamic_type_destroy)( + rcutils_ret_t (* dynamic_type_fini)( rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, rosidl_dynamic_typesupport_dynamic_type_impl_t * dynamic_type); @@ -897,7 +904,8 @@ struct rosidl_dynamic_typesupport_serialization_support_interface_s rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, rosidl_dynamic_typesupport_dynamic_data_impl_t * dynamic_data, rosidl_dynamic_typesupport_member_id_t id, - rosidl_dynamic_typesupport_dynamic_data_impl_t ** loaned_dynamic_data); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_impl_t * loaned_dynamic_data); // OUT rcutils_ret_t (* dynamic_data_return_loaned_value)( rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, @@ -912,22 +920,25 @@ struct rosidl_dynamic_typesupport_serialization_support_interface_s // DYNAMIC DATA CONSTRUCTION - rcutils_ret_t (* dynamic_data_create_from_dynamic_type_builder)( + rcutils_ret_t (* dynamic_data_init_from_dynamic_type_builder)( rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, rosidl_dynamic_typesupport_dynamic_type_builder_impl_t * dynamic_type_builder, - rosidl_dynamic_typesupport_dynamic_data_impl_t ** dynamic_data); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_impl_t * dynamic_data); // OUT - rcutils_ret_t (* dynamic_data_create_from_dynamic_type)( + rcutils_ret_t (* dynamic_data_init_from_dynamic_type)( rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, rosidl_dynamic_typesupport_dynamic_type_impl_t * type, - rosidl_dynamic_typesupport_dynamic_data_impl_t ** dynamic_data); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_impl_t * dynamic_data); // OUT rcutils_ret_t (* dynamic_data_clone)( rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, const rosidl_dynamic_typesupport_dynamic_data_impl_t * other, - rosidl_dynamic_typesupport_dynamic_data_impl_t ** dynamic_data); // OUT + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_impl_t * dynamic_data); // OUT - rcutils_ret_t (* dynamic_data_destroy)( + rcutils_ret_t (* dynamic_data_fini)( rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, rosidl_dynamic_typesupport_dynamic_data_impl_t * dynamic_data); @@ -947,14 +958,12 @@ struct rosidl_dynamic_typesupport_serialization_support_interface_s rcutils_ret_t (* dynamic_data_serialize)( rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, rosidl_dynamic_typesupport_dynamic_data_impl_t * dynamic_data, - rcutils_uint8_array_t * buffer, // OUT - bool * serialized); // OUT + rcutils_uint8_array_t * buffer); // OUT rcutils_ret_t (* dynamic_data_deserialize)( rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, rosidl_dynamic_typesupport_dynamic_data_impl_t * dynamic_data, // OUT - rcutils_uint8_array_t * buffer, - bool * deserialized); // OUT + rcutils_uint8_array_t * buffer); // DYNAMIC DATA PRIMITIVE MEMBER GETTERS @@ -1360,7 +1369,8 @@ struct rosidl_dynamic_typesupport_serialization_support_interface_s rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, const rosidl_dynamic_typesupport_dynamic_data_impl_t * dynamic_data, rosidl_dynamic_typesupport_member_id_t id, - rosidl_dynamic_typesupport_dynamic_data_impl_t ** value); // OUT (copies) + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_impl_t * value); // OUT (copies) rcutils_ret_t (* dynamic_data_set_complex_value)( rosidl_dynamic_typesupport_serialization_support_impl_t * serialization_support, @@ -1382,6 +1392,9 @@ struct rosidl_dynamic_typesupport_serialization_support_interface_s rosidl_dynamic_typesupport_member_id_t * out_id); // OUT }; +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rosidl_dynamic_typesupport_serialization_support_interface_t +rosidl_dynamic_typesupport_get_zero_initialized_serialization_support_interface(void); #ifdef __cplusplus } diff --git a/include/rosidl_dynamic_typesupport/dynamic_message_type_support_struct.h b/include/rosidl_dynamic_typesupport/dynamic_message_type_support_struct.h index e2f4a4f..b4cc978 100644 --- a/include/rosidl_dynamic_typesupport/dynamic_message_type_support_struct.h +++ b/include/rosidl_dynamic_typesupport/dynamic_message_type_support_struct.h @@ -25,6 +25,8 @@ extern "C" #include #include +#include "rosidl_dynamic_typesupport/api/dynamic_type.h" +#include "rosidl_dynamic_typesupport/api/dynamic_data.h" #include "rosidl_dynamic_typesupport/api/serialization_support.h" #include "rosidl_dynamic_typesupport/identifier.h" #include "rosidl_dynamic_typesupport/types.h" @@ -48,36 +50,35 @@ extern "C" // outlives those downstream classes. typedef struct rosidl_dynamic_message_type_support_impl_s { - rosidl_type_hash_t * type_hash; - rosidl_runtime_c__type_description__TypeDescription * type_description; - - // NOTE(methylDragon): Unused for now, but placed here just in case - rosidl_runtime_c__type_description__TypeSource__Sequence * type_description_sources; - rosidl_dynamic_typesupport_serialization_support_t * serialization_support; - - // NOTE(methylDragon): I'm unsure if these are necessary. Though I think they are convenient. - // dynamic_message_type moreso than dynamic_message. - // - // I'd err on including them to be able to support more middlewares - // - // The dynamic_message_type allows us to do a one time alloc and reuse it for - // subscription creation and data creation - // The dynamic_message allows us to either reuse it, or clone it, but it's - // technically redundant because data can be created from dynamic_message_type + rcutils_allocator_t allocator; + + rosidl_type_hash_t type_hash; + rosidl_runtime_c__type_description__TypeDescription type_description; + + // Unused for now, but placed here just in case + rosidl_runtime_c__type_description__TypeSource__Sequence type_description_sources; + + rosidl_dynamic_typesupport_serialization_support_t serialization_support; + + // The dynamic_message_type allows us to do a one time alloc and reuse it for subscription + // creation and data creation rosidl_dynamic_typesupport_dynamic_type_t * dynamic_message_type; + + // The dynamic_message allows us to either reuse it, or clone it, but it's technically redundant + // because data can be created from dynamic_message_type rosidl_dynamic_typesupport_dynamic_data_t * dynamic_message; } rosidl_dynamic_message_type_support_impl_t; -/// Create a dynamic type message typesupport with bound message description +/// Initialize a dynamic type message type support with encapsulated message description /** - * NOTE: Take note of the ownership rules for the returned struct and the `description` argument! + * Take note of the ownership rules for the returned struct and the `description` argument. * + * The `rosidl_message_type_support_t *` returned from this function has different ownership rules + * compared to the statically allocated `rosidl_message_type_support_t` structs from code-generated + * types. * - * Ownership: - * - The `rosidl_message_type_support_t *` returned from this function has different ownership - * rules compared to the statically allocated `rosidl_message_type_support_t` structs from - * code-generated types! - * - The caller is responsible for deallocating the returned pointer + * The `type_hash`, `type_description`, `type_description_sources`, and `allocator` arguments are + * copied. * *
* Attribute | Adherence @@ -89,21 +90,51 @@ typedef struct rosidl_dynamic_message_type_support_impl_s */ ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t -rosidl_dynamic_message_type_support_handle_create( +rosidl_dynamic_message_type_support_handle_init( rosidl_dynamic_typesupport_serialization_support_t * serialization_support, const rosidl_type_hash_t * type_hash, const rosidl_runtime_c__type_description__TypeDescription * type_description, const rosidl_runtime_c__type_description__TypeSource__Sequence * type_description_sources, - rosidl_message_type_support_t ** ts); // OUT + rcutils_allocator_t * allocator, + rosidl_message_type_support_t * ts); // OUT -/// Destroy a rosidl_message_type_support_t obtained with -/// `rosidl_dynamic_message_type_support_handle_create()`, which has dynamically allocated members +/// Finalize a rosidl_message_type_support_t obtained with +/// `rosidl_dynamic_message_type_support_handle_init()`, which has dynamically allocated members /// /// NOTE: Using this on a statically allocated typesupport will cause undefined behavior! /// (Static memory will get freed in that case.) ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC rcutils_ret_t -rosidl_dynamic_message_type_support_handle_destroy(rosidl_message_type_support_t * ts); +rosidl_dynamic_message_type_support_handle_fini(rosidl_message_type_support_t * ts); + +/// Initialized a `rosidl_dynamic_message_type_support_impl_t` with encapsulated message description +/** + * The `type_hash`, `type_description`, `type_description_sources`, and `allocator` arguments are + * copied. + * + *
+ * Attribute | Adherence + * ------------------ | ------------- + * Allocates Memory | Yes + * Thread-Safe | No + * Uses Atomics | No + * Lock-Free | Yes + */ +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rcutils_ret_t +rosidl_dynamic_message_type_support_handle_impl_init( + rosidl_dynamic_typesupport_serialization_support_t * serialization_support, + const rosidl_type_hash_t * type_hash, + const rosidl_runtime_c__type_description__TypeDescription * type_description, + const rosidl_runtime_c__type_description__TypeSource__Sequence * type_description_sources, + rcutils_allocator_t * allocator, + rosidl_dynamic_message_type_support_impl_t * ts_impl); // OUT + +/// Finalize a `rosidl_dynamic_message_type_support_impl_t` +ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC +rcutils_ret_t +rosidl_dynamic_message_type_support_handle_impl_fini( + rosidl_dynamic_message_type_support_impl_t * ts_impl); /// Return type_hash member in rosidl_dynamic_message_type_support_impl_t ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC diff --git a/include/rosidl_dynamic_typesupport/types.h b/include/rosidl_dynamic_typesupport/types.h index 95b3ad1..8caa200 100644 --- a/include/rosidl_dynamic_typesupport/types.h +++ b/include/rosidl_dynamic_typesupport/types.h @@ -19,7 +19,6 @@ extern "C" { #endif - #include #include #include @@ -29,14 +28,14 @@ extern "C" { #include #include #include "rosidl_dynamic_typesupport/visibility_control.h" +#include "rosidl_dynamic_typesupport/uchar.h" +#include "rcutils/allocator.h" #include "rcutils/types/uint8_array.h" - // ================================================================================================= // DYNAMIC TYPESUPPORT // ================================================================================================= - // ID for accessing specific members of dynamic type or dynamic data typedef size_t rosidl_dynamic_typesupport_member_id_t; @@ -73,118 +72,6 @@ typedef struct \ rosidl_dynamic_typesupport_dynamic_data_impl_t; -// Interface Structs =============================================================================== -// These are the objects that the client libraries are expected to use - -/// Serialization Support -/// This is the main structure that encompasses: -/// - impl - The library-specific objects or implementation details -/// - methods - The shared serialization support interface, populated with serialization -/// library-specific function pointers -struct rosidl_dynamic_typesupport_serialization_support_s -{ - const char * library_identifier; - rosidl_dynamic_typesupport_serialization_support_impl_t * impl; - - // NOTE(methylDragon): Can't call it `interface` because it's a reserved term in some Windows - // versions... - rosidl_dynamic_typesupport_serialization_support_interface_t * methods; -}; - -ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC -rosidl_dynamic_typesupport_serialization_support_t -rosidl_dynamic_typesupport_get_zero_initialized_serialization_support(void); - - -// Dynamic Type Builder -struct rosidl_dynamic_typesupport_dynamic_type_builder_s -{ - rosidl_dynamic_typesupport_dynamic_type_builder_impl_t * impl; - // !!! Lifetime is NOT managed by this struct - rosidl_dynamic_typesupport_serialization_support_t * serialization_support; -}; - -ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC -rosidl_dynamic_typesupport_dynamic_type_builder_t -rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_builder(void); - - -// Dynamic Type -struct rosidl_dynamic_typesupport_dynamic_type_s -{ - rosidl_dynamic_typesupport_dynamic_type_impl_t * impl; - // !!! Lifetime is NOT managed by this struct - rosidl_dynamic_typesupport_serialization_support_t * serialization_support; -}; - -ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC -rosidl_dynamic_typesupport_dynamic_type_t -rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type(void); - - -// Dynamic Data -struct rosidl_dynamic_typesupport_dynamic_data_s -{ - rosidl_dynamic_typesupport_dynamic_data_impl_t * impl; - // !!! Lifetime is NOT managed by this struct - rosidl_dynamic_typesupport_serialization_support_t * serialization_support; -}; - -ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC -rosidl_dynamic_typesupport_dynamic_data_t -rosidl_dynamic_typesupport_get_zero_initialized_dynamic_data(void); - - -// Impl Structs ==================================================================================== -// These are the objects that the serialization support libraries are expected to use - -/// Serialization Support Impl -/// For anything necessary or useful for the operation of the serialization lib -/// (e.g. singleton dynamic type and dynamic data factories) -struct rosidl_dynamic_typesupport_serialization_support_impl_s -{ - const char * library_identifier; - void * handle; -}; - -ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC -rosidl_dynamic_typesupport_serialization_support_impl_t -rosidl_dynamic_typesupport_get_zero_initialized_serialization_support_impl(void); - - -// Dynamic Type Builder Impl -struct rosidl_dynamic_typesupport_dynamic_type_builder_impl_s -{ - void * handle; -}; - -ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC -rosidl_dynamic_typesupport_dynamic_type_builder_impl_t -rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_builder_impl(void); - - -// Dynamic Type Impl -struct rosidl_dynamic_typesupport_dynamic_type_impl_s -{ - void * handle; -}; - -ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC -rosidl_dynamic_typesupport_dynamic_type_impl_t -rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_impl(void); - - -// Dynamic Data Impl -struct rosidl_dynamic_typesupport_dynamic_data_impl_s -{ - void * handle; -}; - -ROSIDL_DYNAMIC_TYPESUPPORT_PUBLIC -rosidl_dynamic_typesupport_dynamic_data_impl_t -rosidl_dynamic_typesupport_get_zero_initialized_dynamic_data_impl(void); - - // ================================================================================================= // FIELD TYPE INDICES // ================================================================================================= @@ -420,7 +307,6 @@ rosidl_dynamic_typesupport_get_zero_initialized_dynamic_data_impl(void); #define ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BOUNDED_WSTRING_UNBOUNDED_SEQUENCE \ rosidl_runtime_c__type_description__FieldType__FIELD_TYPE_BOUNDED_WSTRING_UNBOUNDED_SEQUENCE // 166 // NOLINT - #ifdef __cplusplus } #endif diff --git a/src/api/dynamic_data.c b/src/api/dynamic_data.c index 0634338..427ad64 100644 --- a/src/api/dynamic_data.c +++ b/src/api/dynamic_data.c @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include +#include "rosidl_dynamic_typesupport/api/dynamic_data.h" #include #include @@ -22,23 +22,49 @@ #include #include -#include -#include -#include +#include "rosidl_dynamic_typesupport/api/serialization_support.h" +#include "rosidl_dynamic_typesupport/macros.h" +#include "rosidl_dynamic_typesupport/types.h" +#include "rosidl_dynamic_typesupport/uchar.h" // ================================================================================================= // DYNAMIC DATA // ================================================================================================= +rosidl_dynamic_typesupport_dynamic_data_impl_t +rosidl_dynamic_typesupport_get_zero_initialized_dynamic_data_impl(void) +{ + static rosidl_dynamic_typesupport_dynamic_data_impl_t zero_dynamic_data_impl = { + // .allocator = // Initialized later + .handle = NULL + }; + zero_dynamic_data_impl.allocator = rcutils_get_zero_initialized_allocator(); + return zero_dynamic_data_impl; +} + +rosidl_dynamic_typesupport_dynamic_data_t +rosidl_dynamic_typesupport_get_zero_initialized_dynamic_data(void) +{ + static rosidl_dynamic_typesupport_dynamic_data_t zero_dynamic_data = { + // .allocator = // Initialized later + // .impl = // Initialized later + .serialization_support = NULL + }; + zero_dynamic_data.allocator = rcutils_get_zero_initialized_allocator(); + zero_dynamic_data.impl = + rosidl_dynamic_typesupport_get_zero_initialized_dynamic_data_impl(); + return zero_dynamic_data; +} + // DYNAMIC DATA UTILS ============================================================================== rcutils_ret_t rosidl_dynamic_typesupport_dynamic_data_clear_all_values( rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_clear_all_values)( - dynamic_data->serialization_support->impl, dynamic_data->impl); + return (dynamic_data->serialization_support->methods.dynamic_data_clear_all_values)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl); } @@ -47,8 +73,8 @@ rosidl_dynamic_typesupport_dynamic_data_clear_nonkey_values( rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_clear_nonkey_values)( - dynamic_data->serialization_support->impl, dynamic_data->impl); + return (dynamic_data->serialization_support->methods.dynamic_data_clear_nonkey_values)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl); } @@ -58,8 +84,8 @@ rosidl_dynamic_typesupport_dynamic_data_clear_value( rosidl_dynamic_typesupport_member_id_t id) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_clear_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, id); + return (dynamic_data->serialization_support->methods.dynamic_data_clear_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id); } @@ -72,14 +98,14 @@ rosidl_dynamic_typesupport_dynamic_data_equals( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(other, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(equals, RCUTILS_RET_INVALID_ARGUMENT); - if (dynamic_data->serialization_support->library_identifier != - other->serialization_support->library_identifier) + if (dynamic_data->serialization_support->serialization_library_identifier != + other->serialization_support->serialization_library_identifier) { RCUTILS_SET_ERROR_MSG("Library identifiers for dynamic datas do not match"); return RCUTILS_RET_INVALID_ARGUMENT; } - return (dynamic_data->serialization_support->methods->dynamic_data_equals)( - dynamic_data->serialization_support->impl, dynamic_data->impl, other->impl, equals); + return (dynamic_data->serialization_support->methods.dynamic_data_equals)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, &other->impl, equals); } @@ -90,8 +116,8 @@ rosidl_dynamic_typesupport_dynamic_data_get_item_count( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(item_count, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_get_item_count)( - dynamic_data->serialization_support->impl, dynamic_data->impl, item_count); + return (dynamic_data->serialization_support->methods.dynamic_data_get_item_count)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, item_count); } @@ -104,8 +130,8 @@ rosidl_dynamic_typesupport_dynamic_data_get_member_id_by_name( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(member_id, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_get_member_id_by_name)( - dynamic_data->serialization_support->impl, dynamic_data->impl, name, name_length, member_id); + return (dynamic_data->serialization_support->methods.dynamic_data_get_member_id_by_name)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, name, name_length, member_id); } @@ -117,8 +143,8 @@ rosidl_dynamic_typesupport_dynamic_data_get_member_id_at_index( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(member_id, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_get_member_id_at_index)( - dynamic_data->serialization_support->impl, dynamic_data->impl, index, member_id); + return (dynamic_data->serialization_support->methods.dynamic_data_get_member_id_at_index)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, index, member_id); } @@ -130,8 +156,8 @@ rosidl_dynamic_typesupport_dynamic_data_get_array_index( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(array_index, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_get_array_index)( - dynamic_data->serialization_support->impl, dynamic_data->impl, index, array_index); + return (dynamic_data->serialization_support->methods.dynamic_data_get_array_index)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, index, array_index); } @@ -139,26 +165,34 @@ rcutils_ret_t rosidl_dynamic_typesupport_dynamic_data_loan_value( rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data, rosidl_dynamic_typesupport_member_id_t id, - rosidl_dynamic_typesupport_dynamic_data_t ** loaned_dynamic_data) + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_t * loaned_dynamic_data) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(allocator, RCUTILS_RET_INVALID_ARGUMENT); + if (!rcutils_allocator_is_valid(allocator)) { + RCUTILS_SET_ERROR_MSG("allocator is invalid"); + return RCUTILS_RET_INVALID_ARGUMENT; + } RCUTILS_CHECK_ARGUMENT_FOR_NULL(loaned_dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - rosidl_dynamic_typesupport_dynamic_data_t * out = allocator.zero_allocate( - 1, sizeof(rosidl_dynamic_typesupport_dynamic_data_t), &allocator.state); - if (!out) { - RCUTILS_SET_ERROR_MSG("Could not allocate dynamic data"); - return RCUTILS_RET_BAD_ALLOC; + if (loaned_dynamic_data->impl.handle != NULL) { + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_data_fini(loaned_dynamic_data); + ); } - out->serialization_support = dynamic_data->serialization_support; + loaned_dynamic_data->serialization_support = dynamic_data->serialization_support; + loaned_dynamic_data->allocator = *allocator; ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK_WITH_CLEANUP( - (dynamic_data->serialization_support->methods->dynamic_data_loan_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, id, &out->impl), - allocator.deallocate(out, allocator.state) // Cleanup + (dynamic_data->serialization_support->methods.dynamic_data_loan_value)( + &dynamic_data->serialization_support->impl, + &dynamic_data->impl, + id, + allocator, + &loaned_dynamic_data->impl), + rosidl_dynamic_typesupport_dynamic_data_fini(dynamic_data) // Cleanup ); - *loaned_dynamic_data = out; return RCUTILS_RET_OK; } @@ -170,23 +204,40 @@ rosidl_dynamic_typesupport_dynamic_data_return_loaned_value( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(outer_dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(inner_dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); - if (outer_dynamic_data->serialization_support->library_identifier != - inner_dynamic_data->serialization_support->library_identifier) + if (outer_dynamic_data->serialization_support->serialization_library_identifier != + inner_dynamic_data->serialization_support->serialization_library_identifier) { RCUTILS_SET_ERROR_MSG("Library identifiers for dynamic datas do not match"); return RCUTILS_RET_INVALID_ARGUMENT; } ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( - (outer_dynamic_data->serialization_support->methods->dynamic_data_return_loaned_value)( - outer_dynamic_data->serialization_support->impl, - outer_dynamic_data->impl, - inner_dynamic_data->impl) + (outer_dynamic_data->serialization_support->methods.dynamic_data_return_loaned_value)( + &outer_dynamic_data->serialization_support->impl, + &outer_dynamic_data->impl, + &inner_dynamic_data->impl) ); - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - allocator.deallocate(inner_dynamic_data, &allocator.state); return RCUTILS_RET_OK; } + +rcutils_ret_t +rosidl_dynamic_typesupport_dynamic_data_return_and_destroy_loaned_value( + rosidl_dynamic_typesupport_dynamic_data_t * outer_dynamic_data, + rosidl_dynamic_typesupport_dynamic_data_t * inner_dynamic_data) +{ + RCUTILS_CHECK_ARGUMENT_FOR_NULL(outer_dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(inner_dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); + + rcutils_allocator_t allocator = inner_dynamic_data->allocator; + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_data_return_loaned_value( + outer_dynamic_data, inner_dynamic_data)); + + allocator.deallocate(inner_dynamic_data, allocator.state); + return RCUTILS_RET_OK; +} + + rcutils_ret_t rosidl_dynamic_typesupport_dynamic_data_get_name( const rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data, @@ -196,62 +247,76 @@ rosidl_dynamic_typesupport_dynamic_data_get_name( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name_length, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_get_name)( - dynamic_data->serialization_support->impl, dynamic_data->impl, name, name_length); + return (dynamic_data->serialization_support->methods.dynamic_data_get_name)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, name, name_length); } // DYNAMIC DATA CONSTRUCTION ======================================================================= rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_data_create_from_dynamic_type_builder( +rosidl_dynamic_typesupport_dynamic_data_init_from_dynamic_type_builder( rosidl_dynamic_typesupport_dynamic_type_builder_t * dynamic_type_builder, - rosidl_dynamic_typesupport_dynamic_data_t ** dynamic_data) + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(allocator, RCUTILS_RET_INVALID_ARGUMENT); + if (!rcutils_allocator_is_valid(allocator)) { + RCUTILS_SET_ERROR_MSG("allocator is invalid"); + return RCUTILS_RET_INVALID_ARGUMENT; + } RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - rosidl_dynamic_typesupport_dynamic_data_t * out = allocator.zero_allocate( - 1, sizeof(rosidl_dynamic_typesupport_dynamic_data_t), &allocator.state); - if (!out) { - RCUTILS_SET_ERROR_MSG("Could not allocate dynamic data"); - return RCUTILS_RET_BAD_ALLOC; + if (dynamic_data->impl.handle != NULL) { + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_data_fini(dynamic_data); + ); } - out->serialization_support = dynamic_type_builder->serialization_support; + dynamic_data->serialization_support = dynamic_type_builder->serialization_support; + dynamic_data->allocator = *allocator; ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK_WITH_CLEANUP( - (out->serialization_support->methods->dynamic_data_create_from_dynamic_type_builder)( - out->serialization_support->impl, dynamic_type_builder->impl, &out->impl), - allocator.deallocate(out, allocator.state) // Cleanup + (dynamic_data->serialization_support->methods.dynamic_data_init_from_dynamic_type_builder)( + &dynamic_data->serialization_support->impl, + &dynamic_type_builder->impl, + allocator, + &dynamic_data->impl), + rosidl_dynamic_typesupport_dynamic_data_fini(dynamic_data) // Cleanup ); - *dynamic_data = out; return RCUTILS_RET_OK; } rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_data_create_from_dynamic_type( +rosidl_dynamic_typesupport_dynamic_data_init_from_dynamic_type( rosidl_dynamic_typesupport_dynamic_type_t * dynamic_type, - rosidl_dynamic_typesupport_dynamic_data_t ** dynamic_data) + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(allocator, RCUTILS_RET_INVALID_ARGUMENT); + if (!rcutils_allocator_is_valid(allocator)) { + RCUTILS_SET_ERROR_MSG("allocator is invalid"); + return RCUTILS_RET_INVALID_ARGUMENT; + } RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - rosidl_dynamic_typesupport_dynamic_data_t * out = allocator.zero_allocate( - 1, sizeof(rosidl_dynamic_typesupport_dynamic_data_t), &allocator.state); - if (!out) { - RCUTILS_SET_ERROR_MSG("Could not allocate dynamic data"); - return RCUTILS_RET_BAD_ALLOC; + if (dynamic_data->impl.handle != NULL) { + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_data_fini(dynamic_data); + ); } - out->serialization_support = dynamic_type->serialization_support; + dynamic_data->serialization_support = dynamic_type->serialization_support; + dynamic_data->allocator = *allocator; ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK_WITH_CLEANUP( - (out->serialization_support->methods->dynamic_data_create_from_dynamic_type)( - out->serialization_support->impl, dynamic_type->impl, &out->impl), - allocator.deallocate(out, allocator.state) // Cleanup + (dynamic_data->serialization_support->methods.dynamic_data_init_from_dynamic_type)( + &dynamic_data->serialization_support->impl, + &dynamic_type->impl, + allocator, + &dynamic_data->impl), + rosidl_dynamic_typesupport_dynamic_data_fini(dynamic_data) // Cleanup ); - *dynamic_data = out; return RCUTILS_RET_OK; } @@ -259,41 +324,60 @@ rosidl_dynamic_typesupport_dynamic_data_create_from_dynamic_type( rcutils_ret_t rosidl_dynamic_typesupport_dynamic_data_clone( const rosidl_dynamic_typesupport_dynamic_data_t * other_dynamic_data, - rosidl_dynamic_typesupport_dynamic_data_t ** dynamic_data) + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(other_dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(allocator, RCUTILS_RET_INVALID_ARGUMENT); + if (!rcutils_allocator_is_valid(allocator)) { + RCUTILS_SET_ERROR_MSG("allocator is invalid"); + return RCUTILS_RET_INVALID_ARGUMENT; + } RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - rosidl_dynamic_typesupport_dynamic_data_t * out = allocator.zero_allocate( - 1, sizeof(rosidl_dynamic_typesupport_dynamic_data_t), &allocator.state); - if (!out) { - RCUTILS_SET_ERROR_MSG("Could not allocate dynamic data"); - return RCUTILS_RET_BAD_ALLOC; + if (dynamic_data->impl.handle != NULL) { + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_data_fini(dynamic_data); + ); } - out->serialization_support = other_dynamic_data->serialization_support; + dynamic_data->serialization_support = other_dynamic_data->serialization_support; + dynamic_data->allocator = *allocator; ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK_WITH_CLEANUP( - (other_dynamic_data->serialization_support->methods->dynamic_data_clone)( - other_dynamic_data->serialization_support->impl, other_dynamic_data->impl, &out->impl), - allocator.deallocate(out, allocator.state) // Cleanup + (other_dynamic_data->serialization_support->methods.dynamic_data_clone)( + &other_dynamic_data->serialization_support->impl, + &other_dynamic_data->impl, + allocator, + &dynamic_data->impl), + rosidl_dynamic_typesupport_dynamic_data_fini(dynamic_data) // Cleanup ); - *dynamic_data = out; return RCUTILS_RET_OK; } rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_data_destroy( +rosidl_dynamic_typesupport_dynamic_data_fini( rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( - (dynamic_data->serialization_support->methods->dynamic_data_destroy)( - dynamic_data->serialization_support->impl, dynamic_data->impl) + (dynamic_data->serialization_support->methods.dynamic_data_fini)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl) ); - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - allocator.deallocate(dynamic_data, &allocator.state); + return RCUTILS_RET_OK; +} + + +rcutils_ret_t +rosidl_dynamic_typesupport_dynamic_data_destroy( + rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data) +{ + RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); + rcutils_allocator_t allocator = dynamic_data->allocator; + + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_data_fini(dynamic_data)); + allocator.deallocate(dynamic_data, allocator.state); return RCUTILS_RET_OK; } @@ -302,28 +386,24 @@ rosidl_dynamic_typesupport_dynamic_data_destroy( rcutils_ret_t rosidl_dynamic_typesupport_dynamic_data_serialize( rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data, - rcutils_uint8_array_t * buffer, - bool * success) + rcutils_uint8_array_t * buffer) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(buffer, RCUTILS_RET_INVALID_ARGUMENT); - RCUTILS_CHECK_ARGUMENT_FOR_NULL(success, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_serialize)( - dynamic_data->serialization_support->impl, dynamic_data->impl, buffer, success); + return (dynamic_data->serialization_support->methods.dynamic_data_serialize)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, buffer); } rcutils_ret_t rosidl_dynamic_typesupport_dynamic_data_deserialize( rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data, - rcutils_uint8_array_t * buffer, - bool * success) + rcutils_uint8_array_t * buffer) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(buffer, RCUTILS_RET_INVALID_ARGUMENT); - RCUTILS_CHECK_ARGUMENT_FOR_NULL(success, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_deserialize)( - dynamic_data->serialization_support->impl, dynamic_data->impl, buffer, success); + return (dynamic_data->serialization_support->methods.dynamic_data_deserialize)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, buffer); } @@ -338,8 +418,8 @@ rosidl_dynamic_typesupport_dynamic_data_deserialize( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); \ RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); \ return ( \ - dynamic_data->serialization_support->methods->dynamic_data_get_ ## FunctionT ## _value)( \ - dynamic_data->serialization_support->impl, dynamic_data->impl, id, value); \ + dynamic_data->serialization_support->methods.dynamic_data_get_ ## FunctionT ## _value)( \ + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, value); \ } @@ -371,8 +451,8 @@ rosidl_dynamic_typesupport_dynamic_data_get_string_value( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value_length, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_get_string_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, id, value, value_length); + return (dynamic_data->serialization_support->methods.dynamic_data_get_string_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, value, value_length); } @@ -386,8 +466,8 @@ rosidl_dynamic_typesupport_dynamic_data_get_wstring_value( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value_length, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_get_wstring_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, id, value, value_length); + return (dynamic_data->serialization_support->methods.dynamic_data_get_wstring_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, value, value_length); } @@ -402,8 +482,8 @@ rosidl_dynamic_typesupport_dynamic_data_get_fixed_string_value( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value_length, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_get_fixed_string_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, + return (dynamic_data->serialization_support->methods.dynamic_data_get_fixed_string_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, value, value_length, string_length); } @@ -419,8 +499,8 @@ rosidl_dynamic_typesupport_dynamic_data_get_fixed_wstring_value( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value_length, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_get_fixed_wstring_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, + return (dynamic_data->serialization_support->methods.dynamic_data_get_fixed_wstring_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, value, value_length, wstring_length); } @@ -436,8 +516,8 @@ rosidl_dynamic_typesupport_dynamic_data_get_bounded_string_value( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value_length, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_get_bounded_string_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, + return (dynamic_data->serialization_support->methods.dynamic_data_get_bounded_string_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, value, value_length, string_bound); } @@ -453,8 +533,8 @@ rosidl_dynamic_typesupport_dynamic_data_get_bounded_wstring_value( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value_length, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_get_bounded_wstring_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, + return (dynamic_data->serialization_support->methods.dynamic_data_get_bounded_wstring_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, value, value_length, wstring_bound); } @@ -469,8 +549,8 @@ rosidl_dynamic_typesupport_dynamic_data_get_bounded_wstring_value( { \ RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); \ return ( \ - dynamic_data->serialization_support->methods->dynamic_data_set_ ## FunctionT ## _value)( \ - dynamic_data->serialization_support->impl, dynamic_data->impl, id, value); \ + dynamic_data->serialization_support->methods.dynamic_data_set_ ## FunctionT ## _value)( \ + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, value); \ } @@ -501,8 +581,8 @@ rosidl_dynamic_typesupport_dynamic_data_set_string_value( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_set_string_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, id, value, value_length); + return (dynamic_data->serialization_support->methods.dynamic_data_set_string_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, value, value_length); } @@ -515,8 +595,8 @@ rosidl_dynamic_typesupport_dynamic_data_set_wstring_value( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_set_wstring_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, id, value, value_length); + return (dynamic_data->serialization_support->methods.dynamic_data_set_wstring_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, value, value_length); } @@ -530,8 +610,8 @@ rosidl_dynamic_typesupport_dynamic_data_set_fixed_string_value( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_set_fixed_string_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, + return (dynamic_data->serialization_support->methods.dynamic_data_set_fixed_string_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, value, value_length, string_length); } @@ -546,8 +626,8 @@ rosidl_dynamic_typesupport_dynamic_data_set_fixed_wstring_value( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_set_fixed_wstring_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, + return (dynamic_data->serialization_support->methods.dynamic_data_set_fixed_wstring_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, value, value_length, wstring_length); } @@ -562,8 +642,8 @@ rosidl_dynamic_typesupport_dynamic_data_set_bounded_string_value( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_set_bounded_string_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, + return (dynamic_data->serialization_support->methods.dynamic_data_set_bounded_string_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, value, value_length, string_bound); } @@ -578,8 +658,8 @@ rosidl_dynamic_typesupport_dynamic_data_set_bounded_wstring_value( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_set_bounded_wstring_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, + return (dynamic_data->serialization_support->methods.dynamic_data_set_bounded_wstring_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, value, value_length, wstring_bound); } @@ -590,8 +670,8 @@ rosidl_dynamic_typesupport_dynamic_data_clear_sequence_data( rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_clear_sequence_data)( - dynamic_data->serialization_support->impl, dynamic_data->impl); + return (dynamic_data->serialization_support->methods.dynamic_data_clear_sequence_data)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl); } @@ -601,8 +681,8 @@ rosidl_dynamic_typesupport_dynamic_data_remove_sequence_data( rosidl_dynamic_typesupport_member_id_t id) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_remove_sequence_data)( - dynamic_data->serialization_support->impl, dynamic_data->impl, id); + return (dynamic_data->serialization_support->methods.dynamic_data_remove_sequence_data)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id); } @@ -612,8 +692,8 @@ rosidl_dynamic_typesupport_dynamic_data_insert_sequence_data( rosidl_dynamic_typesupport_member_id_t * out_id) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_insert_sequence_data)( - dynamic_data->serialization_support->impl, dynamic_data->impl, out_id); + return (dynamic_data->serialization_support->methods.dynamic_data_insert_sequence_data)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, out_id); } @@ -626,9 +706,9 @@ rosidl_dynamic_typesupport_dynamic_data_insert_sequence_data( { \ RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); \ return ( \ - dynamic_data->serialization_support->methods-> \ + dynamic_data->serialization_support->methods. \ dynamic_data_insert_ ## FunctionT ## _value)( \ - dynamic_data->serialization_support->impl, dynamic_data->impl, value, out_id); \ + &dynamic_data->serialization_support->impl, &dynamic_data->impl, value, out_id); \ } @@ -660,8 +740,8 @@ rosidl_dynamic_typesupport_dynamic_data_insert_string_value( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(out_id, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_insert_string_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, value, value_length, out_id); + return (dynamic_data->serialization_support->methods.dynamic_data_insert_string_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, value, value_length, out_id); } @@ -675,8 +755,8 @@ rosidl_dynamic_typesupport_dynamic_data_insert_wstring_value( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(out_id, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_insert_wstring_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, value, value_length, out_id); + return (dynamic_data->serialization_support->methods.dynamic_data_insert_wstring_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, value, value_length, out_id); } @@ -691,9 +771,9 @@ rosidl_dynamic_typesupport_dynamic_data_insert_fixed_string_value( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(out_id, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_insert_fixed_string_value)( - dynamic_data->serialization_support->impl, - dynamic_data->impl, + return (dynamic_data->serialization_support->methods.dynamic_data_insert_fixed_string_value)( + &dynamic_data->serialization_support->impl, + &dynamic_data->impl, value, value_length, string_length, @@ -712,9 +792,9 @@ rosidl_dynamic_typesupport_dynamic_data_insert_fixed_wstring_value( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(out_id, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_insert_fixed_wstring_value)( - dynamic_data->serialization_support->impl, - dynamic_data->impl, + return (dynamic_data->serialization_support->methods.dynamic_data_insert_fixed_wstring_value)( + &dynamic_data->serialization_support->impl, + &dynamic_data->impl, value, value_length, wstring_length, @@ -733,9 +813,9 @@ rosidl_dynamic_typesupport_dynamic_data_insert_bounded_string_value( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(out_id, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_insert_bounded_string_value)( - dynamic_data->serialization_support->impl, - dynamic_data->impl, + return (dynamic_data->serialization_support->methods.dynamic_data_insert_bounded_string_value)( + &dynamic_data->serialization_support->impl, + &dynamic_data->impl, value, value_length, string_bound, @@ -754,9 +834,9 @@ rosidl_dynamic_typesupport_dynamic_data_insert_bounded_wstring_value( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(out_id, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_insert_bounded_wstring_value)( - dynamic_data->serialization_support->impl, - dynamic_data->impl, + return (dynamic_data->serialization_support->methods.dynamic_data_insert_bounded_wstring_value)( + &dynamic_data->serialization_support->impl, + &dynamic_data->impl, value, value_length, wstring_bound, @@ -769,13 +849,32 @@ rcutils_ret_t rosidl_dynamic_typesupport_dynamic_data_get_complex_value( const rosidl_dynamic_typesupport_dynamic_data_t * dynamic_data, rosidl_dynamic_typesupport_member_id_t id, - rosidl_dynamic_typesupport_dynamic_data_t ** value) + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_data_t * value) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(allocator, RCUTILS_RET_INVALID_ARGUMENT); + if (!rcutils_allocator_is_valid(allocator)) { + RCUTILS_SET_ERROR_MSG("allocator is invalid"); + return RCUTILS_RET_INVALID_ARGUMENT; + } RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); - (*value)->serialization_support = dynamic_data->serialization_support; - return (dynamic_data->serialization_support->methods->dynamic_data_get_complex_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, id, &(*value)->impl); + + if (value->impl.handle != NULL) { + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_data_fini(value); + ); + } + + value->serialization_support = dynamic_data->serialization_support; + value->allocator = *allocator; + + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK_WITH_CLEANUP( + (dynamic_data->serialization_support->methods.dynamic_data_get_complex_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, allocator, &value->impl), + rosidl_dynamic_typesupport_dynamic_data_fini(value) // Cleanup + ); + return RCUTILS_RET_OK; } @@ -787,8 +886,8 @@ rosidl_dynamic_typesupport_dynamic_data_set_complex_value( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_set_complex_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, id, value->impl); + return (dynamic_data->serialization_support->methods.dynamic_data_set_complex_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, id, &value->impl); } @@ -801,8 +900,8 @@ rosidl_dynamic_typesupport_dynamic_data_insert_complex_value_copy( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(out_id, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_insert_complex_value_copy)( - dynamic_data->serialization_support->impl, dynamic_data->impl, value->impl, out_id); + return (dynamic_data->serialization_support->methods.dynamic_data_insert_complex_value_copy)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, &value->impl, out_id); } @@ -815,6 +914,6 @@ rosidl_dynamic_typesupport_dynamic_data_insert_complex_value( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_data, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(out_id, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_data->serialization_support->methods->dynamic_data_insert_complex_value)( - dynamic_data->serialization_support->impl, dynamic_data->impl, value->impl, out_id); + return (dynamic_data->serialization_support->methods.dynamic_data_insert_complex_value)( + &dynamic_data->serialization_support->impl, &dynamic_data->impl, &value->impl, out_id); } diff --git a/src/api/dynamic_type.c b/src/api/dynamic_type.c index 9b09787..7499882 100644 --- a/src/api/dynamic_type.c +++ b/src/api/dynamic_type.c @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include +#include "rosidl_dynamic_typesupport/api/dynamic_type.h" #include #include @@ -21,9 +21,6 @@ #include #include -#include -#include - #include #include #include @@ -34,10 +31,64 @@ #include #include +#include "rosidl_dynamic_typesupport/api/serialization_support.h" +#include "rosidl_dynamic_typesupport/macros.h" +#include "rosidl_dynamic_typesupport/types.h" + // ================================================================================================= // DYNAMIC TYPE // ================================================================================================= +rosidl_dynamic_typesupport_dynamic_type_builder_impl_t +rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_builder_impl(void) +{ + static rosidl_dynamic_typesupport_dynamic_type_builder_impl_t zero_dynamic_type_builder_impl = { + // .allocator = // Initialized later + .handle = NULL + }; + zero_dynamic_type_builder_impl.allocator = rcutils_get_zero_initialized_allocator(); + return zero_dynamic_type_builder_impl; +} + +rosidl_dynamic_typesupport_dynamic_type_builder_t +rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_builder(void) +{ + static rosidl_dynamic_typesupport_dynamic_type_builder_t zero_dynamic_type_builder = { + // .allocator = // Initialized later + // .impl = // Initialized later + .serialization_support = NULL + }; + zero_dynamic_type_builder.allocator = rcutils_get_zero_initialized_allocator(); + zero_dynamic_type_builder.impl = + rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_builder_impl(); + return zero_dynamic_type_builder; +} + +rosidl_dynamic_typesupport_dynamic_type_impl_t +rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_impl(void) +{ + static rosidl_dynamic_typesupport_dynamic_type_impl_t zero_dynamic_type_impl = { + // .allocator = // Initialized later + .handle = NULL + }; + zero_dynamic_type_impl.allocator = rcutils_get_zero_initialized_allocator(); + return zero_dynamic_type_impl; +} + +rosidl_dynamic_typesupport_dynamic_type_t +rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type(void) +{ + static rosidl_dynamic_typesupport_dynamic_type_t zero_dynamic_type = { + // .allocator = // Initialized later + // .impl = // Initialized later + .serialization_support = NULL + }; + zero_dynamic_type.allocator = rcutils_get_zero_initialized_allocator(); + zero_dynamic_type.impl = + rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_impl(); + return zero_dynamic_type; +} + // DYNAMIC TYPE UTILS ============================================================================== rcutils_ret_t @@ -50,14 +101,14 @@ rosidl_dynamic_typesupport_dynamic_type_equals( RCUTILS_CHECK_ARGUMENT_FOR_NULL(other, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(equals, RCUTILS_RET_INVALID_ARGUMENT); - if (dynamic_type->serialization_support->library_identifier != - other->serialization_support->library_identifier) + if (dynamic_type->serialization_support->serialization_library_identifier != + other->serialization_support->serialization_library_identifier) { RCUTILS_SET_ERROR_MSG("Library identifiers for dynamic types do not match"); return RCUTILS_RET_INVALID_ARGUMENT; } - return (dynamic_type->serialization_support->methods->dynamic_type_equals)( - dynamic_type->serialization_support->impl, dynamic_type->impl, other->impl, equals); + return (dynamic_type->serialization_support->methods.dynamic_type_equals)( + &dynamic_type->serialization_support->impl, &dynamic_type->impl, &other->impl, equals); } @@ -67,37 +118,41 @@ rosidl_dynamic_typesupport_dynamic_type_get_member_count( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(member_count, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type->serialization_support->methods->dynamic_type_get_member_count)( - dynamic_type->serialization_support->impl, dynamic_type->impl, member_count); + return (dynamic_type->serialization_support->methods.dynamic_type_get_member_count)( + &dynamic_type->serialization_support->impl, &dynamic_type->impl, member_count); } // DYNAMIC TYPE CONSTRUCTION ======================================================================= rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_type_builder_create( +rosidl_dynamic_typesupport_dynamic_type_builder_init( rosidl_dynamic_typesupport_serialization_support_t * serialization_support, const char * name, size_t name_length, - rosidl_dynamic_typesupport_dynamic_type_builder_t ** dynamic_type_builder) + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_builder_t * dynamic_type_builder) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(serialization_support, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(allocator, RCUTILS_RET_INVALID_ARGUMENT); + if (!rcutils_allocator_is_valid(allocator)) { + RCUTILS_SET_ERROR_MSG("allocator is invalid"); + return RCUTILS_RET_INVALID_ARGUMENT; + } RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - rosidl_dynamic_typesupport_dynamic_type_builder_t * out = allocator.zero_allocate( - 1, sizeof(rosidl_dynamic_typesupport_dynamic_type_builder_t), &allocator.state); - if (!out) { - RCUTILS_SET_ERROR_MSG("Could not allocate dynamic type builder"); - return RCUTILS_RET_BAD_ALLOC; + if (dynamic_type_builder->impl.handle != NULL) { + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_type_builder_fini(dynamic_type_builder) + ); } - out->serialization_support = serialization_support; + dynamic_type_builder->serialization_support = serialization_support; + dynamic_type_builder->allocator = *allocator; ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK_WITH_CLEANUP( - (serialization_support->methods->dynamic_type_builder_create)( - serialization_support->impl, name, name_length, &out->impl), - allocator.deallocate(out, allocator.state) // Cleanup + (serialization_support->methods.dynamic_type_builder_init)( + &serialization_support->impl, name, name_length, allocator, &dynamic_type_builder->impl), + rosidl_dynamic_typesupport_dynamic_type_builder_fini(dynamic_type_builder) // Cleanup ); - *dynamic_type_builder = out; return RCUTILS_RET_OK; } @@ -105,38 +160,48 @@ rosidl_dynamic_typesupport_dynamic_type_builder_create( rcutils_ret_t rosidl_dynamic_typesupport_dynamic_type_builder_clone( const rosidl_dynamic_typesupport_dynamic_type_builder_t * other, - rosidl_dynamic_typesupport_dynamic_type_builder_t ** dynamic_type_builder) + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_builder_t * dynamic_type_builder) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(other, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(allocator, RCUTILS_RET_INVALID_ARGUMENT); + if (!rcutils_allocator_is_valid(allocator)) { + RCUTILS_SET_ERROR_MSG("allocator is invalid"); + return RCUTILS_RET_INVALID_ARGUMENT; + } RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - rosidl_dynamic_typesupport_dynamic_type_builder_t * out = allocator.zero_allocate( - 1, sizeof(rosidl_dynamic_typesupport_dynamic_type_builder_t), &allocator.state); - if (!out) { - RCUTILS_SET_ERROR_MSG("Could not allocate dynamic type builder"); - return RCUTILS_RET_BAD_ALLOC; + if (dynamic_type_builder->impl.handle != NULL) { + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_type_builder_fini(dynamic_type_builder) + ); } - out->serialization_support = other->serialization_support; + dynamic_type_builder->serialization_support = other->serialization_support; + dynamic_type_builder->allocator = *allocator; ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK_WITH_CLEANUP( - (other->serialization_support->methods->dynamic_type_builder_clone)( - other->serialization_support->impl, other->impl, &out->impl), - allocator.deallocate(out, allocator.state) // Cleanup + (other->serialization_support->methods.dynamic_type_builder_clone)( + &other->serialization_support->impl, &other->impl, allocator, &dynamic_type_builder->impl), + rosidl_dynamic_typesupport_dynamic_type_builder_fini(dynamic_type_builder) // Cleanup ); - *dynamic_type_builder = out; return RCUTILS_RET_OK; } rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description( +rosidl_dynamic_typesupport_dynamic_type_builder_init_from_description( rosidl_dynamic_typesupport_serialization_support_t * serialization_support, const rosidl_runtime_c__type_description__TypeDescription * description, - rosidl_dynamic_typesupport_dynamic_type_builder_t ** dynamic_type_builder) + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_builder_t * dynamic_type_builder) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(serialization_support, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(description, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(allocator, RCUTILS_RET_INVALID_ARGUMENT); + if (!rcutils_allocator_is_valid(allocator)) { + RCUTILS_SET_ERROR_MSG("allocator is invalid"); + return RCUTILS_RET_INVALID_ARGUMENT; + } RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); if (rosidl_runtime_c_type_description_utils_type_description_is_valid(description) != @@ -155,21 +220,22 @@ rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description( // non-DDS middlewares), replacements should happen in the support libraries // on an as-needed basis. - rosidl_dynamic_typesupport_dynamic_type_builder_t * out; + if (dynamic_type_builder->impl.handle != NULL) { + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_type_builder_fini(dynamic_type_builder) + ); + } const rosidl_runtime_c__type_description__IndividualTypeDescription * main_description = &description->type_description; ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( - rosidl_dynamic_typesupport_dynamic_type_builder_create( + rosidl_dynamic_typesupport_dynamic_type_builder_init( serialization_support, main_description->type_name.data, main_description->type_name.size, - &out) + allocator, + dynamic_type_builder) ); - if (!out) { - RCUTILS_SET_ERROR_MSG("Could not init type builder!"); - return RCUTILS_RET_BAD_ALLOC; - } rcutils_ret_t ret = RCUTILS_RET_ERROR; @@ -186,103 +252,103 @@ rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description( // PRIMITIVES case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BOOLEAN: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_bool_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BYTE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_byte_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_CHAR: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_char_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FLOAT32: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_float32_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FLOAT64: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_float64_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT8: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int8_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT8: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint8_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT16: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int16_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT16: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint16_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT32: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int32_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT32: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint32_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT64: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int64_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT64: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint64_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_STRING: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_string_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_WSTRING: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_wstring_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FIXED_STRING: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_string_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FIXED_WSTRING: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_wstring_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BOUNDED_STRING: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_string_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BOUNDED_WSTRING: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_wstring_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); @@ -291,133 +357,133 @@ rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description( // STATIC ARRAYS case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BOOLEAN_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_bool_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BYTE_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_byte_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_CHAR_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_char_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FLOAT32_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_float32_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FLOAT64_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_float64_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT8_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int8_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT8_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint8_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT16_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int16_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT16_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint16_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT32_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int32_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT32_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint32_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT64_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int64_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT64_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint64_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_STRING_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_string_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_WSTRING_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_wstring_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FIXED_STRING_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_string_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.string_capacity, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FIXED_WSTRING_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_wstring_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.string_capacity, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BOUNDED_STRING_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_string_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.string_capacity, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BOUNDED_WSTRING_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_wstring_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.string_capacity, field->type.capacity); @@ -426,104 +492,104 @@ rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description( // UNBOUNDED SEQUENCES case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BOOLEAN_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_bool_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BYTE_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_byte_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_CHAR_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_char_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FLOAT32_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_float32_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FLOAT64_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_float64_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT8_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int8_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT8_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint8_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT16_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int16_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT16_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint16_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT32_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int32_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT32_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint32_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT64_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int64_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT64_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint64_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_STRING_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_string_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_WSTRING_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_wstring_unbounded_sequence_member( - out, i, field->name.data, field->name.size, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size); break; /* *INDENT-OFF* */ case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FIXED_STRING_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_string_unbounded_sequence_member( // NOLINT - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.string_capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FIXED_WSTRING_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_wstring_unbounded_sequence_member( // NOLINT - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.string_capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BOUNDED_STRING_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_string_unbounded_sequence_member( // NOLINT - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.string_capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BOUNDED_WSTRING_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_wstring_unbounded_sequence_member( // NOLINT - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.string_capacity); @@ -533,133 +599,133 @@ rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description( // BOUNDED SEQUENCES case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BOOLEAN_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_bool_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BYTE_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_byte_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_CHAR_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_char_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FLOAT32_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_float32_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FLOAT64_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_float64_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT8_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int8_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT8_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint8_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT16_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int16_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT16_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint16_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT32_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int32_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT32_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint32_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_INT64_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_int64_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_UINT64_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_uint64_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_STRING_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_string_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_WSTRING_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_wstring_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FIXED_STRING_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_string_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.string_capacity, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_FIXED_WSTRING_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_wstring_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.string_capacity, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BOUNDED_STRING_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_string_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.string_capacity, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_BOUNDED_WSTRING_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_wstring_array_member( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, field->type.string_capacity, field->type.capacity); @@ -711,12 +777,16 @@ rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description( } // Recurse - rosidl_dynamic_typesupport_dynamic_type_builder_t * nested_type_builder = NULL; - ret = rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description( - serialization_support, recurse_desc, &nested_type_builder); + rosidl_dynamic_typesupport_dynamic_type_builder_t nested_type_builder = + rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_builder(); + nested_type_builder.serialization_support = serialization_support; + nested_type_builder.allocator = *allocator; + + ret = rosidl_dynamic_typesupport_dynamic_type_builder_init_from_description( + serialization_support, recurse_desc, allocator, &nested_type_builder); rosidl_runtime_c__type_description__TypeDescription__destroy(recurse_desc); - if (ret != RCUTILS_RET_OK || nested_type_builder == NULL) { + if (ret != RCUTILS_RET_OK) { RCUTILS_SET_ERROR_MSG_WITH_FORMAT_STRING( "Could not construct nested type builder for field [%s]", field->name.data); if (ret == RCUTILS_RET_OK) { @@ -730,34 +800,34 @@ rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description( switch (field->type.type_id) { case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_NESTED_TYPE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_complex_member_builder( - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, - nested_type_builder); + &nested_type_builder); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_NESTED_TYPE_ARRAY: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_complex_array_member_builder( // NOLINT - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, - nested_type_builder, field->type.capacity); + &nested_type_builder, field->type.capacity); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_NESTED_TYPE_UNBOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_complex_unbounded_sequence_member_builder( // NOLINT - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, - nested_type_builder); + &nested_type_builder); break; case ROSIDL_DYNAMIC_TYPESUPPORT_FIELD_TYPE_NESTED_TYPE_BOUNDED_SEQUENCE: ret = rosidl_dynamic_typesupport_dynamic_type_builder_add_complex_bounded_sequence_member_builder( // NOLINT - out, i, + dynamic_type_builder, i, field->name.data, field->name.size, field->default_value.data, field->default_value.size, - nested_type_builder, field->type.capacity); + &nested_type_builder, field->type.capacity); break; default: @@ -767,7 +837,7 @@ rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description( break; } /* *INDENT-ON* */ - ret = rosidl_dynamic_typesupport_dynamic_type_builder_destroy(nested_type_builder); + ret = rosidl_dynamic_typesupport_dynamic_type_builder_fini(&nested_type_builder); } break; @@ -783,11 +853,12 @@ rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description( } } // looping over fields - *dynamic_type_builder = out; return RCUTILS_RET_OK; fail: - if (rosidl_dynamic_typesupport_dynamic_type_builder_destroy(out) != RCUTILS_RET_OK) { + if (rosidl_dynamic_typesupport_dynamic_type_builder_fini(dynamic_type_builder) != + RCUTILS_RET_OK) + { RCUTILS_SAFE_FWRITE_TO_STDERR( "While handling another error, could not fini dynamic type builder"); } @@ -796,72 +867,107 @@ rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description( rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_type_builder_destroy( +rosidl_dynamic_typesupport_dynamic_type_builder_fini( rosidl_dynamic_typesupport_dynamic_type_builder_t * dynamic_type_builder) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( - (dynamic_type_builder->serialization_support->methods->dynamic_type_builder_destroy)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl) + (dynamic_type_builder->serialization_support->methods.dynamic_type_builder_fini)( + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl) ); - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - allocator.deallocate(dynamic_type_builder, &allocator.state); return RCUTILS_RET_OK; } rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_type_create_from_dynamic_type_builder( +rosidl_dynamic_typesupport_dynamic_type_builder_destroy( + rosidl_dynamic_typesupport_dynamic_type_builder_t * dynamic_type_builder) +{ + RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); + rcutils_allocator_t allocator = dynamic_type_builder->allocator; + + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_type_builder_fini(dynamic_type_builder)); + allocator.deallocate(dynamic_type_builder, allocator.state); + return RCUTILS_RET_OK; +} + + +rcutils_ret_t +rosidl_dynamic_typesupport_dynamic_type_init_from_dynamic_type_builder( rosidl_dynamic_typesupport_dynamic_type_builder_t * dynamic_type_builder, - rosidl_dynamic_typesupport_dynamic_type_t ** dynamic_type) + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_t * dynamic_type) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(allocator, RCUTILS_RET_INVALID_ARGUMENT); + if (!rcutils_allocator_is_valid(allocator)) { + RCUTILS_SET_ERROR_MSG("allocator is invalid"); + return RCUTILS_RET_INVALID_ARGUMENT; + } RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type, RCUTILS_RET_INVALID_ARGUMENT); - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - rosidl_dynamic_typesupport_dynamic_type_t * out = allocator.zero_allocate( - 1, sizeof(rosidl_dynamic_typesupport_dynamic_type_t), &allocator.state); - if (!out) { - RCUTILS_SET_ERROR_MSG("Could not allocate dynamic type"); - return RCUTILS_RET_BAD_ALLOC; + if (dynamic_type->impl.handle != NULL) { + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_type_fini(dynamic_type) + ); } - out->serialization_support = dynamic_type_builder->serialization_support; + dynamic_type->serialization_support = dynamic_type_builder->serialization_support; + dynamic_type->allocator = *allocator; ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK_WITH_CLEANUP( (dynamic_type_builder->serialization_support->methods - ->dynamic_type_create_from_dynamic_type_builder)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, &out->impl), - allocator.deallocate(out, allocator.state) // Cleanup + .dynamic_type_init_from_dynamic_type_builder)( + &dynamic_type_builder->serialization_support->impl, + &dynamic_type_builder->impl, + allocator, + &dynamic_type->impl), + rosidl_dynamic_typesupport_dynamic_type_fini(dynamic_type) // Cleanup ); - *dynamic_type = out; return RCUTILS_RET_OK; } rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_type_create_from_description( +rosidl_dynamic_typesupport_dynamic_type_init_from_description( rosidl_dynamic_typesupport_serialization_support_t * serialization_support, const rosidl_runtime_c__type_description__TypeDescription * description, - rosidl_dynamic_typesupport_dynamic_type_t ** dynamic_type) + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_t * dynamic_type) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(serialization_support, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(description, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(allocator, RCUTILS_RET_INVALID_ARGUMENT); + if (!rcutils_allocator_is_valid(allocator)) { + RCUTILS_SET_ERROR_MSG("allocator is invalid"); + return RCUTILS_RET_INVALID_ARGUMENT; + } RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type, RCUTILS_RET_INVALID_ARGUMENT); - rosidl_dynamic_typesupport_dynamic_type_t * out; - rosidl_dynamic_typesupport_dynamic_type_builder_t * builder = NULL; + if (dynamic_type->impl.handle != NULL) { + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_type_fini(dynamic_type) + ); + } + dynamic_type->serialization_support = serialization_support; + dynamic_type->allocator = *allocator; + + rosidl_dynamic_typesupport_dynamic_type_builder_t builder = + rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_builder(); + builder.serialization_support = serialization_support; + builder.allocator = *allocator; + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( - rosidl_dynamic_typesupport_dynamic_type_builder_create_from_description( - serialization_support, description, &builder) + rosidl_dynamic_typesupport_dynamic_type_builder_init_from_description( + serialization_support, description, allocator, &builder) ); ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK_WITH_CLEANUP( - rosidl_dynamic_typesupport_dynamic_type_create_from_dynamic_type_builder(builder, &out), - rosidl_dynamic_typesupport_dynamic_type_builder_destroy(builder) // Cleanup + rosidl_dynamic_typesupport_dynamic_type_init_from_dynamic_type_builder( + &builder, allocator, dynamic_type), + rosidl_dynamic_typesupport_dynamic_type_builder_fini(&builder) // Cleanup ); - rosidl_dynamic_typesupport_dynamic_type_builder_destroy(builder); - - *dynamic_type = out; + rosidl_dynamic_typesupport_dynamic_type_builder_fini(&builder); return RCUTILS_RET_OK; } @@ -869,41 +975,57 @@ rosidl_dynamic_typesupport_dynamic_type_create_from_description( rcutils_ret_t rosidl_dynamic_typesupport_dynamic_type_clone( const rosidl_dynamic_typesupport_dynamic_type_t * other, - rosidl_dynamic_typesupport_dynamic_type_t ** dynamic_type) + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_dynamic_type_t * dynamic_type) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(other, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(allocator, RCUTILS_RET_INVALID_ARGUMENT); + if (!rcutils_allocator_is_valid(allocator)) { + RCUTILS_SET_ERROR_MSG("allocator is invalid"); + return RCUTILS_RET_INVALID_ARGUMENT; + } RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type, RCUTILS_RET_INVALID_ARGUMENT); - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - rosidl_dynamic_typesupport_dynamic_type_t * out = allocator.zero_allocate( - 1, sizeof(rosidl_dynamic_typesupport_dynamic_type_t), &allocator.state); - if (!out) { - RCUTILS_SET_ERROR_MSG("Could not allocate dynamic type"); - return RCUTILS_RET_BAD_ALLOC; + if (dynamic_type->impl.handle != NULL) { + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_type_fini(dynamic_type) + ); } - out->serialization_support = other->serialization_support; + dynamic_type->serialization_support = other->serialization_support; + dynamic_type->allocator = *allocator; ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK_WITH_CLEANUP( - (other->serialization_support->methods->dynamic_type_clone)( - other->serialization_support->impl, other->impl, &out->impl), - allocator.deallocate(out, allocator.state) // Cleanup + (other->serialization_support->methods.dynamic_type_clone)( + &other->serialization_support->impl, &other->impl, allocator, &dynamic_type->impl), + rosidl_dynamic_typesupport_dynamic_type_fini(dynamic_type) // Cleanup ); - *dynamic_type = out; return RCUTILS_RET_OK; } rcutils_ret_t -rosidl_dynamic_typesupport_dynamic_type_destroy( +rosidl_dynamic_typesupport_dynamic_type_fini( rosidl_dynamic_typesupport_dynamic_type_t * dynamic_type) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type, RCUTILS_RET_INVALID_ARGUMENT); ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( - (dynamic_type->serialization_support->methods->dynamic_type_destroy)( - dynamic_type->serialization_support->impl, dynamic_type->impl); + (dynamic_type->serialization_support->methods.dynamic_type_fini)( + &dynamic_type->serialization_support->impl, &dynamic_type->impl); ); - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - allocator.deallocate(dynamic_type, &allocator.state); + return RCUTILS_RET_OK; +} + + +rcutils_ret_t +rosidl_dynamic_typesupport_dynamic_type_destroy( + rosidl_dynamic_typesupport_dynamic_type_t * dynamic_type) +{ + RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type, RCUTILS_RET_INVALID_ARGUMENT); + rcutils_allocator_t allocator = dynamic_type->allocator; + + ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( + rosidl_dynamic_typesupport_dynamic_type_fini(dynamic_type)); + allocator.deallocate(dynamic_type, allocator.state); return RCUTILS_RET_OK; } @@ -916,8 +1038,8 @@ rosidl_dynamic_typesupport_dynamic_type_get_name( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type->serialization_support->methods->dynamic_type_get_name)( - dynamic_type->serialization_support->impl, dynamic_type->impl, name, name_length); + return (dynamic_type->serialization_support->methods.dynamic_type_get_name)( + &dynamic_type->serialization_support->impl, &dynamic_type->impl, name, name_length); } @@ -929,8 +1051,8 @@ rosidl_dynamic_typesupport_dynamic_type_builder_get_name( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods->dynamic_type_builder_get_name)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + return (dynamic_type_builder->serialization_support->methods.dynamic_type_builder_get_name)( + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, name, name_length); } @@ -942,8 +1064,8 @@ rosidl_dynamic_typesupport_dynamic_type_builder_set_name( { RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods->dynamic_type_builder_set_name)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + return (dynamic_type_builder->serialization_support->methods.dynamic_type_builder_set_name)( + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, name, name_length); } @@ -961,8 +1083,8 @@ rosidl_dynamic_typesupport_dynamic_type_builder_set_name( RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); \ RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); \ return (dynamic_type_builder->serialization_support->methods \ - ->dynamic_type_builder_add_ ## FunctionT ## _member)( \ - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, id, \ + .dynamic_type_builder_add_ ## FunctionT ## _member)( \ + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, \ name, name_length, \ default_value, default_value_length); \ } @@ -999,10 +1121,10 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_string_member( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_fixed_string_member)( - dynamic_type_builder->serialization_support->impl, - dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, + &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1021,10 +1143,10 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_wstring_member( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_fixed_wstring_member)( - dynamic_type_builder->serialization_support->impl, - dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, + &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1043,10 +1165,10 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_string_member( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_bounded_string_member)( - dynamic_type_builder->serialization_support->impl, - dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, + &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1065,10 +1187,10 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_wstring_member( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_bounded_wstring_member)( - dynamic_type_builder->serialization_support->impl, - dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, + &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1089,9 +1211,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_wstring_member( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); \ RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); \ RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); \ - return (dynamic_type_builder->serialization_support->methods-> \ + return (dynamic_type_builder->serialization_support->methods. \ dynamic_type_builder_add_ ## FunctionT ## _array_member)( \ - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, \ + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, \ id, \ name, name_length, \ default_value, default_value_length, \ @@ -1130,9 +1252,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_string_array_member( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_fixed_string_array_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1151,9 +1273,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_wstring_array_member( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_fixed_wstring_array_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1172,9 +1294,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_string_array_member( RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_bounded_string_array_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1193,9 +1315,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_wstring_array_member RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_bounded_wstring_array_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1215,9 +1337,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_wstring_array_member RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); \ RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); \ RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); \ - return (dynamic_type_builder->serialization_support->methods-> \ + return (dynamic_type_builder->serialization_support->methods. \ dynamic_type_builder_add_ ## FunctionT ## _unbounded_sequence_member)( \ - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, \ + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, \ id, \ name, name_length, \ default_value, default_value_length); \ @@ -1255,9 +1377,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_string_unbounded_seque RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_fixed_string_unbounded_sequence_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1276,9 +1398,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_wstring_unbounded_sequ RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_fixed_wstring_unbounded_sequence_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1297,9 +1419,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_string_unbounded_seq RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_bounded_string_unbounded_sequence_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1318,9 +1440,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_wstring_unbounded_se RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_bounded_wstring_unbounded_sequence_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1341,9 +1463,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_wstring_unbounded_se RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); \ RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); \ RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); \ - return (dynamic_type_builder->serialization_support->methods-> \ + return (dynamic_type_builder->serialization_support->methods. \ dynamic_type_builder_add_ ## FunctionT ## _bounded_sequence_member)( \ - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, \ + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, \ id, \ name, name_length, \ default_value, default_value_length, \ @@ -1382,9 +1504,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_string_bounded_sequenc RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_fixed_string_bounded_sequence_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1403,9 +1525,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_fixed_wstring_bounded_sequen RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_fixed_wstring_bounded_sequence_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1424,9 +1546,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_string_bounded_seque RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_bounded_string_bounded_sequence_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1445,9 +1567,9 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_bounded_wstring_bounded_sequ RCUTILS_CHECK_ARGUMENT_FOR_NULL(dynamic_type_builder, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_bounded_wstring_bounded_sequence_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, @@ -1468,13 +1590,13 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_complex_member( RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(nested_struct, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_complex_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, - nested_struct->impl); + &nested_struct->impl); } @@ -1490,13 +1612,13 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_complex_array_member( RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(nested_struct, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_complex_array_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, - nested_struct->impl, sequence_bound); + &nested_struct->impl, sequence_bound); } @@ -1512,13 +1634,13 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_complex_unbounded_sequence_m RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(nested_struct, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_complex_unbounded_sequence_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, - nested_struct->impl); + &nested_struct->impl); } @@ -1534,13 +1656,13 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_complex_bounded_sequence_mem RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(nested_struct, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_complex_bounded_sequence_member)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, - nested_struct->impl, sequence_bound); + &nested_struct->impl, sequence_bound); } @@ -1556,13 +1678,13 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_complex_member_builder( RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(nested_struct_builder, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_complex_member_builder)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, - nested_struct_builder->impl); + &nested_struct_builder->impl); } @@ -1578,13 +1700,13 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_complex_array_member_builder RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(nested_struct_builder, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_complex_array_member_builder)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, - nested_struct_builder->impl, sequence_bound); + &nested_struct_builder->impl, sequence_bound); } @@ -1600,13 +1722,13 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_complex_unbounded_sequence_m RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(nested_struct_builder, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_complex_unbounded_sequence_member_builder)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, - nested_struct_builder->impl); + &nested_struct_builder->impl); } @@ -1622,11 +1744,11 @@ rosidl_dynamic_typesupport_dynamic_type_builder_add_complex_bounded_sequence_mem RCUTILS_CHECK_ARGUMENT_FOR_NULL(name, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(default_value, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(nested_struct_builder, RCUTILS_RET_INVALID_ARGUMENT); - return (dynamic_type_builder->serialization_support->methods-> + return (dynamic_type_builder->serialization_support->methods. dynamic_type_builder_add_complex_bounded_sequence_member_builder)( - dynamic_type_builder->serialization_support->impl, dynamic_type_builder->impl, + &dynamic_type_builder->serialization_support->impl, &dynamic_type_builder->impl, id, name, name_length, default_value, default_value_length, - nested_struct_builder->impl, sequence_bound); + &nested_struct_builder->impl, sequence_bound); } diff --git a/src/api/serialization_support.c b/src/api/serialization_support.c index 3cca857..9e14201 100644 --- a/src/api/serialization_support.c +++ b/src/api/serialization_support.c @@ -24,64 +24,101 @@ #include #include +rosidl_dynamic_typesupport_serialization_support_impl_t +rosidl_dynamic_typesupport_get_zero_initialized_serialization_support_impl(void) +{ + static rosidl_dynamic_typesupport_serialization_support_impl_t zero_serialization_support_impl = { + // .allocator = // Initialized later + .serialization_library_identifier = NULL, + .handle = NULL + }; + zero_serialization_support_impl.allocator = rcutils_get_zero_initialized_allocator(); + return zero_serialization_support_impl; +} + +rosidl_dynamic_typesupport_serialization_support_interface_t +rosidl_dynamic_typesupport_get_zero_initialized_serialization_support_interface(void) +{ + static rosidl_dynamic_typesupport_serialization_support_interface_t + zero_serialization_support_interface; // Should be zeroed out by default + + zero_serialization_support_interface.serialization_library_identifier = NULL; + zero_serialization_support_interface.allocator = rcutils_get_zero_initialized_allocator(); + return zero_serialization_support_interface; +} + +rosidl_dynamic_typesupport_serialization_support_t +rosidl_dynamic_typesupport_get_zero_initialized_serialization_support(void) +{ + static rosidl_dynamic_typesupport_serialization_support_t zero_serialization_support = { + // .allocator = // Initialized later + .serialization_library_identifier = NULL, + + // .impl = // Initialized later + // .methods = // Initialized later + }; + zero_serialization_support.allocator = rcutils_get_zero_initialized_allocator(); + zero_serialization_support.impl = + rosidl_dynamic_typesupport_get_zero_initialized_serialization_support_impl(); + zero_serialization_support.methods = + rosidl_dynamic_typesupport_get_zero_initialized_serialization_support_interface(); + + return zero_serialization_support; +} + // CORE ============================================================================================ const char * rosidl_dynamic_typesupport_serialization_support_get_library_identifier( const rosidl_dynamic_typesupport_serialization_support_t * serialization_support) { - return serialization_support->library_identifier; + return serialization_support->serialization_library_identifier; } - rcutils_ret_t -rosidl_dynamic_typesupport_serialization_support_create( +rosidl_dynamic_typesupport_serialization_support_init( rosidl_dynamic_typesupport_serialization_support_impl_t * impl, rosidl_dynamic_typesupport_serialization_support_interface_t * methods, - rosidl_dynamic_typesupport_serialization_support_t ** serialization_support) + rcutils_allocator_t * allocator, + rosidl_dynamic_typesupport_serialization_support_t * serialization_support) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(impl, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(methods, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(allocator, RCUTILS_RET_INVALID_ARGUMENT); + if (!rcutils_allocator_is_valid(allocator)) { + RCUTILS_SET_ERROR_MSG("allocator is invalid"); + return RCUTILS_RET_INVALID_ARGUMENT; + } RCUTILS_CHECK_ARGUMENT_FOR_NULL(serialization_support, RCUTILS_RET_INVALID_ARGUMENT); - if (impl->library_identifier != methods->library_identifier) { + if (impl->serialization_library_identifier != methods->serialization_library_identifier) { RCUTILS_SET_ERROR_MSG( "Library identifiers for serialization support impl and interface do not match"); return RCUTILS_RET_INVALID_ARGUMENT; } - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - *serialization_support = - (rosidl_dynamic_typesupport_serialization_support_t *) allocator.zero_allocate( - 1, sizeof(rosidl_dynamic_typesupport_serialization_support_t), &allocator.state); - if (!*serialization_support) { - RCUTILS_SET_ERROR_MSG("Could not allocate serialization support"); - return RCUTILS_RET_BAD_ALLOC; - } + serialization_support->allocator = *allocator; + serialization_support->serialization_library_identifier = impl->serialization_library_identifier; + + serialization_support->impl = *impl; + serialization_support->methods = *methods; - (*serialization_support)->library_identifier = methods->library_identifier; - (*serialization_support)->impl = impl; - (*serialization_support)->methods = methods; return RCUTILS_RET_OK; } - rcutils_ret_t -rosidl_dynamic_typesupport_serialization_support_destroy( +rosidl_dynamic_typesupport_serialization_support_fini( rosidl_dynamic_typesupport_serialization_support_t * serialization_support) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(serialization_support, RCUTILS_RET_INVALID_ARGUMENT); ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( - (serialization_support->methods->serialization_support_impl_destroy)( - serialization_support->impl) + (serialization_support->methods.serialization_support_impl_fini)( + &serialization_support->impl) ); ROSIDL_DYNAMIC_TYPESUPPORT_CHECK_RET_FOR_NOT_OK( - (serialization_support->methods->serialization_support_interface_destroy)( - serialization_support->methods) + (serialization_support->methods.serialization_support_interface_fini)( + &serialization_support->methods) ); - - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - allocator.deallocate(serialization_support, &allocator.state); return RCUTILS_RET_OK; } diff --git a/src/dynamic_message_type_support_struct.c b/src/dynamic_message_type_support_struct.c index c25ca48..16b42ce 100644 --- a/src/dynamic_message_type_support_struct.c +++ b/src/dynamic_message_type_support_struct.c @@ -24,82 +24,151 @@ #include "rosidl_dynamic_typesupport/dynamic_message_type_support_struct.h" #include "rosidl_dynamic_typesupport/identifier.h" - rcutils_ret_t -rosidl_dynamic_message_type_support_handle_create( +rosidl_dynamic_message_type_support_handle_init( rosidl_dynamic_typesupport_serialization_support_t * serialization_support, const rosidl_type_hash_t * type_hash, const rosidl_runtime_c__type_description__TypeDescription * type_description, const rosidl_runtime_c__type_description__TypeSource__Sequence * type_description_sources, - rosidl_message_type_support_t ** ts) + rcutils_allocator_t * allocator, + rosidl_message_type_support_t * ts) { RCUTILS_CHECK_ARGUMENT_FOR_NULL(serialization_support, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(type_hash, RCUTILS_RET_INVALID_ARGUMENT); RCUTILS_CHECK_ARGUMENT_FOR_NULL(type_description, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(allocator, RCUTILS_RET_INVALID_ARGUMENT); + if (!rcutils_allocator_is_valid(allocator)) { + RCUTILS_SET_ERROR_MSG("allocator is invalid"); + return RCUTILS_RET_INVALID_ARGUMENT; + } RCUTILS_CHECK_ARGUMENT_FOR_NULL(ts, RCUTILS_RET_INVALID_ARGUMENT); // NOTE(methylDragon): Not supported for now // RCUTILS_CHECK_ARGUMENT_FOR_NULL(type_description_sources, RCUTILS_RET_INVALID_ARGUMENT); rcutils_ret_t ret = RCUTILS_RET_ERROR; - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - *ts = allocator.zero_allocate(1, sizeof(rosidl_message_type_support_t), allocator.state); - if (!*ts) { - RCUTILS_SET_ERROR_MSG("Could not allocate rosidl_message_type_support_t struct"); - return RCUTILS_RET_BAD_ALLOC; - } - (*ts)->data = allocator.zero_allocate( - 1, sizeof(rosidl_dynamic_message_type_support_impl_t), allocator.state); + ts->typesupport_identifier = rosidl_dynamic_typesupport_c__identifier; + ts->func = get_message_typesupport_handle_function; + ts->get_type_hash_func = + rosidl_get_dynamic_message_type_support_type_hash_function; + ts->get_type_description_func = + rosidl_get_dynamic_message_type_support_type_description_function; + ts->get_type_description_sources_func = + rosidl_get_dynamic_message_type_support_type_description_sources_function; + + ts->data = allocator->zero_allocate( + 1, sizeof(rosidl_dynamic_message_type_support_impl_t), allocator->state); if (!ts) { - RCUTILS_SET_ERROR_MSG("Could not allocate rosidl_dynamic_message_type_support_impl_t struct"); + RCUTILS_SET_ERROR_MSG("Could not allocate dynamic message type support impl"); ret = RCUTILS_RET_BAD_ALLOC; goto fail; } rosidl_dynamic_message_type_support_impl_t * ts_impl = - (rosidl_dynamic_message_type_support_impl_t *) (*ts)->data; + (rosidl_dynamic_message_type_support_impl_t *) ts->data; - // Copy init type hash (never null (checked above)) - ts_impl->type_hash = allocator.zero_allocate(1, sizeof(rosidl_type_hash_t), allocator.state); - if (!ts_impl->type_hash) { - RCUTILS_SET_ERROR_MSG("Could not create type hash to assign into"); - ret = RCUTILS_RET_BAD_ALLOC; + ret = rosidl_dynamic_message_type_support_handle_impl_init( + serialization_support, type_hash, type_description, type_description_sources, allocator, + ts_impl); + if (ret != RCUTILS_RET_OK) + { + RCUTILS_SET_ERROR_MSG_AND_APPEND_PREV_ERROR("Could not init dynamic message type support impl"); goto fail; } - ts_impl->type_hash->version = type_hash->version; - memcpy(ts_impl->type_hash->value, type_hash->value, sizeof(type_hash->value)); + return RCUTILS_RET_OK; - // Copy init type description (never null (checked above)) - ts_impl->type_description = rosidl_runtime_c__type_description__TypeDescription__create(); - if (ts_impl->type_description == NULL) { - RCUTILS_SET_ERROR_MSG("Could not create type description to assign into"); - ret = RCUTILS_RET_BAD_ALLOC; - goto fail; +fail: + if (rosidl_dynamic_message_type_support_handle_fini(ts) != RCUTILS_RET_OK) { + RCUTILS_SAFE_FWRITE_TO_STDERR_AND_APPEND_PREV_ERROR( + "While handling another error, could not finalize dynamic message type support handle"); } + return ret; +} +rcutils_ret_t +rosidl_dynamic_message_type_support_handle_fini(rosidl_message_type_support_t * ts) +{ + RCUTILS_CHECK_ARGUMENT_FOR_NULL(ts, RCUTILS_RET_INVALID_ARGUMENT); + + if (ts->typesupport_identifier != rosidl_dynamic_typesupport_c__identifier) { + RCUTILS_SET_ERROR_MSG("Type support not from this implementation"); + return RCUTILS_RET_INVALID_ARGUMENT; + } + + // NOTE(methylDragon): Ignores const... + rosidl_dynamic_message_type_support_impl_t * ts_impl = + (rosidl_dynamic_message_type_support_impl_t *)ts->data; + rcutils_allocator_t allocator = ts_impl->allocator; + + rcutils_ret_t ret = rosidl_dynamic_message_type_support_handle_impl_fini(ts_impl); + if (ret != RCUTILS_RET_OK) { + RCUTILS_SET_ERROR_MSG_AND_APPEND_PREV_ERROR( + "Could not finalize dynamic type support handle impl"); + return ret; + } + + allocator.deallocate((void *)ts->data, allocator.state); + return RCUTILS_RET_OK; +} + +rcutils_ret_t +rosidl_dynamic_message_type_support_handle_impl_init( + rosidl_dynamic_typesupport_serialization_support_t * serialization_support, + const rosidl_type_hash_t * type_hash, + const rosidl_runtime_c__type_description__TypeDescription * type_description, + const rosidl_runtime_c__type_description__TypeSource__Sequence * type_description_sources, + rcutils_allocator_t * allocator, + rosidl_dynamic_message_type_support_impl_t * ts_impl) +{ + RCUTILS_CHECK_ARGUMENT_FOR_NULL(serialization_support, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(type_hash, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(type_description, RCUTILS_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(allocator, RCUTILS_RET_INVALID_ARGUMENT); + if (!rcutils_allocator_is_valid(allocator)) { + RCUTILS_SET_ERROR_MSG("allocator is invalid"); + return RCUTILS_RET_INVALID_ARGUMENT; + } + RCUTILS_CHECK_ARGUMENT_FOR_NULL(ts_impl, RCUTILS_RET_INVALID_ARGUMENT); + + // NOTE(methylDragon): Not supported for now + // RCUTILS_CHECK_ARGUMENT_FOR_NULL(type_description_sources, RCUTILS_RET_INVALID_ARGUMENT); + + rcutils_ret_t ret = RCUTILS_RET_ERROR; + + // allocator + ts_impl->allocator = *allocator; + + // type_hash + ts_impl->type_hash.version = type_hash->version; + memcpy(ts_impl->type_hash.value, type_hash->value, sizeof(type_hash->value)); + + // type_description + if (!rosidl_runtime_c__type_description__TypeDescription__init(&ts_impl->type_description)) { + RCUTILS_SET_ERROR_MSG("Could not init type description"); + ret = RCUTILS_RET_NOT_INITIALIZED; + goto fail; + } if (!rosidl_runtime_c__type_description__TypeDescription__copy( - type_description, ts_impl->type_description)) + type_description, &ts_impl->type_description)) { RCUTILS_SET_ERROR_MSG("Could not copy type description"); ret = RCUTILS_RET_ERROR; goto fail; } - // Copy init type description sources (might be null) + // type_description_sources + if (!rosidl_runtime_c__type_description__TypeSource__Sequence__init( + &ts_impl->type_description_sources, 0)) + { + RCUTILS_SET_ERROR_MSG("Could not init type description sources"); + ret = RCUTILS_RET_NOT_INITIALIZED; + goto fail; + } if (type_description_sources != NULL) { - ts_impl->type_description_sources = - rosidl_runtime_c__type_description__TypeSource__Sequence__create( - type_description_sources->size); - if (ts_impl->type_description_sources == NULL) { - RCUTILS_SET_ERROR_MSG("Could not create type description sources sequence to assign into"); - ret = RCUTILS_RET_BAD_ALLOC; - goto fail; - } - if (!rosidl_runtime_c__type_description__TypeSource__Sequence__copy( - type_description_sources, ts_impl->type_description_sources)) + type_description_sources, &ts_impl->type_description_sources)) { RCUTILS_SET_ERROR_MSG("Could not copy type description sources"); ret = RCUTILS_RET_ERROR; @@ -107,84 +176,75 @@ rosidl_dynamic_message_type_support_handle_create( } } - ts_impl->serialization_support = serialization_support; + ts_impl->serialization_support = *serialization_support; - (*ts)->typesupport_identifier = rosidl_dynamic_typesupport_c__identifier; - (*ts)->func = get_message_typesupport_handle_function; - (*ts)->get_type_hash_func = - rosidl_get_dynamic_message_type_support_type_hash_function; - (*ts)->get_type_description_func = - rosidl_get_dynamic_message_type_support_type_description_function; - (*ts)->get_type_description_sources_func = - rosidl_get_dynamic_message_type_support_type_description_sources_function; + ts_impl->dynamic_message_type = allocator->zero_allocate( + 1, sizeof(rosidl_dynamic_typesupport_dynamic_type_t), allocator->state); + if (ts_impl->dynamic_message_type == NULL) { + RCUTILS_SET_ERROR_MSG( + "Could not allocate dynamic type for rosidl_dynamic_message_type_support_impl_t struct"); + ret = RCUTILS_RET_BAD_ALLOC; + goto fail; + } - ret = rosidl_dynamic_typesupport_dynamic_type_create_from_description( - ts_impl->serialization_support, type_description, &ts_impl->dynamic_message_type); - if (ret != RCUTILS_RET_OK || !ts_impl->dynamic_message_type) { + ts_impl->dynamic_message = allocator->zero_allocate( + 1, sizeof(rosidl_dynamic_typesupport_dynamic_data_t), allocator->state); + if (ts_impl->dynamic_message == NULL) { RCUTILS_SET_ERROR_MSG( + "Could not allocate dynamic data for rosidl_dynamic_message_type_support_impl_t struct"); + ret = RCUTILS_RET_BAD_ALLOC; + goto fail; + } + + // dynamic_message_type + ret = rosidl_dynamic_typesupport_dynamic_type_init_from_description( + &ts_impl->serialization_support, type_description, allocator, ts_impl->dynamic_message_type); + if (ret != RCUTILS_RET_OK) { + RCUTILS_SET_ERROR_MSG_AND_APPEND_PREV_ERROR( "Could not construct dynamic type for rosidl_dynamic_message_type_support_impl_t struct"); goto fail; } - ret = rosidl_dynamic_typesupport_dynamic_data_create_from_dynamic_type( - ts_impl->dynamic_message_type, &ts_impl->dynamic_message); - if (ret != RCUTILS_RET_OK || !ts_impl->dynamic_message) { - rcutils_error_string_t error_string = rcutils_get_error_string(); - rcutils_reset_error(); - RCUTILS_SET_ERROR_MSG_WITH_FORMAT_STRING( - "Could not construct dynamic data for rosidl_dynamic_message_type_support_impl_t struct:\n%s", - error_string.str); + // dynamic_message + ret = rosidl_dynamic_typesupport_dynamic_data_init_from_dynamic_type( + ts_impl->dynamic_message_type, allocator, ts_impl->dynamic_message); + if (ret != RCUTILS_RET_OK) { + RCUTILS_SET_ERROR_MSG_AND_APPEND_PREV_ERROR( + "Could not construct dynamic data for rosidl_dynamic_message_type_support_impl_t struct"); goto fail; } return RCUTILS_RET_OK; fail: - if (rosidl_dynamic_message_type_support_handle_destroy(*ts) != RCUTILS_RET_OK) { + if (rosidl_dynamic_message_type_support_handle_impl_fini(ts_impl) != RCUTILS_RET_OK) { RCUTILS_SAFE_FWRITE_TO_STDERR( - "While handling another error, could not destroy dynamic message typesupport"); + "While handling another error, could not finalize dynamic message type support handle impl"); } return ret; } - rcutils_ret_t -rosidl_dynamic_message_type_support_handle_destroy(rosidl_message_type_support_t * ts) +rosidl_dynamic_message_type_support_handle_impl_fini( + rosidl_dynamic_message_type_support_impl_t * ts_impl) { - RCUTILS_CHECK_ARGUMENT_FOR_NULL(ts, RCUTILS_RET_INVALID_ARGUMENT); - - // NOTE(methylDragon): Ignores const... - if (ts->typesupport_identifier != rosidl_dynamic_typesupport_c__identifier) { - RCUTILS_SET_ERROR_MSG("type support not from this implementation"); - return RCUTILS_RET_INVALID_ARGUMENT; - } + RCUTILS_CHECK_ARGUMENT_FOR_NULL(ts_impl, RCUTILS_RET_INVALID_ARGUMENT); - rcutils_allocator_t allocator = rcutils_get_default_allocator(); + rosidl_dynamic_typesupport_serialization_support_fini(&ts_impl->serialization_support); - if (ts->data) { - rosidl_dynamic_message_type_support_impl_t * ts_impl = - (rosidl_dynamic_message_type_support_impl_t *)ts->data; - if (ts_impl->type_description) { - rosidl_runtime_c__type_description__TypeDescription__fini(ts_impl->type_description); - } - if (ts_impl->type_description_sources) { - rosidl_runtime_c__type_description__TypeSource__Sequence__fini( - ts_impl->type_description_sources); - } - if (ts_impl->dynamic_message_type) { - rosidl_dynamic_typesupport_dynamic_type_destroy(ts_impl->dynamic_message_type); - } - if (ts_impl->dynamic_message) { - rosidl_dynamic_typesupport_dynamic_data_destroy(ts_impl->dynamic_message); - } - allocator.deallocate(ts_impl->type_hash, allocator.state); + rosidl_runtime_c__type_description__TypeDescription__fini(&ts_impl->type_description); + rosidl_runtime_c__type_description__TypeSource__Sequence__fini( + &ts_impl->type_description_sources); + if (ts_impl->dynamic_message_type) { + rosidl_dynamic_typesupport_dynamic_type_fini(ts_impl->dynamic_message_type); } - allocator.deallocate((void *)ts->data, allocator.state); - allocator.deallocate(ts, allocator.state); + if (ts_impl->dynamic_message) { + rosidl_dynamic_typesupport_dynamic_data_fini(ts_impl->dynamic_message); + } + return RCUTILS_RET_OK; } - // GETTERS ========================================================================================= const rosidl_type_hash_t * rosidl_get_dynamic_message_type_support_type_hash_function( @@ -197,10 +257,9 @@ rosidl_get_dynamic_message_type_support_type_hash_function( } rosidl_dynamic_message_type_support_impl_t * ts_impl = (rosidl_dynamic_message_type_support_impl_t *) ts->data; - return ts_impl->type_hash; + return &ts_impl->type_hash; } - const rosidl_runtime_c__type_description__TypeDescription * rosidl_get_dynamic_message_type_support_type_description_function( const rosidl_message_type_support_t * type_support) @@ -212,10 +271,9 @@ rosidl_get_dynamic_message_type_support_type_description_function( } rosidl_dynamic_message_type_support_impl_t * ts_impl = (rosidl_dynamic_message_type_support_impl_t *) ts->data; - return ts_impl->type_description; + return &ts_impl->type_description; } - const rosidl_runtime_c__type_description__TypeSource__Sequence * rosidl_get_dynamic_message_type_support_type_description_sources_function( const rosidl_message_type_support_t * type_support) @@ -227,5 +285,5 @@ rosidl_get_dynamic_message_type_support_type_description_sources_function( } rosidl_dynamic_message_type_support_impl_t * ts_impl = (rosidl_dynamic_message_type_support_impl_t *) ts->data; - return ts_impl->type_description_sources; + return &ts_impl->type_description_sources; } diff --git a/src/types.c b/src/types.c deleted file mode 100644 index 8bf23ab..0000000 --- a/src/types.c +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2023 Open Source Robotics Foundation, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "rosidl_dynamic_typesupport/types.h" - - -rosidl_dynamic_typesupport_serialization_support_t -rosidl_dynamic_typesupport_get_zero_initialized_serialization_support(void) -{ - return (rosidl_dynamic_typesupport_serialization_support_t) {0, 0, 0}; // NOLINT -} - - -rosidl_dynamic_typesupport_dynamic_type_builder_t -rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_builder(void) -{ - return (rosidl_dynamic_typesupport_dynamic_type_builder_t) {0, 0}; // NOLINT -} - - -rosidl_dynamic_typesupport_dynamic_type_t -rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type(void) -{ - return (rosidl_dynamic_typesupport_dynamic_type_t) {0, 0}; // NOLINT -} - - -rosidl_dynamic_typesupport_dynamic_data_t -rosidl_dynamic_typesupport_get_zero_initialized_dynamic_data(void) -{ - return (rosidl_dynamic_typesupport_dynamic_data_t) {0, 0}; // NOLINT -} - - -rosidl_dynamic_typesupport_serialization_support_impl_t -rosidl_dynamic_typesupport_get_zero_initialized_serialization_support_impl(void) -{ - return (rosidl_dynamic_typesupport_serialization_support_impl_t) {0, 0}; // NOLINT -} - - -rosidl_dynamic_typesupport_dynamic_type_builder_impl_t -rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_builder_impl(void) -{ - return (rosidl_dynamic_typesupport_dynamic_type_builder_impl_t) {0}; // NOLINT -} - - -rosidl_dynamic_typesupport_dynamic_type_impl_t -rosidl_dynamic_typesupport_get_zero_initialized_dynamic_type_impl(void) -{ - return (rosidl_dynamic_typesupport_dynamic_type_impl_t) {0}; // NOLINT -} - - -rosidl_dynamic_typesupport_dynamic_data_impl_t -rosidl_dynamic_typesupport_get_zero_initialized_dynamic_data_impl(void) -{ - return (rosidl_dynamic_typesupport_dynamic_data_impl_t) {0}; // NOLINT -}