diff options
author | aunsane <aunsane@gmail.com> | 2018-04-27 21:33:17 +0300 |
---|---|---|
committer | aunsane <aunsane@gmail.com> | 2018-04-27 21:33:17 +0300 |
commit | e1ec72eab6d00b3ba38e5932bc88920f103b6e4a (patch) | |
tree | 999de2725a83e30fbbf6576200525d4ef0c5fe38 /protocols/Telegram/tdlib/td/tdutils/td/utils/Hints.h | |
parent | b9ce1d4d98525490ca1a38e2d9fd4f3369adb3e0 (diff) |
Telegram: initial commit
- tdlib moved to telegram dir
Diffstat (limited to 'protocols/Telegram/tdlib/td/tdutils/td/utils/Hints.h')
-rw-r--r-- | protocols/Telegram/tdlib/td/tdutils/td/utils/Hints.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/protocols/Telegram/tdlib/td/tdutils/td/utils/Hints.h b/protocols/Telegram/tdlib/td/tdutils/td/utils/Hints.h new file mode 100644 index 0000000000..645896684a --- /dev/null +++ b/protocols/Telegram/tdlib/td/tdutils/td/utils/Hints.h @@ -0,0 +1,76 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#pragma once + +#include "td/utils/common.h" +#include "td/utils/Slice.h" + +#include <map> +#include <unordered_map> +#include <utility> + +namespace td { + +// TODO template KeyT +class Hints { + using KeyT = int64; + using RatingT = int64; + + public: + void add(KeyT key, Slice name); + + void remove(KeyT key) { + add(key, ""); + } + + void set_rating(KeyT key, RatingT rating); + + std::pair<size_t, vector<KeyT>> search( + Slice query, int32 limit, + bool return_all_for_empty_query = false) const; // TODO sort by name instead of sort by rating + + bool has_key(KeyT key) const; + + string key_to_string(KeyT key) const; + + std::pair<size_t, vector<KeyT>> search_empty(int32 limit) const; // == search("", limit, true) + + size_t size() const; + + private: + std::map<string, vector<KeyT>> word_to_keys_; + std::unordered_map<KeyT, string> key_to_name_; + std::unordered_map<KeyT, RatingT> key_to_rating_; + + static vector<string> get_words(Slice name); + + vector<KeyT> search_word(const string &word) const; + + class CompareByRating { + const std::unordered_map<KeyT, RatingT> &key_to_rating_; + + RatingT get_rating(const KeyT &key) const { + auto it = key_to_rating_.find(key); + if (it == key_to_rating_.end()) { + return RatingT(); + } + return it->second; + } + + public: + explicit CompareByRating(const std::unordered_map<KeyT, RatingT> &key_to_rating) : key_to_rating_(key_to_rating) { + } + + bool operator()(const KeyT &lhs, const KeyT &rhs) const { + auto lhs_rating = get_rating(lhs); + auto rhs_rating = get_rating(rhs); + return lhs_rating < rhs_rating || (lhs_rating == rhs_rating && lhs < rhs); + } + }; +}; + +} // namespace td |