@@ -272,18 +272,56 @@ impl_index_and_const_new!(LinkedIndexU8, u8, new_u8, { u8::MAX as usize - 1 });
272
272
impl_index_and_const_new ! ( LinkedIndexU16 , u16 , new_u16, { u16 :: MAX as usize - 1 } ) ;
273
273
impl_index_and_const_new ! ( LinkedIndexUsize , usize , new_usize, { usize :: MAX - 1 } ) ;
274
274
275
+ mod as_view {
276
+ use super :: { SortedLinkedList , SortedLinkedListIndex , SortedLinkedListView } ;
277
+
278
+ pub trait AsView < T , Idx , K >
279
+ where
280
+ Idx : SortedLinkedListIndex ,
281
+ {
282
+ fn as_view ( & self ) -> & SortedLinkedListView < T , Idx , K > ;
283
+ fn as_mut_view ( & mut self ) -> & mut SortedLinkedListView < T , Idx , K > ;
284
+ }
285
+
286
+ impl < T , Idx , K > AsView < T , Idx , K > for SortedLinkedListView < T , Idx , K >
287
+ where
288
+ Idx : SortedLinkedListIndex ,
289
+ {
290
+ fn as_view ( & self ) -> & SortedLinkedListView < T , Idx , K > {
291
+ self
292
+ }
293
+
294
+ fn as_mut_view ( & mut self ) -> & mut SortedLinkedListView < T , Idx , K > {
295
+ self
296
+ }
297
+ }
298
+
299
+ impl < T , Idx , K , const N : usize > AsView < T , Idx , K > for SortedLinkedList < T , Idx , K , N >
300
+ where
301
+ Idx : SortedLinkedListIndex ,
302
+ {
303
+ fn as_view ( & self ) -> & SortedLinkedListView < T , Idx , K > {
304
+ self
305
+ }
306
+
307
+ fn as_mut_view ( & mut self ) -> & mut SortedLinkedListView < T , Idx , K > {
308
+ self
309
+ }
310
+ }
311
+ }
312
+
275
313
impl < T , Idx , K , const N : usize > SortedLinkedList < T , Idx , K , N >
276
314
where
277
315
Idx : SortedLinkedListIndex ,
278
316
{
279
317
/// Get a reference to the `SortedLinkedList`, erasing the `N` const-generic.
280
318
pub fn as_view ( & self ) -> & SortedLinkedListView < T , Idx , K > {
281
- self
319
+ as_view :: AsView :: as_view ( self )
282
320
}
283
321
284
322
/// Get a mutable reference to the `Vec`, erasing the `N` const-generic.
285
323
pub fn as_mut_view ( & mut self ) -> & mut SortedLinkedListView < T , Idx , K > {
286
- self
324
+ as_view :: AsView :: as_mut_view ( self )
287
325
}
288
326
}
289
327
@@ -537,11 +575,13 @@ where
537
575
}
538
576
}
539
577
540
- impl < T , Idx , K > SortedLinkedListView < T , Idx , K >
578
+ impl < T , Idx , K , S > SortedLinkedListInner < T , Idx , K , S >
541
579
where
542
580
T : Ord ,
543
581
Idx : SortedLinkedListIndex ,
544
582
K : Kind ,
583
+ S : SortedLinkedListStorage < T , Idx > + ?Sized ,
584
+ Self : as_view:: AsView < T , Idx , K > ,
545
585
{
546
586
/// Get an iterator over the sorted list.
547
587
///
@@ -554,15 +594,15 @@ where
554
594
/// ll.push(1).unwrap();
555
595
/// ll.push(2).unwrap();
556
596
///
557
- /// let mut iter = ll.as_view(). iter();
597
+ /// let mut iter = ll.iter();
558
598
///
559
599
/// assert_eq!(iter.next(), Some(&2));
560
600
/// assert_eq!(iter.next(), Some(&1));
561
601
/// assert_eq!(iter.next(), None);
562
602
/// ```
563
603
pub fn iter ( & self ) -> IterView < ' _ , T , Idx , K > {
564
604
IterView {
565
- list : self ,
605
+ list : as_view :: AsView :: as_view ( self ) ,
566
606
index : self . head ,
567
607
}
568
608
}
@@ -601,7 +641,7 @@ where
601
641
is_head : true ,
602
642
prev_index : Idx :: none ( ) ,
603
643
index : self . head ,
604
- list : self ,
644
+ list : as_view :: AsView :: as_mut_view ( self ) ,
605
645
maybe_changed : false ,
606
646
} ) ;
607
647
}
@@ -614,7 +654,7 @@ where
614
654
is_head : false ,
615
655
prev_index : unsafe { Idx :: new_unchecked ( current) } ,
616
656
index : unsafe { Idx :: new_unchecked ( next) } ,
617
- list : self ,
657
+ list : as_view :: AsView :: as_mut_view ( self ) ,
618
658
maybe_changed : false ,
619
659
} ) ;
620
660
}
@@ -824,11 +864,13 @@ where
824
864
// }
825
865
// }
826
866
827
- impl < T , Idx , K > fmt:: Debug for SortedLinkedListView < T , Idx , K >
867
+ impl < T , Idx , K , S > fmt:: Debug for SortedLinkedListInner < T , Idx , K , S >
828
868
where
829
869
T : Ord + core:: fmt:: Debug ,
830
870
Idx : SortedLinkedListIndex ,
831
871
K : Kind ,
872
+ S : ?Sized + SortedLinkedListStorage < T , Idx > ,
873
+ Self : as_view:: AsView < T , Idx , K > ,
832
874
{
833
875
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
834
876
f. debug_list ( ) . entries ( self . iter ( ) ) . finish ( )
@@ -942,22 +984,22 @@ mod tests {
942
984
ll. push ( 2 ) . unwrap ( ) ;
943
985
ll. push ( 3 ) . unwrap ( ) ;
944
986
945
- let mut find = ll. as_mut_view ( ) . find_mut ( |v| * v == 2 ) . unwrap ( ) ;
987
+ let mut find = ll. find_mut ( |v| * v == 2 ) . unwrap ( ) ;
946
988
947
989
* find += 1000 ;
948
990
find. finish ( ) ;
949
991
950
992
assert_eq ! ( ll. peek( ) . unwrap( ) , & 1002 ) ;
951
993
952
- let mut find = ll. as_mut_view ( ) . find_mut ( |v| * v == 3 ) . unwrap ( ) ;
994
+ let mut find = ll. find_mut ( |v| * v == 3 ) . unwrap ( ) ;
953
995
954
996
* find += 1000 ;
955
997
find. finish ( ) ;
956
998
957
999
assert_eq ! ( ll. peek( ) . unwrap( ) , & 1003 ) ;
958
1000
959
1001
// Remove largest element
960
- ll. as_mut_view ( ) . find_mut ( |v| * v == 1003 ) . unwrap ( ) . pop ( ) ;
1002
+ ll. find_mut ( |v| * v == 1003 ) . unwrap ( ) . pop ( ) ;
961
1003
962
1004
assert_eq ! ( ll. peek( ) . unwrap( ) , & 1002 ) ;
963
1005
}
@@ -977,7 +1019,7 @@ mod tests {
977
1019
let mut ll: SortedLinkedList < u32 , LinkedIndexUsize , Max , 3 > = SortedLinkedList :: new_usize ( ) ;
978
1020
ll. push ( 1 ) . unwrap ( ) ;
979
1021
980
- let mut find = ll. as_mut_view ( ) . find_mut ( |v| * v == 1 ) . unwrap ( ) ;
1022
+ let mut find = ll. find_mut ( |v| * v == 1 ) . unwrap ( ) ;
981
1023
982
1024
* find += 1000 ;
983
1025
find. finish ( ) ;
0 commit comments