Program Listing for File type_description_utils.h

Return to documentation for file (include/rosidl_runtime_c/type_description_utils.h)

// 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.

#ifndef ROSIDL_RUNTIME_C__TYPE_DESCRIPTION_UTILS_H_
#define ROSIDL_RUNTIME_C__TYPE_DESCRIPTION_UTILS_H_

#include <stdint.h>
#include <stdio.h>
#include <string.h>

#include <rosidl_runtime_c/visibility_control.h>

#include <rcutils/types/rcutils_ret.h>
#include <rcutils/types/hash_map.h>

#include "rosidl_runtime_c/type_description/field__functions.h"
#include "rosidl_runtime_c/type_description/field__struct.h"
#include "rosidl_runtime_c/type_description/individual_type_description__functions.h"
#include "rosidl_runtime_c/type_description/individual_type_description__struct.h"
#include "rosidl_runtime_c/type_description/type_description__functions.h"
#include "rosidl_runtime_c/type_description/type_description__struct.h"

#ifdef __cplusplus
extern "C"
{
#endif

static const uint8_t ROSIDL_RUNTIME_C_TYPE_DESCRIPTION_UTILS_SEQUENCE_TYPE_ID_MASK = 48;

// =================================================================================================
// GET BY NAME
// =================================================================================================


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_find_field(
  const rosidl_runtime_c__type_description__Field__Sequence * fields,
  const char * name,
  rosidl_runtime_c__type_description__Field ** field);


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_find_referenced_type_description(
  const rosidl_runtime_c__type_description__IndividualTypeDescription__Sequence * referenced_types,
  const char * type_name,
  rosidl_runtime_c__type_description__IndividualTypeDescription ** referenced_type);


// =================================================================================================
// HASH MAPS
// =================================================================================================


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_get_field_map(
  const rosidl_runtime_c__type_description__IndividualTypeDescription * individual_description,
  const rcutils_allocator_t * allocator,
  rcutils_hash_map_t ** hash_map);


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_get_referenced_type_description_map(
  const rosidl_runtime_c__type_description__IndividualTypeDescription__Sequence * referenced_types,
  const rcutils_allocator_t * allocator,
  rcutils_hash_map_t ** hash_map);


// =================================================================================================
// DESCRIPTION VALIDITY
// =================================================================================================


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_get_necessary_referenced_type_descriptions_map(
  const rosidl_runtime_c__type_description__IndividualTypeDescription * main_type_description,
  const rcutils_hash_map_t * referenced_types_map,
  const rcutils_allocator_t * allocator,
  rcutils_hash_map_t ** seen_map);


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_copy_init_sequence_from_referenced_type_descriptions_map(
  const rcutils_hash_map_t * hash_map,
  rosidl_runtime_c__type_description__IndividualTypeDescription__Sequence ** sequence,
  bool sort);

ROSIDL_GENERATOR_C_PUBLIC
int
rosidl_runtime_c_type_description_utils_referenced_type_description_sequence_sort_compare(
  const void * lhs, const void * rhs);

ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_sort_referenced_type_descriptions_in_place(
  rosidl_runtime_c__type_description__IndividualTypeDescription__Sequence * sequence);


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_prune_referenced_type_descriptions_in_place(
  const rosidl_runtime_c__type_description__IndividualTypeDescription * main_type_description,
  rosidl_runtime_c__type_description__IndividualTypeDescription__Sequence * referenced_types);


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_field_is_valid(
  const rosidl_runtime_c__type_description__Field * field);


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_individual_type_description_is_valid(
  const rosidl_runtime_c__type_description__IndividualTypeDescription * description);


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_type_description_is_valid(
  const rosidl_runtime_c__type_description__TypeDescription * description);

ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_coerce_to_valid_type_description_in_place(
  rosidl_runtime_c__type_description__TypeDescription * type_description);


// =================================================================================================
// DESCRIPTION CONSTRUCTION
// =================================================================================================


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_create_field(
  const char * name, size_t name_length,
  uint8_t type_id, uint64_t capacity, uint64_t string_capacity,
  const char * nested_type_name, size_t nested_type_name_length,
  const char * default_value, size_t default_value_length,
  rosidl_runtime_c__type_description__Field ** field);


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_create_individual_type_description(
  const char * type_name, size_t type_name_length,
  rosidl_runtime_c__type_description__IndividualTypeDescription ** individual_description);


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_create_type_description(
  const char * type_name, size_t type_name_length,
  rosidl_runtime_c__type_description__TypeDescription ** type_description);


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_append_field(
  rosidl_runtime_c__type_description__IndividualTypeDescription * individual_type_description,
  rosidl_runtime_c__type_description__Field * field);


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_append_referenced_individual_type_description(
  rosidl_runtime_c__type_description__TypeDescription * type_description,
  rosidl_runtime_c__type_description__IndividualTypeDescription * referenced_type_description,
  bool sort);


// This adds the type description's main description as a referenced type, and all necessary
// referenced types. Then it prunes and sorts the resulting referenced types sequence.
ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_append_referenced_type_description(
  rosidl_runtime_c__type_description__TypeDescription * type_description,
  rosidl_runtime_c__type_description__TypeDescription * type_description_to_append,
  bool coerce_to_valid);

// 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(
  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);

// 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(
  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);


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_repl_individual_type_description_type_names_in_place(
  rosidl_runtime_c__type_description__IndividualTypeDescription * individual_type_description,
  const char * from,
  const char * to);


ROSIDL_GENERATOR_C_PUBLIC
rcutils_ret_t
rosidl_runtime_c_type_description_utils_repl_all_type_description_type_names_in_place(
  rosidl_runtime_c__type_description__TypeDescription * type_description,
  const char * from,
  const char * to);

#ifdef __cplusplus
}
#endif

#endif  // ROSIDL_RUNTIME_C__TYPE_DESCRIPTION_UTILS_H_