@@ -136,26 +136,12 @@ where
136
136
}
137
137
138
138
#[ unstable( feature = "trusted_len" , issue = "37572" ) ]
139
- unsafe impl < T , I , F , const N : usize > TrustedLen for FlatMap < I , [ T ; N ] , F >
139
+ unsafe impl < I , U , F > TrustedLen for FlatMap < I , U , F >
140
140
where
141
- I : TrustedLen ,
142
- F : FnMut ( I :: Item ) -> [ T ; N ] ,
143
- {
144
- }
145
-
146
- #[ unstable( feature = "trusted_len" , issue = "37572" ) ]
147
- unsafe impl < ' a , T , I , F , const N : usize > TrustedLen for FlatMap < I , & ' a [ T ; N ] , F >
148
- where
149
- I : TrustedLen ,
150
- F : FnMut ( I :: Item ) -> & ' a [ T ; N ] ,
151
- {
152
- }
153
-
154
- #[ unstable( feature = "trusted_len" , issue = "37572" ) ]
155
- unsafe impl < ' a , T , I , F , const N : usize > TrustedLen for FlatMap < I , & ' a mut [ T ; N ] , F >
156
- where
157
- I : TrustedLen ,
158
- F : FnMut ( I :: Item ) -> & ' a mut [ T ; N ] ,
141
+ I : Iterator ,
142
+ U : IntoIterator ,
143
+ F : FnMut ( I :: Item ) -> U ,
144
+ FlattenCompat < Map < I , F > , <U as IntoIterator >:: IntoIter > : TrustedLen ,
159
145
{
160
146
}
161
147
@@ -298,8 +284,8 @@ where
298
284
#[ unstable( feature = "trusted_len" , issue = "37572" ) ]
299
285
unsafe impl < I > TrustedLen for Flatten < I >
300
286
where
301
- I : TrustedLen ,
302
- < I as Iterator >:: Item : TrustedConstSize ,
287
+ I : Iterator < Item : IntoIterator > ,
288
+ FlattenCompat < I , < I :: Item as IntoIterator >:: IntoIter > : TrustedLen ,
303
289
{
304
290
}
305
291
@@ -660,6 +646,27 @@ where
660
646
}
661
647
}
662
648
649
+ unsafe impl < const N : usize , I , T > TrustedLen
650
+ for FlattenCompat < I , <[ T ; N ] as IntoIterator >:: IntoIter >
651
+ where
652
+ I : TrustedLen < Item = [ T ; N ] > ,
653
+ {
654
+ }
655
+
656
+ unsafe impl < ' a , const N : usize , I , T > TrustedLen
657
+ for FlattenCompat < I , <& ' a [ T ; N ] as IntoIterator >:: IntoIter >
658
+ where
659
+ I : TrustedLen < Item = & ' a [ T ; N ] > ,
660
+ {
661
+ }
662
+
663
+ unsafe impl < ' a , const N : usize , I , T > TrustedLen
664
+ for FlattenCompat < I , <& ' a mut [ T ; N ] as IntoIterator >:: IntoIter >
665
+ where
666
+ I : TrustedLen < Item = & ' a mut [ T ; N ] > ,
667
+ {
668
+ }
669
+
663
670
trait ConstSizeIntoIterator : IntoIterator {
664
671
// FIXME(#31844): convert to an associated const once specialization supports that
665
672
fn size ( ) -> Option < usize > ;
@@ -696,19 +703,6 @@ impl<T, const N: usize> ConstSizeIntoIterator for &mut [T; N] {
696
703
}
697
704
}
698
705
699
- #[ doc( hidden) ]
700
- #[ unstable( feature = "std_internals" , issue = "none" ) ]
701
- // FIXME(#20400): Instead of this helper trait there should be multiple impl TrustedLen for Flatten<>
702
- // blocks with different bounds on Iterator::Item but the compiler erroneously considers them overlapping
703
- pub unsafe trait TrustedConstSize : IntoIterator { }
704
-
705
- #[ unstable( feature = "std_internals" , issue = "none" ) ]
706
- unsafe impl < T , const N : usize > TrustedConstSize for [ T ; N ] { }
707
- #[ unstable( feature = "std_internals" , issue = "none" ) ]
708
- unsafe impl < T , const N : usize > TrustedConstSize for & ' _ [ T ; N ] { }
709
- #[ unstable( feature = "std_internals" , issue = "none" ) ]
710
- unsafe impl < T , const N : usize > TrustedConstSize for & ' _ mut [ T ; N ] { }
711
-
712
706
#[ inline]
713
707
fn and_then_or_clear < T , U > ( opt : & mut Option < T > , f : impl FnOnce ( & mut T ) -> Option < U > ) -> Option < U > {
714
708
let x = f ( opt. as_mut ( ) ?) ;
0 commit comments