Simplify set_dialog_is_pinned implementation.

This commit is contained in:
levlam 2023-10-01 21:49:15 +03:00
parent c474942666
commit ceaa37fe0d
2 changed files with 24 additions and 28 deletions

View File

@ -15119,35 +15119,31 @@ bool MessagesManager::set_dialog_is_pinned(DialogListId dialog_list_id, Dialog *
if (!list->are_pinned_dialogs_inited_) { if (!list->are_pinned_dialogs_inited_) {
return false; return false;
} }
bool was_pinned = false; auto dialog_id = d->dialog_id;
for (size_t pos = 0; pos < list->pinned_dialogs_.size(); pos++) { auto is_changed_dialog = [dialog_id](const DialogDate &dialog_date) {
auto &pinned_dialog = list->pinned_dialogs_[pos]; return dialog_date.get_dialog_id() == dialog_id;
if (pinned_dialog.get_dialog_id() == d->dialog_id) { };
// the dialog was already pinned if (is_pinned) {
if (is_pinned) { if (!list->pinned_dialogs_.empty() && is_changed_dialog(list->pinned_dialogs_[0])) {
if (pos == 0) {
return false;
}
auto order = get_next_pinned_dialog_order();
pinned_dialog = DialogDate(order, d->dialog_id);
std::rotate(list->pinned_dialogs_.begin(), list->pinned_dialogs_.begin() + pos,
list->pinned_dialogs_.begin() + pos + 1);
list->pinned_dialog_id_orders_[d->dialog_id] = order;
} else {
list->pinned_dialogs_.erase(list->pinned_dialogs_.begin() + pos);
list->pinned_dialog_id_orders_.erase(d->dialog_id);
}
was_pinned = true;
break;
}
}
if (!was_pinned) {
if (!is_pinned) {
return false; return false;
} }
auto order = get_next_pinned_dialog_order(); auto order = get_next_pinned_dialog_order();
list->pinned_dialogs_.insert(list->pinned_dialogs_.begin(), {order, d->dialog_id}); DialogDate dialog_date(order, dialog_id);
list->pinned_dialog_id_orders_.emplace(d->dialog_id, order); add_to_top_if(list->pinned_dialogs_, list->pinned_dialogs_.size() + 1, dialog_date, is_changed_dialog);
auto it = list->pinned_dialog_id_orders_.find(dialog_id);
if (it != list->pinned_dialog_id_orders_.end()) {
CHECK(list->pinned_dialogs_[0] != dialog_date);
list->pinned_dialogs_[0] = dialog_date;
it->second = order;
} else {
CHECK(list->pinned_dialogs_[0] == dialog_date);
list->pinned_dialog_id_orders_.emplace(dialog_id, order);
}
} else {
if (!td::remove_if(list->pinned_dialogs_, is_changed_dialog)) {
return false;
}
list->pinned_dialog_id_orders_.erase(dialog_id);
} }
LOG(INFO) << "Set " << d->dialog_id << " is pinned in " << dialog_list_id << " to " << is_pinned; LOG(INFO) << "Set " << d->dialog_id << " is pinned in " << dialog_list_id << " to " << is_pinned;

View File

@ -98,7 +98,7 @@ void add_to_top(V &v, size_t max_size, T value) {
} }
if (i == size) { if (i == size) {
if (size < max_size || i == 0) { if (size < max_size || i == 0) {
v.emplace_back(); v.emplace_back(value);
} else { } else {
i--; i--;
} }
@ -122,7 +122,7 @@ void add_to_top_if(V &v, size_t max_size, T value, const F &is_equal_to_value) {
} }
if (i == size) { if (i == size) {
if (size < max_size || i == 0) { if (size < max_size || i == 0) {
v.emplace_back(); v.emplace_back(value);
} else { } else {
i--; i--;
} }