CARLA
 
载入中...
搜索中...
未找到
Vector3PubSubTypes.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 Vector3PubSubTypes.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
25#include "Vector3PubSubTypes.h"
26
27using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
28using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
29// 以下是geometry_msgs::msg命名空间,用于定义与消息相关的类型和操作
30namespace geometry_msgs {
31 namespace msg {
32 // Vector3PubSubType类的构造函数,用于初始化该类型相关的属性
34 {
35 setName("geometry_msgs::msg::dds_::Vector3_");
36 // 设置类型的名称,这里表明是geometry_msgs::msg::dds_::Vector3_类型
37 auto type_size = Vector3::getMaxCdrSerializedSize();
38 // 考虑可能的子消息对齐(按4字节对齐),调整类型大小
39 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4); /* possible submessage alignment */
40 // 计算总的类型大小,加上4字节用于封装(encapsulation)相关信息
41 m_typeSize = static_cast<uint32_t>(type_size) + 4; /*encapsulation*/
42 // 判断Vector3类型是否定义了获取键(Key)的操作
43 m_isGetKeyDefined = Vector3::isKeyDefined();
44 // 获取Vector3类型键(Key)的最大CDR序列化大小,如果大于16则取实际大小,否则取16
45 size_t keyLength = Vector3::getKeyMaxCdrSerializedSize() > 16 ?
47 // 为存储键(Key)相关的数据分配内存空间
48 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
49 // 将分配的内存空间初始化为0
50 memset(m_keyBuffer, 0, keyLength);
51 }
52 // Vector3PubSubType类的析构函数,用于释放构造函数中分配的内存(键缓冲区内存)
54 {
55 if (m_keyBuffer != nullptr)
56 {
57 free(m_keyBuffer);
58 }
59 }
60 // 序列化函数,将给定的数据(这里是Vector3类型的数据)序列化为SerializedPayload_t类型的对象
62 void* data,
63 SerializedPayload_t* payload)
64 {
65 // 将传入的void*指针转换为Vector3*指针,方便后续操作
66 Vector3* p_type = static_cast<Vector3*>(data);
67
68 // 创建一个FastBuffer对象,用于管理原始缓冲区,它关联了payload的data指针和最大尺寸
69 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
70 // 创建一个Cdr对象,用于进行数据序列化操作,指定了缓冲区、字节序(默认字节序)以及使用DDS_CDR模式
71 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
72 // 根据序列化对象的字节序设置payload的封装字节序标识(CDR_BE表示大端序,CDR_LE表示小端序)
73 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
74 // 先序列化封装相关的信息
75 ser.serialize_encapsulation();
76
77 try
78 {
79 // 调用Vector3类型自身的序列化函数,将具体的数据内容序列化到ser对象中
80 p_type->serialize(ser);
81 }
82 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
83 {
84 // 如果内存不足出现异常,返回false表示序列化失败
85 return false;
86 }
87
88 // 获取序列化后的数据长度,并设置到payload对象中
89 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
90 return true;
91 }
92 // 反序列化函数,将SerializedPayload_t类型的数据反序列化为对应的数据类型
94 SerializedPayload_t* payload,
95 void* data)
96 {
97 try
98 {
99 // 将传入的void*指针转换为Vector3*指针,用于后续操作
100 Vector3* p_type = static_cast<Vector3*>(data);
101
102 // 创建一个FastBuffer对象,关联payload的data指针和实际的数据长度,用于管理原始缓冲区
103 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
104
105 // 创建一个Cdr对象用于反序列化操作,指定了缓冲区、默认字节序以及DDS_CDR模式
106 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
107
108 // 先反序列化封装相关的信息,读取头部等封装内容
109 deser.read_encapsulation();
110 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
111
112 // 调用Vector3类型自身的反序列化函数,从deser对象中恢复出具体的数据内容
113 p_type->deserialize(deser);
114 }
115 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
116 {
117 // 如果内存不足出现异常,返回false表示反序列化失败
118 return false;
119 }
120
121 return true;
122 }
123 // 返回一个函数对象,该函数对象用于获取给定数据(Vector3类型)序列化后的大小
125 void* data)
126 {
127 return [data]() -> uint32_t
128 {
129 // 计算并返回数据序列化后的大小,包括Vector3类型自身序列化大小和封装占用的4字节
130 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<Vector3*>(data))) +
131 4u /*encapsulation*/;
132 };
133 }
134 // 创建一个新的Vector3类型的数据对象,并返回其void*指针,用于后续的操作
136 {
137 return reinterpret_cast<void*>(new Vector3());
138 }
139 // 删除传入的void*指针所指向的Vector3类型的数据对象,释放内存
141 void* data)
142 {
143 delete(reinterpret_cast<Vector3*>(data));
144 }
145 // 获取给定数据(Vector3类型)的键(Key)信息,并填充到InstanceHandle_t对象中
147 void* data,
148 InstanceHandle_t* handle,
149 bool force_md5)
150 {
151 if (!m_isGetKeyDefined)
152 {
153 // 如果Vector3类型没有定义获取键的操作,直接返回false
154 return false;
155 }
156
157 Vector3* p_type = static_cast<Vector3*>(data);
158
159 // 创建一个FastBuffer对象,关联存储键信息的缓冲区(m_keyBuffer)和键的最大序列化大小
160 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
162
163 // 创建一个Cdr对象用于序列化键信息,指定为大端序(通常用于网络传输等场景保证字节序一致性)
164 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
165 // 调用Vector3类型自身的序列化键函数,将键信息序列化到ser对象中
166 p_type->serializeKey(ser);
167 if (force_md5 || Vector3::getKeyMaxCdrSerializedSize() > 16)
168 {
169 // 如果强制使用MD5或者键的最大序列化大小大于16字节
170 m_md5.init();
171 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
172 m_md5.finalize();
173 for (uint8_t i = 0; i < 16; ++i)
174 {
175 handle->value[i] = m_md5.digest[i];
176 }
177 }
178 else
179 {
180 // 如果键的序列化大小小于等于16字节,直接将键缓冲区的数据复制到handle中
181 for (uint8_t i = 0; i < 16; ++i)
182 {
183 handle->value[i] = m_keyBuffer[i];
184 }
185 }
186 return true;
187 }
188 }
189}
eprosima::fastrtps::rtps::InstanceHandle_t InstanceHandle_t
eprosima::fastrtps::rtps::SerializedPayload_t SerializedPayload_t
virtual eProsima_user_DllExport bool deserialize(eprosima::fastrtps::rtps::SerializedPayload_t *payload, void *data) override
virtual eProsima_user_DllExport ~Vector3PubSubType() override
virtual eProsima_user_DllExport bool serialize(void *data, eprosima::fastrtps::rtps::SerializedPayload_t *payload) override
virtual eProsima_user_DllExport void deleteData(void *data) override
virtual eProsima_user_DllExport void * createData() override
virtual eProsima_user_DllExport std::function< uint32_t()> getSerializedSizeProvider(void *data) override
eProsima_user_DllExport Vector3PubSubType()
virtual eProsima_user_DllExport bool getKey(void *data, eprosima::fastrtps::rtps::InstanceHandle_t *ihandle, bool force_md5=false) override
此类表示用户在 IDL 文件中定义的 Vector3 结构。 <>
Definition Vector3.h:72
eProsima_user_DllExport void serializeKey(eprosima::fastcdr::Cdr &cdr) const
此函数使用 CDR 序列化序列化对象的键成员。
Definition Vector3.cpp:220
static eProsima_user_DllExport size_t getCdrSerializedSize(const geometry_msgs::msg::Vector3 &data, size_t current_alignment=0)
此函数返回数据的序列化大小 取决于缓冲区对齐。
Definition Vector3.cpp:111
static eProsima_user_DllExport bool isKeyDefined()
此函数告诉您此类型是否定义了键
Definition Vector3.cpp:215
static eProsima_user_DllExport size_t getMaxCdrSerializedSize(size_t current_alignment=0)
此函数返回对象的最大序列化大小 取决于缓冲区对齐。
Definition Vector3.cpp:103
eProsima_user_DllExport void serialize(eprosima::fastcdr::Cdr &cdr) const
此函数使用 CDR 序列化序列化对象。
Definition Vector3.cpp:126
static eProsima_user_DllExport size_t getKeyMaxCdrSerializedSize(size_t current_alignment=0)
此函数返回对象键的最大序列化大小 取决于缓冲区对齐。
Definition Vector3.cpp:207
eProsima_user_DllExport void deserialize(eprosima::fastcdr::Cdr &cdr)
此函数使用 CDR 序列化反序列化对象。
Definition Vector3.cpp:137