22#include "etlng/Models.hpp"
23#include "util/Mutex.hpp"
32namespace etlng::impl {
38 return lhs.seq > rhs.seq;
48 std::uint32_t increment_;
51 std::uint32_t expectedSequence;
52 std::priority_queue<model::LedgerData, std::vector<model::LedgerData>,
ReverseOrderComparator> forwardLoadQueue;
54 Data(std::uint32_t seq) : expectedSequence(seq)
63 std::uint32_t startSeq = 0u;
64 std::uint32_t increment = 1u;
65 std::optional<std::size_t> limit = std::nullopt;
73 : limit_(settings.limit.value_or(0uz)), increment_(settings.increment), data_(settings.startSeq)
87 auto lock = data_.
lock();
89 if (limit_ == 0uz or lock->forwardLoadQueue.size() < limit_) {
90 lock->forwardLoadQueue.push(std::move(item));
102 [[nodiscard]] std::optional<model::LedgerData>
105 auto lock = data_.
lock();
106 std::optional<model::LedgerData> out;
108 if (not lock->forwardLoadQueue.empty() && lock->forwardLoadQueue.top().seq == lock->expectedSequence) {
109 out.emplace(lock->forwardLoadQueue.top());
110 lock->forwardLoadQueue.pop();
111 lock->expectedSequence += increment_;
126 return data_.
lock()->forwardLoadQueue.empty();
A wrapper for std::priority_queue that serialises operations using a mutex.
Definition TaskQueue.hpp:46
bool enqueue(model::LedgerData item)
Enqueue a new item onto the queue if space is available.
Definition TaskQueue.hpp:85
bool empty()
Check if the queue is empty.
Definition TaskQueue.hpp:124
std::optional< model::LedgerData > dequeue()
Dequeue the next available item out of the queue.
Definition TaskQueue.hpp:103
TaskQueue(Settings settings)
Construct a new priority queue.
Definition TaskQueue.hpp:72
A container for data that is protected by a mutex. Inspired by Mutex in Rust.
Definition Mutex.hpp:96
Lock< ProtectedDataType const, LockType, MutexType > lock() const
Lock the mutex and get a lock object allowing access to the protected data.
Definition Mutex.hpp:134
Definition TaskQueue.hpp:34
Definition TaskQueue.hpp:62
Represents an entire ledger diff worth of transactions and objects.
Definition Models.hpp:143