diff --git a/rosidl_runtime_c/include/rosidl_runtime_c/type_description_utils.h b/rosidl_runtime_c/include/rosidl_runtime_c/type_description_utils.h index c20a4b53e..0de341eb7 100644 --- a/rosidl_runtime_c/include/rosidl_runtime_c/type_description_utils.h +++ b/rosidl_runtime_c/include/rosidl_runtime_c/type_description_utils.h @@ -341,7 +341,7 @@ rosidl_runtime_c_type_description_utils_prune_referenced_type_descriptions_in_pl ROSIDL_GENERATOR_C_PUBLIC bool rosidl_runtime_c_type_description_utils_field_is_valid( - rosidl_runtime_c__type_description__Field * field); + const rosidl_runtime_c__type_description__Field * field); /// Check if individual type description is valid /** @@ -354,7 +354,7 @@ rosidl_runtime_c_type_description_utils_field_is_valid( ROSIDL_GENERATOR_C_PUBLIC bool rosidl_runtime_c_type_description_utils_individual_type_description_is_valid( - rosidl_runtime_c__type_description__IndividualTypeDescription * description); + const rosidl_runtime_c__type_description__IndividualTypeDescription * description); /// Check if type description is valid /** @@ -370,7 +370,7 @@ rosidl_runtime_c_type_description_utils_individual_type_description_is_valid( ROSIDL_GENERATOR_C_PUBLIC bool rosidl_runtime_c_type_description_utils_type_description_is_valid( - rosidl_runtime_c__type_description__TypeDescription * description); + const rosidl_runtime_c__type_description__TypeDescription * description); /// This is on a best effort basis, it won't work if the fields of the main or necessary referenced /// types are invalid. It prunes then sorts. @@ -597,12 +597,15 @@ rosidl_runtime_c_type_description_utils_append_referenced_type_description( rosidl_runtime_c__type_description__TypeDescription * type_description_to_append, bool coerce_to_valid); -// Copy main type description, then validate if coerce_to_valid is true +// Create a type description from a referenced description, then validate if coerce_to_valid is true +// This is done by copy!! This allocates memory and the caller is responsible for deallocating the +// output ROSIDL_GENERATOR_C_PUBLIC rcutils_ret_t rosidl_runtime_c_type_description_utils_get_referenced_type_description_as_type_description( - rosidl_runtime_c__type_description__IndividualTypeDescription__Sequence * referenced_descriptions, - rosidl_runtime_c__type_description__IndividualTypeDescription * referenced_description, + const rosidl_runtime_c__type_description__IndividualTypeDescription__Sequence * + referenced_descriptions, + const rosidl_runtime_c__type_description__IndividualTypeDescription * referenced_description, rosidl_runtime_c__type_description__TypeDescription ** output_description, bool coerce_to_valid); diff --git a/rosidl_runtime_c/src/type_description_utils.c b/rosidl_runtime_c/src/type_description_utils.c index 152b918d0..eb07e384d 100644 --- a/rosidl_runtime_c/src/type_description_utils.c +++ b/rosidl_runtime_c/src/type_description_utils.c @@ -622,7 +622,7 @@ rosidl_runtime_c_type_description_utils_prune_referenced_type_descriptions_in_pl bool rosidl_runtime_c_type_description_utils_field_is_valid( - rosidl_runtime_c__type_description__Field * field) + const rosidl_runtime_c__type_description__Field * field) { if (field == NULL) { RCUTILS_LOG_WARN("Field is invalid: Pointer is null"); @@ -651,7 +651,7 @@ rosidl_runtime_c_type_description_utils_field_is_valid( bool rosidl_runtime_c_type_description_utils_individual_type_description_is_valid( - rosidl_runtime_c__type_description__IndividualTypeDescription * description) + const rosidl_runtime_c__type_description__IndividualTypeDescription * description) { if (description == NULL) { RCUTILS_LOG_WARN("Individual type description is invalid: Pointer is null"); @@ -710,7 +710,7 @@ rosidl_runtime_c_type_description_utils_individual_type_description_is_valid( bool rosidl_runtime_c_type_description_utils_type_description_is_valid( - rosidl_runtime_c__type_description__TypeDescription * description) + const rosidl_runtime_c__type_description__TypeDescription * description) { if (description == NULL) { RCUTILS_LOG_WARN("Type description is invalid: Pointer is null"); @@ -799,7 +799,7 @@ rosidl_runtime_c_type_description_utils_type_description_is_valid( RCUTILS_LOG_ERROR("Could allocate sequence for copy of referenced type descriptions"); goto end_necessary; } - if (rosidl_runtime_c__type_description__IndividualTypeDescription__Sequence__copy( + if (!rosidl_runtime_c__type_description__IndividualTypeDescription__Sequence__copy( &description->referenced_type_descriptions, sorted_sequence)) { RCUTILS_LOG_ERROR("Could not copy referenced type descriptions for validation"); @@ -1232,8 +1232,9 @@ rosidl_runtime_c_type_description_utils_append_referenced_type_description( rcutils_ret_t rosidl_runtime_c_type_description_utils_get_referenced_type_description_as_type_description( - rosidl_runtime_c__type_description__IndividualTypeDescription__Sequence * referenced_descriptions, - rosidl_runtime_c__type_description__IndividualTypeDescription * referenced_description, + const rosidl_runtime_c__type_description__IndividualTypeDescription__Sequence * + referenced_descriptions, + const rosidl_runtime_c__type_description__IndividualTypeDescription * referenced_description, rosidl_runtime_c__type_description__TypeDescription ** output_description, bool coerce_to_valid) { diff --git a/rosidl_runtime_c/test/test_type_description_utils.cpp b/rosidl_runtime_c/test/test_type_description_utils.cpp index 50e908f95..94255c876 100644 --- a/rosidl_runtime_c/test/test_type_description_utils.cpp +++ b/rosidl_runtime_c/test/test_type_description_utils.cpp @@ -365,6 +365,7 @@ TEST_F(TestUtilsFixture, test_appends_and_advanced_construction) individual_desc_1, // Depends on ref: "empty" &subset_desc_2, true); // Coercion to valid + EXPECT_TRUE(rosidl_runtime_c_type_description_utils_type_description_is_valid(subset_desc_2)); EXPECT_EQ(subset_desc_2->referenced_type_descriptions.size, 1); EXPECT_EQ(subset_desc_2->referenced_type_descriptions.capacity, 1); EXPECT_FALSE(