.. _program_listing_file_include_rclcpp_get_message_type_support_handle.hpp: Program Listing for File get_message_type_support_handle.hpp ============================================================ |exhale_lsh| :ref:`Return to documentation for file ` (``include/rclcpp/get_message_type_support_handle.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp // Copyright 2021 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 RCLCPP__GET_MESSAGE_TYPE_SUPPORT_HANDLE_HPP_ #define RCLCPP__GET_MESSAGE_TYPE_SUPPORT_HANDLE_HPP_ #include #include "rosidl_runtime_cpp/traits.hpp" #include "rosidl_runtime_cpp/message_type_support_decl.hpp" #include "rosidl_typesupport_cpp/message_type_support.hpp" #include "rclcpp/type_adapter.hpp" namespace rclcpp { #ifdef DOXYGEN_ONLY template constexpr const rosidl_message_type_support_t & get_message_type_support_handle(); #else template constexpr typename std::enable_if_t< rosidl_generator_traits::is_message::value, const rosidl_message_type_support_t & > get_message_type_support_handle() { auto handle = rosidl_typesupport_cpp::get_message_type_support_handle(); if (!handle) { throw std::runtime_error("Type support handle unexpectedly nullptr"); } return *handle; } template constexpr typename std::enable_if_t< !rosidl_generator_traits::is_message::value && rclcpp::TypeAdapter::is_specialized::value, const rosidl_message_type_support_t & > get_message_type_support_handle() { auto handle = rosidl_typesupport_cpp::get_message_type_support_handle< typename TypeAdapter::ros_message_type >(); if (!handle) { throw std::runtime_error("Type support handle unexpectedly nullptr"); } return *handle; } // This specialization is a pass through runtime check, which allows a better // static_assert to catch this issue further down the line. // This should never get to be called in practice, and is purely defensive. template< typename AdaptedType > constexpr typename std::enable_if_t< !rosidl_generator_traits::is_message::value && !TypeAdapter::is_specialized::value, const rosidl_message_type_support_t & > get_message_type_support_handle() { throw std::runtime_error( "this specialization of rclcpp::get_message_type_support_handle() " "should never be called"); } #endif } // namespace rclcpp #endif // RCLCPP__GET_MESSAGE_TYPE_SUPPORT_HANDLE_HPP_