CARLA
载入中...
搜索中...
未找到
LibCarla
source
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
9
#include "
carla/AtomicSharedPtr.h
"
10
#include "
carla/NonCopyable.h
"
11
12
#include <algorithm>
13
#include <mutex>
14
#include <vector>
15
16
namespace
carla
{
17
namespace
client
{
18
namespace
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
begin
auto begin() const noexcept
名称范围迭代支持
Definition
ActorRegistry.h:92
AtomicSharedPtr.h
NonCopyable.h
carla::AtomicSharedPtr
线程安全的原子智能指针封装类
Definition
AtomicSharedPtr.h:26
carla::AtomicSharedPtr::load
std::shared_ptr< T > load() const noexcept
原子加载当前指针值
Definition
AtomicSharedPtr.h:79
carla::NonCopyable
这个类用于禁止拷贝和移动构造函数及赋值操作
Definition
LibCarla/source/carla/NonCopyable.h:12
carla::client::detail::AtomicList
持有一个指向列表的原子指针。
Definition
AtomicList.h:24
carla::client::detail::AtomicList::AtomicList
AtomicList()
Definition
AtomicList.h:28
carla::client::detail::AtomicList::DeleteByValue
void DeleteByValue(const ValueT &value)
Definition
AtomicList.h:48
carla::client::detail::AtomicList::_mutex
std::mutex _mutex
Definition
AtomicList.h:70
carla::client::detail::AtomicList::Push
void Push(ValueT &&value)
Definition
AtomicList.h:31
carla::client::detail::AtomicList::DeleteByIndex
void DeleteByIndex(size_t index)
Definition
AtomicList.h:38
carla::client::detail::AtomicList::Clear
void Clear()
Definition
AtomicList.h:58
carla::client::detail::AtomicList::Load
std::shared_ptr< const ListT > Load() const
返回指向列表的指针。
Definition
AtomicList.h:64
carla::client::detail::AtomicList::_list
AtomicSharedPtr< const ListT > _list
Definition
AtomicList.h:72
carla::client::detail::AtomicList::ListT
std::vector< T > ListT
Definition
AtomicList.h:25
carla
CARLA模拟器的主命名空间。
Definition
Carla.cpp:139
client
包含CARLA客户端相关类和函数的命名空间。
std
Definition
CarlaRecorderCollision.h:31
制作者
1.10.0