CARLA
 
载入中...
搜索中...
未找到
Message.h
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7#pragma once
8/// @file
9/// @brief 包含 Carla 框架中与网络流相关的类和函数的声明。
10///
11/// 此文件包含了 Carla 框架中用于网络通信的一些基础类和函数的声明,
12/// 包括列表视图、缓冲区、缓冲区视图、调试工具、不可复制类以及网络流相关的类型定义。
13#include "carla/ListView.h"/// @brief 包含 ListView 类的声明,用于管理数据的列表视图。
14#include "carla/Buffer.h" /// @brief 包含 Buffer 类的声明,用于存储和管理数据缓冲区。
15#include "carla/BufferView.h"/// @brief 包含 BufferView 类的声明,提供对 Buffer 中数据的只读视图。
16#include "carla/Debug.h"/// @brief 包含调试工具的声明,用于输出调试信息和进行断言检查。
17#include "carla/NonCopyable.h"/// @brief 包含 NonCopyable 类的声明,用于禁止类的拷贝操作。
18#include "carla/streaming/detail/Types.h"/// @brief 包含网络流相关的类型定义。
19
20#include <boost/asio/buffer.hpp>/// @brief 包含 Boost.Asio 库中用于处理网络缓冲区的函数和类型。
21
22#include <array>/// @brief 包含 std::array 容器的声明,用于存储固定大小的数组。
23#include <exception>/// @brief 包含标准异常类的声明,用于处理异常情况。
24#include <limits>/// @brief 包含标准库中与限制和常量相关的定义,如数值类型的最大值和最小值。
25#include <memory>/// @brief 包含内存管理相关的类和函数,如智能指针。
26#include <string>/// @brief 包含 std::string 类的声明,用于处理字符串数据。
27
28namespace carla {
29namespace streaming {
30namespace detail {
31namespace tcp {
32
33 /// @brief 通过TCP套接字发送的一组缓冲区的序列化,作为单个消息发送。
34 /// 模板参数@a MaxNumberOfBuffers在编译时限制单个消息中可以包含的缓冲区的最大数量。
35 ///
36 /// @tparam MaxNumberOfBuffers 单个消息中可以包含的缓冲区的最大数量(编译时常量)。
37 template <size_t MaxNumberOfBuffers>
39 : public std::enable_shared_from_this<MessageTmpl<MaxNumberOfBuffers>>,
40 private NonCopyable {
41 public:
42 /// @brief 获取单个消息中可以包含的缓冲区的最大数量。
43 ///
44 /// @return 返回单个消息中可以包含的缓冲区的最大数量。
45 static constexpr size_t max_size() {
46 return MaxNumberOfBuffers;
47 }
48
49 private:
50 /// @brief 私有构造函数,用于限制外部直接创建对象。
51 ///
52 /// @param size 预留参数,可能用于内部初始化。
53 MessageTmpl(size_t) {}
54 /// @brief 模板化的构造函数,用于初始化消息对象。
55 ///
56 /// @param size 缓冲区总数(包括传入的和后续参数中的)。
57 /// @param buffer 第一个缓冲区(类型为SharedBufferView)。
58 /// @param buffers 可变数量的其他缓冲区。
59 ///
60 /// @note 该构造函数通过递归调用自身来处理可变数量的缓冲区参数。
61 template <typename... Buffers>
62 MessageTmpl(size_t size, SharedBufferView buffer, Buffers... buffers)
63 : MessageTmpl(size, buffers...) {
65 _total_size += buffer->size();
66 _buffer_views[1u + size - _number_of_buffers] = buffer->cbuffer();
68 }
69
70 public:
71 /// @brief 模板化的构造函数,用于创建包含多个缓冲区的消息对象。
72 ///
73 /// @param buf 第一个缓冲区(类型为SharedBufferView)。
74 /// @param buffers 可变数量的其他缓冲区。
75 ///
76 /// @note 该构造函数通过递归调用自身(利用模板参数包展开)来处理可变数量的缓冲区参数。
77 /// 同时,它使用`sizeof...(Buffers)`来获取传入的缓冲区数量,并加1以包括第一个缓冲区。
78 /// 在构造之前,会进行静态断言以确保传入的缓冲区数量不超过最大允许值。
79 ///
80 /// @throws 编译时断言失败,如果传入的缓冲区数量超过`max_size()`返回的值。
81 template <typename... Buffers>
82 MessageTmpl(SharedBufferView buf, Buffers... buffers)
83 : MessageTmpl(sizeof...(Buffers) + 1u, buf, buffers...) {
84 static_assert(sizeof...(Buffers) < max_size(), "Too many buffers!");
85 // 设置第一个_buffer_view为_total_size的缓冲区
86 _buffer_views[0u] = boost::asio::buffer(&_total_size, sizeof(_total_size));
87 }
88
89 /// @brief 获取消息的大小(不包括头部。
90 ///
91 /// @return 返回消息的大小(以字节为单位。
92 auto size() const noexcept {
93 return _total_size;
94 }
95 /// @brief 检查消息是否为空。
96 ///
97 /// @return 如果消息大小为0,则返回true;否则返回false。
98 bool empty() const noexcept {
99 return size() == 0u;
100 }
101 /// @brief 获取消息的缓冲区序列。
102 ///
103 /// @return 返回一个包含所有缓冲区视图的视图对象(可能是`std::vector<boost::asio::const_buffer>`或类似类型,具体取决于`MakeListView`的实现)。
104 /// 注意,返回的视图包括_total_size的缓冲区视图以及所有传入的缓冲区视图。
105 auto GetBufferSequence() const {
106 auto begin = _buffer_views.begin();
107 // 创建一个包含_number_of_buffers + 1个缓冲区视图的视图
109 }
110
111 private:
112 /// @brief 缓冲区数量(不包括_total_size的缓冲区)。
114 /// @brief 消息的总大小(以字节为单位,不包括头部)。
116 /// @brief 存储所有传入的缓冲区对象的数组。
117 std::array<SharedBufferView, MaxNumberOfBuffers> _buffers;
118 /// @brief 存储所有缓冲区视图的数组,包括_total_size的缓冲区视图。
119 /// 注意,数组大小比_buffers多一个,以容纳_total_size的缓冲区视图。
120 std::array<boost::asio::const_buffer, MaxNumberOfBuffers + 1u> _buffer_views;
121 };
122
123 // class MessageTmpl
124
125/// @brief 一个TCP消息类型,最多包含2个缓冲区。这通常用于包含头部和主体的消息。
126///
127/// @note 该类型是通过将`MessageTmpl`模板的特化参数设置为2来创建的。
129
130} // namespace tcp
131} // namespace detail
132} // namespace streaming
133} // namespace carla
auto begin() const noexcept
名称范围迭代支持
包含与Carla流处理相关的底层细节的头文件。
这个类用于禁止拷贝和移动构造函数及赋值操作
通过TCP套接字发送的一组缓冲区的序列化,作为单个消息发送。
Definition Message.h:40
MessageTmpl(size_t size, SharedBufferView buffer, Buffers... buffers)
模板化的构造函数,用于初始化消息对象。
Definition Message.h:62
std::array< SharedBufferView, MaxNumberOfBuffers > _buffers
存储所有传入的缓冲区对象的数组。
Definition Message.h:117
auto size() const noexcept
获取消息的大小(不包括头部。
Definition Message.h:92
static constexpr size_t max_size()
获取单个消息中可以包含的缓冲区的最大数量。
Definition Message.h:45
auto GetBufferSequence() const
获取消息的缓冲区序列。
Definition Message.h:105
MessageTmpl(SharedBufferView buf, Buffers... buffers)
模板化的构造函数,用于创建包含多个缓冲区的消息对象。
Definition Message.h:82
MessageTmpl(size_t)
私有构造函数,用于限制外部直接创建对象。
Definition Message.h:53
message_size_type _number_of_buffers
缓冲区数量(不包括_total_size的缓冲区)。
Definition Message.h:113
std::array< boost::asio::const_buffer, MaxNumberOfBuffers+1u > _buffer_views
存储所有缓冲区视图的数组,包括_total_size的缓冲区视图。 注意,数组大小比_buffers多一个,以容纳_total_size的缓冲区视图。
Definition Message.h:120
message_size_type _total_size
消息的总大小(以字节为单位,不包括头部)。
Definition Message.h:115
bool empty() const noexcept
检查消息是否为空。
Definition Message.h:98
uint32_t message_size_type
消息大小的类型定义。
Definition Types.h:40
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
static auto MakeListView(Iterator begin, Iterator end)
std::shared_ptr< BufferView > SharedBufferView
Definition BufferView.h:163