From 64948ce4194b62a8d7c48e77cdbe71eae8de66f0 Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Tue, 6 Dec 2022 20:23:40 +0100 Subject: [PATCH] RUST: Add a way to get the content of a range in the database queue --- src/rust/liblektor-rs/src/database/queue.rs | 26 ++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/rust/liblektor-rs/src/database/queue.rs b/src/rust/liblektor-rs/src/database/queue.rs index ebaf41ae..10e40541 100644 --- a/src/rust/liblektor-rs/src/database/queue.rs +++ b/src/rust/liblektor-rs/src/database/queue.rs @@ -1,4 +1,8 @@ -use std::collections::VecDeque; +use std::{ + collections::VecDeque, + ops::{Index, Range}, + slice::SliceIndex, +}; /// The number of priority levels in the queues. The higher the number, the /// higher the priority. @@ -52,6 +56,12 @@ pub struct LktDatabaseQueueIter<'a> { index: usize, } +/// The iterator for a range of karas from the database queue. +pub struct LktDatabaseQueueRangeIter<'a> { + iterator: LktDatabaseQueueIter<'a>, + remaining: usize, +} + impl<'a> Iterator for LktDatabaseQueueIter<'a> { type Item = u64; @@ -123,4 +133,18 @@ impl LktDatabaseQueue { .find(|content| !content.is_empty())?; level.pop_front() } + + pub fn range(&self, range: Range<usize>) -> LktDatabaseQueueRangeIter { + let mut iter = self.iter(); + let remaining = range.end.checked_sub(range.start).unwrap_or(0); + if remaining >= 1 { + for _ in 0..range.start { + iter.next(); + } + } + LktDatabaseQueueRangeIter { + iterator: iter, + remaining, + } + } } -- GitLab