CARLA
 
载入中...
搜索中...
未找到
CachedActorList.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
9#include "carla/NonCopyable.h"
10#include "carla/rpc/Actor.h"
11
12#include <boost/iterator/transform_iterator.hpp>
13
14#include <algorithm>
15#include <iterator>
16#include <mutex>
17
18namespace carla {
19namespace client {
20namespace detail {
21
22 // ===========================================================================
23 // -- 在客户端缓冲的参与者列表 CachedActorList ---------------------------------
24 // ===========================================================================
25
26 /// 保留参与者描述列表,以避免每次都向服务器请求描述。
27 ///
28 /// @todo Dead actors are never removed from the list.
30 public:
31
32 /// 将参与者插入到列表中。
33 void Insert(rpc::Actor actor);
34
35 /// 插入包含参与者的 @a 范围。
36 template <typename RangeT>
37 void InsertRange(RangeT range);
38
39 /// 返回 @a 范围内尚未添加到此列表的参与者 ID。
40 template <typename RangeT>
41 std::vector<ActorId> GetMissingIds(const RangeT &range) const;
42
43 /// 检索与 @a id 匹配的参与者,如果参与者未被缓存,则为空(可选)。
44 boost::optional<rpc::Actor> GetActorById(ActorId id) const;
45
46 /// 检索与 @a 范围内的 ID 匹配的参与者。
47 template <typename RangeT>
48 std::vector<rpc::Actor> GetActorsById(const RangeT &range) const;
49
50 void Clear();
51
52 private:
53
54 mutable std::mutex _mutex;
55
56 std::unordered_map<ActorId, rpc::Actor> _actors;
57 };
58
59 // ===========================================================================
60 // -- 缓冲的参与者列表 CachedActorList implementation 实现 ---------------------
61 // ===========================================================================
62
64 std::lock_guard<std::mutex> lock(_mutex);
65 auto id = actor.id;
66 _actors.emplace(id, std::move(actor));
67 }
68
69 template <typename RangeT>
70 inline void CachedActorList::InsertRange(RangeT range) {
71 auto make_a_pair = [](rpc::Actor actor) {
72 auto id = actor.id;
73 return std::make_pair(id, std::move(actor));
74 };
75 auto make_iterator = [&make_a_pair](auto it) {
76 return boost::make_transform_iterator(std::make_move_iterator(it), make_a_pair);
77 };
78 std::lock_guard<std::mutex> lock(_mutex);
79 _actors.insert(make_iterator(std::begin(range)), make_iterator(std::end(range)));
80 }
81
82 template <typename RangeT>
83 inline std::vector<ActorId> CachedActorList::GetMissingIds(const RangeT &range) const {
84 std::vector<ActorId> result;
85 result.reserve(range.size());
86 std::lock_guard<std::mutex> lock(_mutex);
87 std::copy_if(std::begin(range), std::end(range), std::back_inserter(result), [this](auto id) {
88 return _actors.find(id) == _actors.end();
89 });
90 return result;
91 }
92
93 inline boost::optional<rpc::Actor> CachedActorList::GetActorById(ActorId id) const {
94 std::lock_guard<std::mutex> lock(_mutex);
95 auto it = _actors.find(id);
96 if (it != _actors.end()) {
97 return it->second;
98 }
99 return boost::none;
100 }
101
102 template <typename RangeT>
103 inline std::vector<rpc::Actor> CachedActorList::GetActorsById(const RangeT &range) const {
104 std::vector<rpc::Actor> result;
105 result.reserve(range.size());
106 std::lock_guard<std::mutex> lock(_mutex);
107 for (auto &&id : range) {
108 auto it = _actors.find(id);
109 if (it != _actors.end()) {
110 result.emplace_back(it->second);
111 }
112 }
113 return result;
114 }
115
117 std::lock_guard<std::mutex> lock(_mutex);
118 _actors.clear();
119 }
120
121} // namespace detail
122} // namespace client
123} // namespace carla
这个类用于禁止拷贝构造函数和赋值操作,但允许移动构造函数和赋值操作
保留参与者描述列表,以避免每次都向服务器请求描述。
boost::optional< rpc::Actor > GetActorById(ActorId id) const
检索与 id 匹配的参与者,如果参与者未被缓存,则为空(可选)。
void InsertRange(RangeT range)
插入包含参与者的 范围。
void Insert(rpc::Actor actor)
将参与者插入到列表中。
std::unordered_map< ActorId, rpc::Actor > _actors
std::vector< rpc::Actor > GetActorsById(const RangeT &range) const
检索与 范围内的 ID 匹配的参与者。
std::vector< ActorId > GetMissingIds(const RangeT &range) const
返回 范围内尚未添加到此列表的参与者 ID。
carla::ActorId ActorId
参与者的智能指针类型
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
包含CARLA客户端相关类和函数的命名空间。