CARLA
 
载入中...
搜索中...
未找到
QuaternionPubSubTypes.cpp
浏览该文件的文档.
1// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima).
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15/*!
16 * @file QuaternionPubSubTypes.cpp
17 * This header file contains the implementation of the serialization functions.
18 *
19 * This file was generated by the tool fastcdrgen.
20 */
21
22#include <fastcdr/FastBuffer.h>
23#include <fastcdr/Cdr.h>
24
26// 定义SerializedPayload_t类型别名,用于表示快速RTPS中序列化后的负载数据类型
27using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
28// 定义InstanceHandle_t类型别名,用于表示快速RTPS中的实例句柄类型
29using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
30
31namespace geometry_msgs {
32 namespace msg {
33// QuaternionPubSubType类的构造函数,用于初始化该类型相关的属性
35 {
36 // 设置该类型的名称
37 setName("geometry_msgs::msg::dds_::Quaternion_");
38 // 获取Quaternion类型的最大CDR序列化大小
39 auto type_size = Quaternion::getMaxCdrSerializedSize();
40 // 进行可能的子消息对齐操作,根据当前大小进行对齐到4字节边界(常见的内存对齐操作,便于处理数据)
41 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4); /* possible submessage alignment */
42 // 计算包含封装后的总类型大小,额外加上4字节(可能是用于封装相关的开销)
43 m_typeSize = static_cast<uint32_t>(type_size) + 4; /*encapsulation*/
44 // 判断Quaternion类型是否定义了获取键的操作
45 m_isGetKeyDefined = Quaternion::isKeyDefined();
46 // 根据Quaternion类型获取键的最大CDR序列化大小来确定键缓冲区的长度,若大于16则取实际大小,否则取16
47 size_t keyLength = Quaternion::getKeyMaxCdrSerializedSize() > 16 ?
49 // 分配键缓冲区内存
50 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
51 // 初始化键缓冲区内存内容为0
52 memset(m_keyBuffer, 0, keyLength);
53 }
54// QuaternionPubSubType类的析构函数,用于释放之前分配的键缓冲区内存
56 {
57 if (m_keyBuffer != nullptr)
58 {
59 free(m_keyBuffer);
60 }
61 }
62// 序列化函数,将给定的数据对象序列化为SerializedPayload_t格式
64 void* data,
65 SerializedPayload_t* payload)
66 {
67 // 将传入的void*类型数据转换为Quaternion*类型指针,以便后续操作
68 Quaternion* p_type = static_cast<Quaternion*>(data);
69// 创建一个FastBuffer对象,用于管理原始缓冲区,它关联了payload中的数据指针和最大可用空间
70 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
71 // 创建一个Cdr对象,用于进行数据的序列化操作,指定了缓冲区、字节序(默认字节序)以及CDR格式(用于DDS的CDR格式)
72 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
73 // 根据序列化对象的字节序来设置负载的封装字节序标识(大端序或小端序)
74 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
75 // 序列化封装信息(可能是一些头部相关的封装元数据等)
76 ser.serialize_encapsulation();
77
78 try
79 {
80 // 调用Quaternion对象的serialize方法,通过Cdr对象将实际的数据序列化到缓冲区中
81 p_type->serialize(ser);
82 }
83 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
84 {
85 // 如果出现内存不足异常,则返回false表示序列化失败
86 return false;
87 }
88
89 // 获取序列化后的数据长度,并设置到payload的length成员中
90 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
91 return true;
92 }
93// 反序列化函数,将SerializedPayload_t格式的数据反序列化为对应的数据对象
95 SerializedPayload_t* payload,
96 void* data)
97 {
98 try
99 {
100 // 将传入的void*类型数据转换为Quaternion*类型指针,以便后续操作
101 Quaternion* p_type = static_cast<Quaternion*>(data);
102 // 创建一个FastBuffer对象,用于管理原始缓冲区,它关联了payload中的数据指针和实际数据长度
103 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
104 // 创建一个Cdr对象,用于进行数据的反序列化操作,指定了缓冲区、字节序(默认字节序)以及CDR格式(用于DDS的CDR格式)
105 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
106 // 反序列化封装信息(读取之前序列化时添加的封装相关数据)
107 deser.read_encapsulation();
108 // 根据反序列化对象的字节序来设置负载的封装字节序标识(大端序或小端序)
109 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
110 // 调用Quaternion对象的deserialize方法,通过Cdr对象从缓冲区中反序列化出实际的数据
111 p_type->deserialize(deser);
112 }
113 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
114 {
115 // 如果出现内存不足异常,则返回false表示反序列化失败
116 return false;
117 }
118 return true;
119 }
120// 返回一个函数对象,该函数对象用于获取给定数据对象序列化后的大小(包含封装等开销)
122 void* data)
123 {
124 return [data]() -> uint32_t
125 {
126 // 计算并返回包含封装的序列化大小,先获取Quaternion对象本身的序列化大小,再加上4字节(封装相关开销)
127 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<Quaternion*>(data))) +
128 4u /*encapsulation*/;
129 };
130 }
131// 创建一个新的Quaternion数据对象,并返回其void*类型的指针,用于后续操作(比如序列化等)
133 {
134 return reinterpret_cast<void*>(new Quaternion());
135 }
136// 删除之前创建的Quaternion数据对象,释放其占用的内存资源
138 void* data)
139 {
140 delete(reinterpret_cast<Quaternion*>(data));
141 }
142// 获取给定数据对象的键信息,用于在实例句柄等相关操作中标识该对象
144 void* data,
145 InstanceHandle_t* handle,
146 bool force_md5)
147 {
148 if (!m_isGetKeyDefined)
149 {
150 return false;
151 }
152 Quaternion* p_type = static_cast<Quaternion*>(data);
153 // 创建一个FastBuffer对象,用于管理键缓冲区,关联了m_keyBuffer和Quaternion类型获取键的最大CDR序列化大小
154 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
156 // 创建一个Cdr对象,用于将数据对象的键信息序列化到缓冲区中,这里指定了大端序(可能是键相关要求的字节序)
157 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
158 p_type->serializeKey(ser);
159 if (force_md5 || Quaternion::getKeyMaxCdrSerializedSize() > 16)
160 {
161 // 如果需要强制使用MD5或者键的序列化大小大于16字节,则进行MD5相关操作
162 m_md5.init();
163 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
164 m_md5.finalize();
165 for (uint8_t i = 0; i < 16; ++i)
166 {
167 handle->value[i] = m_md5.digest[i];
168 }
169 }
170 else
171 {
172 // 如果不需要MD5且键的序列化大小不大于16字节,则直接将键缓冲区内容复制到实例句柄的对应位置
173 for (uint8_t i = 0; i < 16; ++i)
174 {
175 handle->value[i] = m_keyBuffer[i];
176 }
177 }
178 return true;
179 }
180 } //命名空间msg结束
181} //命名空间geometry_msgs结束
eprosima::fastrtps::rtps::InstanceHandle_t InstanceHandle_t
eprosima::fastrtps::rtps::SerializedPayload_t SerializedPayload_t
virtual eProsima_user_DllExport std::function< uint32_t()> getSerializedSizeProvider(void *data) override
virtual eProsima_user_DllExport void deleteData(void *data) override
virtual eProsima_user_DllExport bool serialize(void *data, eprosima::fastrtps::rtps::SerializedPayload_t *payload) override
virtual eProsima_user_DllExport bool getKey(void *data, eprosima::fastrtps::rtps::InstanceHandle_t *ihandle, bool force_md5=false) override
virtual eProsima_user_DllExport void * createData() override
virtual eProsima_user_DllExport ~QuaternionPubSubType() override
virtual eProsima_user_DllExport bool deserialize(eprosima::fastrtps::rtps::SerializedPayload_t *payload, void *data) override
This class represents the structure Quaternion defined by the user in the IDL file.
Definition Quaternion.h:71
static eProsima_user_DllExport size_t getMaxCdrSerializedSize(size_t current_alignment=0)
This function returns the maximum serialized size of an object depending on the buffer alignment.
static eProsima_user_DllExport size_t getCdrSerializedSize(const geometry_msgs::msg::Quaternion &data, size_t current_alignment=0)
This function returns the serialized size of a data depending on the buffer alignment.
eProsima_user_DllExport void serialize(eprosima::fastcdr::Cdr &cdr) const
This function serializes an object using CDR serialization.
eProsima_user_DllExport void deserialize(eprosima::fastcdr::Cdr &cdr)
This function deserializes an object using CDR serialization.
eProsima_user_DllExport void serializeKey(eprosima::fastcdr::Cdr &cdr) const
This function serializes the key members of an object using CDR serialization.
static eProsima_user_DllExport bool isKeyDefined()
This function tells you if the Key has been defined for this type
static eProsima_user_DllExport size_t getKeyMaxCdrSerializedSize(size_t current_alignment=0)
This function returns the maximum serialized size of the Key of an object depending on the buffer ali...