@@ -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 ( ) ;
0 commit comments