概述
IndexedQueue类是apollo planning模块下modules\planning\common\indexed_queue.h实现,代码比较简单,功能一眼比较明晰,代码不做详细解析,仅介绍每个函数作用。
从类名来看,应该是索引队列类?
从代码来看IndexedQueue类主要是实现:
看其数据成员很容易发现,一共3个
容量capacity_
队列queue_
id和队列里每个对象的映射map map_
其实该类就是实现一个队列,储存某一类型的数据对象的队列,可以设置队列的长度,同时储存id和队列里每个对象的映射map,然后可以根据id查询相应的数据对象,返回队列里的最后一个即最新的对象,在类map里增加一对(id,对象)映射数据,清空队列等。
也是个通用的小工具,就是实现了一个更高级的队列?可以用id去查询相应的对象
indexed_queue.h
#pragma once
#include <memory>
#include <queue>
#include <unordered_map>
#include <utility>
#include "modules/common/util/map_util.h"
namespace apollo {
namespace planning {
//模板类
template <typename I, typename T>
class IndexedQueue {
public:
//初始化索引队列的容量,用0代表无穷大?
explicit IndexedQueue(size_t capacity) : capacity_(capacity) {}
//根据id查询相应的对象
const T *Find(const I id) const {
auto *result = apollo::common::util::FindOrNull(map_, id);
return result ? result->get() : nullptr;
}
//返回队列里的最后一个对象,即最新的对象
const T *Latest() const {
if (queue_.empty()) {
return nullptr;
}
return Find(queue_.back().first);
}
//在类map里增加一对(id,对象)映射数据
bool Add(const I id, std::unique_ptr<T> ptr) {
if (Find(id)) {
return false;
}
if (capacity_ > 0 && queue_.size() == capacity_) {
map_.erase(queue_.front().first);
queue_.pop();
}
queue_.emplace(id, ptr.get());
map_[id] = std::move(ptr);
return true;
}
//清空队列?
void Clear() {
while (!queue_.empty()) {
queue_.pop();
}
map_.clear();
}
public:
size_t capacity_ = 0;
std::queue<std::pair<I, const T *>> queue_;
std::unordered_map<I, std::unique_ptr<T>> map_;
};
} // namespace planning
} // namespace apollo