From f47323ee26c907b82aa43e6637fead85b1fcb47c Mon Sep 17 00:00:00 2001 From: Dong Li Date: Wed, 2 Aug 2017 08:20:47 -0700 Subject: [PATCH] added missing indexed_queue (#332) --- modules/planning/common/indexed_queue.h | 74 +++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 modules/planning/common/indexed_queue.h diff --git a/modules/planning/common/indexed_queue.h b/modules/planning/common/indexed_queue.h new file mode 100644 index 0000000000..93aa50b267 --- /dev/null +++ b/modules/planning/common/indexed_queue.h @@ -0,0 +1,74 @@ +/****************************************************************************** + * Copyright 2017 The Apollo Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ + +/** + * @file: + **/ + +#ifndef MODULES_PLANNING_COMMON_INDEXED_QUEUE_H_ +#define MODULES_PLANNING_COMMON_INDEXED_QUEUE_H_ + +#include +#include +#include + +namespace apollo { +namespace planning { + +template +class IndexedQueue { + public: + IndexedQueue(std::size_t max_queue_size) : max_queue_size_(max_queue_size){}; + T *Find(const I id) const { + auto iter = map_.find(id); + if (iter == map_.end()) { + return nullptr; + } else { + return iter->second.get(); + } + } + + const T *Latest() const { + if (queue_.empty()) { + return nullptr; + } + return Find(queue_.back().first); + } + + bool Add(const I id, std::unique_ptr ptr) { + if (Find(id)) { + return false; + } + if (!queue_.empty() && queue_.size() == max_queue_size_) { + const auto &front = queue_.top(); + map_.erase(front.first); + queue_.pop_front(); + } + queue_.push_back(std::make_pair(id, ptr.get())); + map_[id] = std::move(ptr); + return true; + } + + public: + std::size_t max_queue_size_ = 0; + std::queue> queue_; + std::unordered_map> map_; +}; + +} // namespace planning +} // namespace apollo + +#endif // MODULES_PLANNING_COMMON_DATA_CENTER_H_ -- GitLab