From 81776db03af30e429fab11eac102068856fb5449 Mon Sep 17 00:00:00 2001 From: Arseny Smirnov Date: Wed, 7 Mar 2018 10:47:33 +0300 Subject: [PATCH] Enumerator: do not invalidate pointers to elements GitOrigin-RevId: 0d535d7052b9cb95365eff4bf35ddf30966ec90f --- td/telegram/files/FileManager.h | 3 +- tdutils/td/utils/Enumerator.h | 73 ++++++++------------------------- 2 files changed, 18 insertions(+), 58 deletions(-) diff --git a/td/telegram/files/FileManager.h b/td/telegram/files/FileManager.h index 4329eeb88..10f961c21 100644 --- a/td/telegram/files/FileManager.h +++ b/td/telegram/files/FileManager.h @@ -377,7 +377,8 @@ class FileManager : public FileLoadManager::Callback { FileIdInfo *get_file_id_info(FileId file_id); struct RemoteInfo { - FullRemoteFileLocation remote_; + // mutible is set to to enable changing access hash + mutable FullRemoteFileLocation remote_; FileId file_id_; bool operator==(const RemoteInfo &other) const { return this->remote_ == other.remote_; diff --git a/tdutils/td/utils/Enumerator.h b/tdutils/td/utils/Enumerator.h index ba78901be..cf7e578eb 100644 --- a/tdutils/td/utils/Enumerator.h +++ b/tdutils/td/utils/Enumerator.h @@ -10,7 +10,7 @@ #include "td/utils/logging.h" #include "td/utils/misc.h" -#include +#include #include namespace td { @@ -21,69 +21,28 @@ class Enumerator { using Key = int32; Key add(ValueT v) { - container_->set_zero_value(&v); - auto it = set_.lower_bound(Key{0}); - container_->set_zero_value(nullptr); - if (it != set_.end() && container_->get_value(*it) == v) { - return *it; + int32 next_id = narrow_cast(arr_.size() + 1); + bool was_inserted; + decltype(map_.begin()) it; + std::tie(it, was_inserted) = map_.insert(std::make_pair(std::move(v), next_id)); + if (was_inserted) { + arr_.push_back(&it->first); } - auto key = container_->add_value(std::move(v)); - set_.insert(it, key); - return key; + return it->second; } - ValueT &get(Key key) { - return container_->get_value(key); - } + //ValueT &get(Key key) { + //CHECK(key != 0); + //return *arr_[narrow_cast(key - 1)]; + //} const ValueT &get(Key key) const { - return container_->get_value(key); + CHECK(key != 0); + return *arr_[narrow_cast(key - 1)]; } private: - class Container { - public: - bool compare(Key a, Key b) const { - return get_value(a) < get_value(b); - } - const ValueT &get_value(Key key) const { - if (key == 0) { - CHECK(zero_value_); - return *zero_value_; - } - size_t pos = narrow_cast(key - 1); - CHECK(pos < values_.size()); - return values_[pos]; - } - ValueT &get_value(Key key) { - return const_cast(const_cast(this)->get_value(key)); - } - void set_zero_value(ValueT *value) { - zero_value_ = value; - } - Key add_value(ValueT &&value) { - values_.push_back(std::move(value)); - return narrow_cast(values_.size()); - } - - private: - std::vector values_; - ValueT *zero_value_ = nullptr; - }; - - class Comparator { - public: - explicit Comparator(Container *container) : container_(container) { - } - bool operator()(Key a, Key b) const { - return container_->compare(a, b); - } - - private: - Container *container_; - }; - - std::unique_ptr container_{std::make_unique()}; - std::set set_{Comparator{container_.get()}}; + std::map map_; + std::vector arr_; }; } // namespace td