Improve OrderedMessages::erase.
This commit is contained in:
parent
28b742e7d3
commit
b8cd0bb597
@ -16330,10 +16330,6 @@ unique_ptr<MessagesManager::Message> MessagesManager::do_delete_message(Dialog *
|
|||||||
<< d->being_deleted_message_id << " " << message_id << " " << source;
|
<< d->being_deleted_message_id << " " << message_id << " " << source;
|
||||||
d->being_deleted_message_id = message_id;
|
d->being_deleted_message_id = message_id;
|
||||||
|
|
||||||
const auto message_it = d->ordered_messages.get_iterator(message_id);
|
|
||||||
CHECK(*message_it != nullptr);
|
|
||||||
CHECK((*message_it)->get_message_id() == message_id);
|
|
||||||
|
|
||||||
bool need_get_history = false;
|
bool need_get_history = false;
|
||||||
if (!only_from_memory) {
|
if (!only_from_memory) {
|
||||||
LOG(INFO) << "Deleting " << full_message_id << " from " << source;
|
LOG(INFO) << "Deleting " << full_message_id << " from " << source;
|
||||||
@ -16343,6 +16339,10 @@ unique_ptr<MessagesManager::Message> MessagesManager::do_delete_message(Dialog *
|
|||||||
delete_active_live_location(d->dialog_id, m);
|
delete_active_live_location(d->dialog_id, m);
|
||||||
remove_message_file_sources(d->dialog_id, m);
|
remove_message_file_sources(d->dialog_id, m);
|
||||||
|
|
||||||
|
const auto message_it = d->ordered_messages.get_const_iterator(message_id);
|
||||||
|
CHECK(*message_it != nullptr);
|
||||||
|
CHECK((*message_it)->get_message_id() == message_id);
|
||||||
|
|
||||||
if (message_id == d->last_message_id) {
|
if (message_id == d->last_message_id) {
|
||||||
if ((*message_it)->have_previous_) {
|
if ((*message_it)->have_previous_) {
|
||||||
auto it = message_it;
|
auto it = message_it;
|
||||||
@ -16438,33 +16438,11 @@ unique_ptr<MessagesManager::Message> MessagesManager::do_delete_message(Dialog *
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*message_it)->have_previous_ && (only_from_memory || !(*message_it)->have_next_)) {
|
|
||||||
auto it = message_it;
|
|
||||||
--it;
|
|
||||||
OrderedMessage *prev_m = *it;
|
|
||||||
if (prev_m != nullptr) {
|
|
||||||
prev_m->have_next_ = false;
|
|
||||||
} else {
|
|
||||||
LOG(ERROR) << "Have have_previous is true, but there is no previous for " << full_message_id << " from "
|
|
||||||
<< source;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((*message_it)->have_next_ && (only_from_memory || !(*message_it)->have_previous_)) {
|
|
||||||
auto it = message_it;
|
|
||||||
++it;
|
|
||||||
OrderedMessage *next_m = *it;
|
|
||||||
if (next_m != nullptr) {
|
|
||||||
next_m->have_previous_ = false;
|
|
||||||
} else {
|
|
||||||
LOG(ERROR) << "Have have_next is true, but there is no next for " << full_message_id << " from " << source;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
auto result = std::move(d->messages[message_id]);
|
auto result = std::move(d->messages[message_id]);
|
||||||
CHECK(m == result.get());
|
CHECK(m == result.get());
|
||||||
d->messages.erase(message_id);
|
d->messages.erase(message_id);
|
||||||
|
|
||||||
d->ordered_messages.erase(message_id);
|
d->ordered_messages.erase(message_id, only_from_memory);
|
||||||
|
|
||||||
d->being_deleted_message_id = MessageId();
|
d->being_deleted_message_id = MessageId();
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ void OrderedMessages::insert(MessageId message_id, bool was_auto_attached, bool
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OrderedMessages::erase(MessageId message_id) {
|
void OrderedMessages::erase(MessageId message_id, bool only_from_memory) {
|
||||||
unique_ptr<OrderedMessage> *v = &messages_;
|
unique_ptr<OrderedMessage> *v = &messages_;
|
||||||
while (*v != nullptr) {
|
while (*v != nullptr) {
|
||||||
if ((*v)->message_id_.get() < message_id.get()) {
|
if ((*v)->message_id_.get() < message_id.get()) {
|
||||||
@ -71,8 +71,25 @@ void OrderedMessages::erase(MessageId message_id) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CHECK(*v != nullptr);
|
||||||
|
if ((*v)->have_previous_ && (only_from_memory || !(*v)->have_next_)) {
|
||||||
|
Iterator it(messages_.get(), message_id);
|
||||||
|
CHECK(*it == v->get());
|
||||||
|
--it;
|
||||||
|
OrderedMessage *prev_m = *it;
|
||||||
|
CHECK(prev_m != nullptr);
|
||||||
|
prev_m->have_next_ = false;
|
||||||
|
}
|
||||||
|
if ((*v)->have_next_ && (only_from_memory || !(*v)->have_previous_)) {
|
||||||
|
Iterator it(messages_.get(), message_id);
|
||||||
|
CHECK(*it == v->get());
|
||||||
|
++it;
|
||||||
|
OrderedMessage *next_m = *it;
|
||||||
|
CHECK(next_m != nullptr);
|
||||||
|
next_m->have_previous_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
unique_ptr<OrderedMessage> result = std::move(*v);
|
unique_ptr<OrderedMessage> result = std::move(*v);
|
||||||
CHECK(result != nullptr);
|
|
||||||
unique_ptr<OrderedMessage> left = std::move(result->left_);
|
unique_ptr<OrderedMessage> left = std::move(result->left_);
|
||||||
unique_ptr<OrderedMessage> right = std::move(result->right_);
|
unique_ptr<OrderedMessage> right = std::move(result->right_);
|
||||||
|
|
||||||
|
@ -171,7 +171,7 @@ class OrderedMessages {
|
|||||||
|
|
||||||
void insert(MessageId message_id, bool was_auto_attached, bool have_previous, bool have_next);
|
void insert(MessageId message_id, bool was_auto_attached, bool have_previous, bool have_next);
|
||||||
|
|
||||||
void erase(MessageId message_id);
|
void erase(MessageId message_id, bool only_from_memory);
|
||||||
|
|
||||||
struct AttachInfo {
|
struct AttachInfo {
|
||||||
bool have_previous_ = false;
|
bool have_previous_ = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user