Skip to content

Commit a5b1af8

Browse files
committed
Added ability to extract subsequences
1 parent 47801d3 commit a5b1af8

4 files changed

Lines changed: 152 additions & 0 deletions

File tree

src/sorted_vec/sorted_vec.rs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,37 @@ impl<TKey: Ord, TValue: EntityWithKey<TKey>> SortedVec<TKey, TValue> {
141141
}
142142
}
143143

144+
pub fn sub_sequence(&self, range: std::ops::Range<TKey>) -> Self
145+
where
146+
TValue: Clone,
147+
{
148+
let items = self.range(range).to_vec();
149+
Self {
150+
items,
151+
itm: std::marker::PhantomData,
152+
}
153+
}
154+
155+
pub fn sub_sequence_by_index(&self, range: std::ops::Range<usize>) -> Self
156+
where
157+
TValue: Clone,
158+
{
159+
if range.start >= self.items.len() {
160+
return Self::new();
161+
}
162+
163+
let end = range.end.min(self.items.len());
164+
if range.start >= end {
165+
return Self::new();
166+
}
167+
168+
let items = self.items[range.start..end].to_vec();
169+
Self {
170+
items,
171+
itm: std::marker::PhantomData,
172+
}
173+
}
174+
144175
pub fn get_from_key_to_up(&self, key: &TKey) -> &[TValue] {
145176
let result = self.items.binary_search_by(|itm| itm.get_key().cmp(key));
146177

@@ -403,6 +434,47 @@ mod tests {
403434
);
404435
}
405436

437+
#[test]
438+
fn test_sub_sequence() {
439+
let mut vec = super::SortedVec::new();
440+
441+
vec.insert_or_replace(TestEntity { key: 1, value: 1 });
442+
vec.insert_or_replace(TestEntity { key: 3, value: 3 });
443+
vec.insert_or_replace(TestEntity { key: 4, value: 4 });
444+
vec.insert_or_replace(TestEntity { key: 6, value: 6 });
445+
vec.insert_or_replace(TestEntity { key: 7, value: 7 });
446+
447+
let sub = vec.sub_sequence(2..7);
448+
449+
assert_eq!(4, sub.len());
450+
assert_eq!(
451+
vec![3u8, 4u8, 6u8, 7u8],
452+
sub.iter().map(|itm| itm.value).collect::<Vec<u8>>()
453+
);
454+
}
455+
456+
#[test]
457+
fn test_sub_sequence_by_index() {
458+
let mut vec = super::SortedVec::new();
459+
460+
vec.insert_or_replace(TestEntity { key: 1, value: 1 });
461+
vec.insert_or_replace(TestEntity { key: 3, value: 3 });
462+
vec.insert_or_replace(TestEntity { key: 4, value: 4 });
463+
vec.insert_or_replace(TestEntity { key: 6, value: 6 });
464+
vec.insert_or_replace(TestEntity { key: 7, value: 7 });
465+
466+
let sub = vec.sub_sequence_by_index(1..4);
467+
468+
assert_eq!(3, sub.len());
469+
assert_eq!(
470+
vec![3u8, 4u8, 6u8],
471+
sub.iter().map(|itm| itm.value).collect::<Vec<u8>>()
472+
);
473+
474+
let empty = vec.sub_sequence_by_index(10..20);
475+
assert_eq!(0, empty.len());
476+
}
477+
406478
#[test]
407479
fn test_get_highest_and_amount() {
408480
let mut vec = super::SortedVec::new();

src/sorted_vec/sorted_vec_of_arc.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,37 @@ impl<TKey: Ord, TValue: EntityWithKey<TKey>> SortedVecOfArc<TKey, TValue> {
153153
}
154154
}
155155

156+
pub fn sub_sequence(&self, range: std::ops::Range<TKey>) -> Self
157+
where
158+
TValue: Clone,
159+
{
160+
let items = self.range(range).to_vec();
161+
Self {
162+
items,
163+
itm: std::marker::PhantomData,
164+
}
165+
}
166+
167+
pub fn sub_sequence_by_index(&self, range: std::ops::Range<usize>) -> Self
168+
where
169+
TValue: Clone,
170+
{
171+
if range.start >= self.items.len() {
172+
return Self::new();
173+
}
174+
175+
let end = range.end.min(self.items.len());
176+
if range.start >= end {
177+
return Self::new();
178+
}
179+
180+
let items = self.items[range.start..end].to_vec();
181+
Self {
182+
items,
183+
itm: std::marker::PhantomData,
184+
}
185+
}
186+
156187
pub fn truncate_capacity(&mut self, capacity: usize) {
157188
self.items.truncate(capacity);
158189
}

src/sorted_vec/sorted_vec_of_arc_with_str_key.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,31 @@ impl<TValue: EntityWithStrKey> SortedVecOfArcWithStrKey<TValue> {
180180
self.items.is_empty()
181181
}
182182

183+
pub fn sub_sequence(&self, range: std::ops::Range<&str>) -> Self
184+
where
185+
TValue: Clone,
186+
{
187+
let items = self.range(range).to_vec();
188+
Self { items }
189+
}
190+
191+
pub fn sub_sequence_by_index(&self, range: std::ops::Range<usize>) -> Self
192+
where
193+
TValue: Clone,
194+
{
195+
if range.start >= self.items.len() {
196+
return Self::new();
197+
}
198+
199+
let end = range.end.min(self.items.len());
200+
if range.start >= end {
201+
return Self::new();
202+
}
203+
204+
let items = self.items[range.start..end].to_vec();
205+
Self { items }
206+
}
207+
183208
pub fn range(&self, range: std::ops::Range<&str>) -> &[Arc<TValue>] {
184209
let index_from = self
185210
.items

src/sorted_vec/sorted_vec_with_str_key.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,30 @@ impl<TValue: EntityWithStrKey> SortedVecWithStrKey<TValue> {
143143
Err(index) => &self.items[..index],
144144
}
145145
}
146+
pub fn sub_sequence(&self, range: std::ops::Range<&str>) -> Self
147+
where
148+
TValue: Clone,
149+
{
150+
let items = self.range(range).to_vec();
151+
Self { items }
152+
}
153+
154+
pub fn sub_sequence_by_index(&self, range: std::ops::Range<usize>) -> Self
155+
where
156+
TValue: Clone,
157+
{
158+
if range.start >= self.items.len() {
159+
return Self::new();
160+
}
161+
162+
let end = range.end.min(self.items.len());
163+
if range.start >= end {
164+
return Self::new();
165+
}
166+
167+
let items = self.items[range.start..end].to_vec();
168+
Self { items }
169+
}
146170

147171
pub fn remove(&mut self, key: &str) -> Option<TValue> {
148172
let result = self.items.binary_search_by(|itm| itm.get_key().cmp(key));

0 commit comments

Comments
 (0)