CARLA
 
载入中...
搜索中...
未找到
PointFieldPubSubTypes.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 PointFieldPubSubTypes.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
27using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
28using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
29
30namespace sensor_msgs {
31 namespace msg {
33 {
34 // 设置类型名称,这里是 "sensor_msgs::msg::dds_::PointField_"
35 // 该名称通常用于数据交换中的类型识别
36 setName("sensor_msgs::msg::dds_::PointField_");
37
38 // 获取 PointField 类型的最大序列化大小(以字节为单位)
39 auto type_size = PointField::getMaxCdrSerializedSize();
40
41 // 考虑到可能的子消息对齐,计算对齐大小(以4字节对齐)
42 // 并将其加到原有的类型大小中
43 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4);
44
45 // 设置类型的总大小,包括封装头(4字节)
46 m_typeSize = static_cast<uint32_t>(type_size) + 4; /*封装头*/
47
48 // 判断该类型是否定义了Key(通常是主键)
49 m_isGetKeyDefined = PointField::isKeyDefined();
50
51 // 获取最大键序列化大小,保证键长度至少为16字节(如没有键则使用默认长度)
52 size_t keyLength = PointField::getKeyMaxCdrSerializedSize() > 16 ?
54
55 // 为键分配内存,并将其初始化为0
56 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
57 memset(m_keyBuffer, 0, keyLength);
58 }
59
61 {
62 if (m_keyBuffer != nullptr)
63 {
64 free(m_keyBuffer);
65 }
66 }
67
69 void* data,
70 SerializedPayload_t* payload)
71 {
72 PointField* p_type = static_cast<PointField*>(data);
73
74 // Object that manages the raw buffer.
75 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
76 // Object that serializes the data.
77 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
78 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
79 // Serialize encapsulation
80 ser.serialize_encapsulation();
81
82 try
83 {
84 // Serialize the object.
85 p_type->serialize(ser);
86 }
87 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
88 {
89 return false;
90 }
91
92 // Get the serialized length
93 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
94 return true;
95 }
96
98 SerializedPayload_t* payload,
99 void* data)
100 {
101 try
102 {
103 //Convert DATA to pointer of your type
104 PointField* p_type = static_cast<PointField*>(data);
105
106 // Object that manages the raw buffer.
107 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
108
109 // Object that deserializes the data.
110 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
111
112 // Deserialize encapsulation.
113 deser.read_encapsulation();
114 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
115
116 // Deserialize the object.
117 p_type->deserialize(deser);
118 }
119 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
120 {
121 return false;
122 }
123
124 return true;
125 }
126
128 void* data)
129 {
130 return [data]() -> uint32_t
131 {
132 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<PointField*>(data))) +
133 4u /*encapsulation*/;
134 };
135 }
136
138 {
139 return reinterpret_cast<void*>(new PointField());
140 }
141
143 void* data)
144 {
145 delete(reinterpret_cast<PointField*>(data));
146 }
147
149 void* data,
150 InstanceHandle_t* handle,
151 bool force_md5)
152 {
153 // 如果没有定义获取键的功能,则直接返回 false
154 if (!m_isGetKeyDefined)
155 {
156 return false;
157 }
158
159 // 将传入的 data 指针转换为 PointField 类型指针
160 PointField* p_type = static_cast<PointField*>(data);
161
162 // 创建一个用于管理原始缓冲区的 eprosima::fastcdr::FastBuffer 对象
163 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
165
166 // 创建一个用于序列化数据的 eprosima::fastcdr::Cdr 对象
167 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
168
169 // 序列化 PointField 对象的键值
170 p_type->serializeKey(ser);
171
172 // 如果强制使用 MD5 或者键的最大序列化大小大于 16 字节
173 if (force_md5 || PointField::getKeyMaxCdrSerializedSize() > 16)
174 {
175 // 初始化 MD5 对象
176 m_md5.init();
177
178 // 更新 MD5 哈希值,使用序列化后的数据进行更新
179 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
180
181 // 计算最终的 MD5 哈希值
182 m_md5.finalize();
183
184 // 将 MD5 的前 16 字节结果存储到 handle->value 中
185 for (uint8_t i = 0; i < 16; ++i)
186 {
187 handle->value[i] = m_md5.digest[i];
188 }
189 }
190 else
191 {
192 // 如果不需要 MD5,则直接将前 16 字节的键值存储到 handle->value 中
193 for (uint8_t i = 0; i < 16; ++i)
194 {
195 handle->value[i] = m_keyBuffer[i];
196 }
197 }
198 // 返回成功,表示已经获取并设置了键值
199 return true;
200 }
201
202 } //End of namespace msg
203} //End of namespace sensor_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 bool deserialize(eprosima::fastrtps::rtps::SerializedPayload_t *payload, void *data) override
virtual eProsima_user_DllExport void * createData() 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 deleteData(void *data) override
virtual eProsima_user_DllExport ~PointFieldPubSubType() override
virtual eProsima_user_DllExport bool serialize(void *data, eprosima::fastrtps::rtps::SerializedPayload_t *payload) override
此类表示用户在 IDL 文件中定义的结构 PointField。 <>
Definition PointField.h:79
static eProsima_user_DllExport bool isKeyDefined()
此函数告诉您此类型的键是否已定义
eProsima_user_DllExport void deserialize(eprosima::fastcdr::Cdr &cdr)
此函数使用 CDR 序列化反序列化对象。
static eProsima_user_DllExport size_t getKeyMaxCdrSerializedSize(size_t current_alignment=0)
此函数返回对象键的最大序列化大小 取决于缓冲区对齐。
static eProsima_user_DllExport size_t getMaxCdrSerializedSize(size_t current_alignment=0)
此函数返回对象的最大序列化大小 取决于缓冲区对齐。
static eProsima_user_DllExport size_t getCdrSerializedSize(const sensor_msgs::msg::PointField &data, size_t current_alignment=0)
此函数返回数据的序列化大小 取决于缓冲区对齐。
eProsima_user_DllExport void serialize(eprosima::fastcdr::Cdr &cdr) const
此函数使用 CDR 序列化序列化对象。
eProsima_user_DllExport void serializeKey(eprosima::fastcdr::Cdr &cdr) const
此函数使用 CDR 序列化序列化对象的键成员。