diff --git a/a8/commonrank.h b/a8/commonrank.h new file mode 100644 index 0000000..67e671b --- /dev/null +++ b/a8/commonrank.h @@ -0,0 +1,99 @@ +#ifndef A8_COMMONRANK_H +#define A8_COMONRANK_H + +#include + +namespace a8 +{ + + template + class CommonRank + { + private: + std::vector list_; + std::set set_; + std::function cmp_func_; + size_t max_num_ = 0; + + public: + + CommonRank() {} + CommonRank(std::function cmp_func, size_t max_num) + { + cmp_func_ = cmp_func; + max_num_ = max_num; + } + + size_t Size() + { + return list_.size(); + } + + const std::vector& GetList() + { + return list_; + } + + void Sort() + { + std::sort(list_.begin(), list_.end(), cmp_func_); + } + + void Update(T* val) + { + if (Size() < max_num_) { + if (!Exists(val)) { + list_.push_back(val); + set_.insert(val); + Sort(); + } + } else { + if (cmp_func_(val, list_[list_.size() - 1])) { + if (!Exists(val)) { + set_.erase(list_[list_.size() - 1]); + list_[list_.size() - 1] = val; + set_.insert(val); + Sort(); + } + } + } + } + + bool Exists(T* val) + { + return set_.find(val) != set_.end(); + } + + }; + + template + a8::CommonRank& ForceCreateCommonRankList(std::map>& rank_list, + long long key, + std::function cmp_func, + size_t max_num) + { + auto itr = rank_list.find(key); + if (itr != rank_list.end()) { + return itr->second; + } + rank_list[key] = a8::CommonRank(cmp_func, max_num); + return rank_list[key]; + } + + template + static a8::CommonRank& ForceCreateCommonRankList(std::map>& rank_list, + const std::string& key, + std::function cmp_func, + size_t max_num) + { + auto itr = rank_list.find(key); + if (itr != rank_list.end()) { + return itr->second; + } + rank_list[key] = a8::CommonRank(cmp_func, max_num); + return rank_list[key]; + } + +} + +#endif