Rewrite & optimize LimitedQueue (#3798)

* Use circular buffer for LimitedQueue

* Reduce copying of snapshot

* Small optimizations

* Remove unneeded lock statements

* Add LimitedQueue tests

* Fix includes for limited queue benchmark

* Update CHANGELOG.md

* Use correct boost version iterators

* Use a shared_mutex to clarify reads and writes

* Update `find`/`rfind` to return the result as a boost::optional

* Use `[[nodiscard]]` where applicable

* Update comments

* Add a couple more doc comments

* Replace size with get

get is a safe (locked & checked) version of at

* Use std::vector in LimitedQueueSnapshot

* Update LimitedQueue benchmarks

* Add mutex guard to buffer accessors

We do not know whether T is an atomic type or not
so we can't safely say that we can copy the value
at a certain address of the buffer.

See https://stackoverflow.com/a/2252478

* Update doc comments, add first/last getters

* Make limit_ const

* Omit `else` if the if-case always returns

* Title case category comments

* Remove `at`

* Fix `get` comment

* Privatize/comment/lock property accessors

 - `limit` is now private
 - `space` is now private
 - `full` has been removed
 - `empty` now locks

* Remove `front` function

* Remove `back` method

* Add comment to `first`

* Add comment to `last`

Co-authored-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
This commit is contained in:
Daniel Sage
2022-06-18 06:44:48 -04:00
committed by GitHub
parent f3f340335f
commit 81caf1aae0
12 changed files with 576 additions and 341 deletions
+9 -12
View File
@@ -246,23 +246,20 @@ void Channel::deleteMessage(QString messageID)
msg->flags.set(MessageFlag::Disabled);
}
}
MessagePtr Channel::findMessage(QString messageID)
{
LimitedQueueSnapshot<MessagePtr> snapshot = this->getMessageSnapshot();
int snapshotLength = snapshot.size();
MessagePtr res;
int end = std::max(0, snapshotLength - 200);
for (int i = snapshotLength - 1; i >= end; --i)
if (auto msg = this->messages_.rfind([&messageID](const MessagePtr &msg) {
return msg->id == messageID;
});
msg)
{
auto &s = snapshot[i];
if (s->id == messageID)
{
return s;
}
res = *msg;
}
return nullptr;
return res;
}
bool Channel::canSendMessage() const