summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/tdutils/td/utils/Hints.h
diff options
context:
space:
mode:
authoraunsane <aunsane@gmail.com>2018-04-27 21:33:17 +0300
committeraunsane <aunsane@gmail.com>2018-04-27 21:33:17 +0300
commite1ec72eab6d00b3ba38e5932bc88920f103b6e4a (patch)
tree999de2725a83e30fbbf6576200525d4ef0c5fe38 /protocols/Telegram/tdlib/td/tdutils/td/utils/Hints.h
parentb9ce1d4d98525490ca1a38e2d9fd4f3369adb3e0 (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.h76
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