@@ -694,8 +694,8 @@ mod cast_from_raw {
694
694
/// `Src`'s alignment must not be smaller than `Dst`'s alignment.
695
695
#[ derive( Copy , Clone ) ]
696
696
struct CastParams {
697
- offset_delta_elems : usize ,
698
- elem_multiple : usize ,
697
+ offset_delta_elems : Fraction ,
698
+ elem_multiple : Fraction ,
699
699
}
700
700
701
701
impl CastParams {
@@ -718,32 +718,41 @@ mod cast_from_raw {
718
718
return None ;
719
719
} ;
720
720
721
+ // TODO: When doing size-lossy casts, we can permit ZST trailing
722
+ // slice elements in the destination type, although we'd need to
723
+ // think carefully about what we promise about the metadata.
721
724
let dst_elem_size = if let Some ( e) = NonZeroUsize :: new ( dst. elem_size ) {
722
725
e
723
726
} else {
724
727
return None ;
725
728
} ;
726
729
727
- // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero.
728
- #[ allow( clippy:: arithmetic_side_effects) ]
729
- let delta_mod_other_elem = offset_delta % dst_elem_size. get ( ) ;
730
+ let offset_delta_elems =
731
+ Fraction { num : offset_delta, denom : dst_elem_size } . simplify ( ) ;
730
732
731
- // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero.
732
- #[ allow( clippy:: arithmetic_side_effects) ]
733
- let elem_remainder = src. elem_size % dst_elem_size. get ( ) ;
733
+ let elem_multiple =
734
+ Fraction { num : src. elem_size , denom : dst_elem_size } . simplify ( ) ;
734
735
735
- if delta_mod_other_elem != 0 || src. elem_size < dst. elem_size || elem_remainder != 0
736
- {
737
- return None ;
738
- }
736
+ // // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero.
737
+ // #[allow(clippy::arithmetic_side_effects)]
738
+ // let delta_mod_other_elem = offset_delta % dst_elem_size.get();
739
739
740
- // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero.
741
- #[ allow( clippy:: arithmetic_side_effects) ]
742
- let offset_delta_elems = offset_delta / dst_elem_size. get ( ) ;
740
+ // // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero.
741
+ // #[allow(clippy::arithmetic_side_effects)]
742
+ // let elem_remainder = src.elem_size % dst_elem_size.get();
743
743
744
- // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero.
745
- #[ allow( clippy:: arithmetic_side_effects) ]
746
- let elem_multiple = src. elem_size / dst_elem_size. get ( ) ;
744
+ // if delta_mod_other_elem != 0 || src.elem_size < dst.elem_size || elem_remainder != 0
745
+ // {
746
+ // return None;
747
+ // }
748
+
749
+ // // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero.
750
+ // #[allow(clippy::arithmetic_side_effects)]
751
+ // let offset_delta_elems = offset_delta / dst_elem_size.get();
752
+
753
+ // // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero.
754
+ // #[allow(clippy::arithmetic_side_effects)]
755
+ // let elem_multiple = src.elem_size / dst_elem_size.get();
747
756
748
757
// SAFETY: We checked above that `src.align >= dst.align`.
749
758
Some ( CastParams {
@@ -816,6 +825,24 @@ mod cast_from_raw {
816
825
// subset of those bytes, and has provenance for those bytes.
817
826
unsafe { PtrInner :: new ( dst) }
818
827
}
828
+
829
+ #[ derive( Copy , Clone ) ]
830
+ struct Fraction {
831
+ num : usize ,
832
+ denom : NonZeroUsize ,
833
+ }
834
+
835
+ impl Fraction {
836
+ const fn simplify ( self ) -> Fraction {
837
+ todo ! ( ) // https://stackoverflow.com/a/7777146/836390
838
+ }
839
+
840
+ const fn mul ( self , other : usize ) -> Fraction {
841
+ // TODO: How can we prove that it's sound to use `unchecked_mul`
842
+ // when the denom is 1?
843
+ todo ! ( )
844
+ }
845
+ }
819
846
}
820
847
821
848
// TODO(#67): For some reason, on our MSRV toolchain, this `allow` isn't
0 commit comments