CARLA
 
载入中...
搜索中...
未找到
AtomicList.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
10#include "carla/NonCopyable.h"
11
12#include <algorithm>
13#include <mutex>
14#include <vector>
15
16namespace carla {
17namespace client {
18namespace detail {
19
20 /// 持有一个指向列表的原子指针。
21 ///
22 /// @warning 仅 Load 方法是原子的,对列表的修改由互斥量锁定。
23 template <typename T>
24 class AtomicList : private NonCopyable {
25 using ListT = std::vector<T>;// 列表类型定义为 std::vector<T>,存储元素 T
26 public:
27
28 AtomicList() : _list(std::make_shared<ListT>()) {}// 初始化列表为一个空的共享指针
29
30 template <typename ValueT>
31 void Push(ValueT &&value) {
32 std::lock_guard<std::mutex> lock(_mutex);// 锁定互斥量以保证线程安全
33 auto new_list = std::make_shared<ListT>(*Load());// 复制当前列表并创建一个新列表
34 new_list->emplace_back(std::forward<ValueT>(value)); // 将新值添加到新列表的末尾
35 _list = new_list;// 更新原子指针指向新列表
36 }
37
38 void DeleteByIndex(size_t index) {
39 std::lock_guard<std::mutex> lock(_mutex);// 锁定互斥量以保证线程安全
40 auto new_list = std::make_shared<ListT>(*Load());// 复制当前列表并创建一个新列表
41 auto begin = new_list->begin();// 获取列表的起始迭代器
42 std::advance(begin, index);
43 new_list->erase(begin);
44 _list = new_list;// 更新原子指针指向新列表
45 }
46 // DeleteByValue方法,根据值删除列表中的元素
47 template <typename ValueT>
48 void DeleteByValue(const ValueT &value) {
49 // 锁定互斥量以保证线程安全
50 std::lock_guard<std::mutex> lock(_mutex);
51 // 复制当前列表并创建一个新列表
52 auto new_list = std::make_shared<ListT>(*Load()); // 使用 std::remove 移动所有等于 value 的元素到列表末尾,然后调用 erase 删除这些元素
53 new_list->erase(std::remove(new_list->begin(), new_list->end(), value), new_list->end());
54 // 更新原子指针指向新列表
55 _list = new_list;
56 }
57
58 void Clear() {
59 std::lock_guard<std::mutex> lock(_mutex);// 使用std::lock_guard自动管理互斥锁的锁定和解锁。
60 _list = std::make_shared<ListT>(); // 将_list重置为一个新的共享列表,清空所有之前的内容。
61 }
62
63 /// 返回指向列表的指针。
64 std::shared_ptr<const ListT> Load() const {
65 return _list.load();
66 }
67
68 private:
69
70 std::mutex _mutex;// 互斥量,用于保护对列表的修改
71
72 AtomicSharedPtr<const ListT> _list;// 原子共享指针,指向当前列表
73 };
74
75} // namespace detail
76} // namespace client
77} // namespace carla
auto begin() const noexcept
名称范围迭代支持
线程安全的原子智能指针封装类
std::shared_ptr< T > load() const noexcept
原子加载当前指针值
这个类用于禁止拷贝和移动构造函数及赋值操作
持有一个指向列表的原子指针。
Definition AtomicList.h:24
void DeleteByValue(const ValueT &value)
Definition AtomicList.h:48
void Push(ValueT &&value)
Definition AtomicList.h:31
void DeleteByIndex(size_t index)
Definition AtomicList.h:38
std::shared_ptr< const ListT > Load() const
返回指向列表的指针。
Definition AtomicList.h:64
AtomicSharedPtr< const ListT > _list
Definition AtomicList.h:72
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
包含CARLA客户端相关类和函数的命名空间。