Skip to content

Commit d925dec

Browse files
committed
Implement lifetime-free ref and mut casts for unsized type
1 parent 7231cf5 commit d925dec

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

src/internal.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ pub trait TryCastMutLifetimeFree<'a, T: ?Sized, U: LifetimeFree + ?Sized> {
4848
}
4949
}
5050

51-
impl<'a, T, U: LifetimeFree> TryCastMutLifetimeFree<'a, T, U>
51+
impl<'a, T: ?Sized, U: LifetimeFree + ?Sized> TryCastMutLifetimeFree<'a, T, U>
5252
for &&&&&&&(CastToken<&'a mut T>, CastToken<&'a mut U>)
5353
{
5454
}
@@ -72,7 +72,7 @@ pub trait TryCastRefLifetimeFree<'a, T: ?Sized, U: LifetimeFree + ?Sized> {
7272
}
7373
}
7474

75-
impl<'a, T, U: LifetimeFree> TryCastRefLifetimeFree<'a, T, U>
75+
impl<'a, T: ?Sized, U: LifetimeFree + ?Sized> TryCastRefLifetimeFree<'a, T, U>
7676
for &&&&&&(CastToken<&'a T>, CastToken<&'a U>)
7777
{
7878
}

src/lib.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,30 @@ mod tests {
353353
}));
354354
}
355355

356+
#[test]
357+
fn cast_lifetime_free_unsized_ref() {
358+
fn can_cast<T>(value: &[T]) -> bool {
359+
cast!(value, &[u8]).is_ok()
360+
}
361+
362+
let value = 42i32;
363+
assert!(can_cast(&[1_u8, 2, 3, 4]));
364+
assert!(!can_cast(&[1_i8, 2, 3, 4]));
365+
assert!(!can_cast(&[&value, &value]));
366+
}
367+
368+
#[test]
369+
fn cast_lifetime_free_unsized_mut() {
370+
fn can_cast<T>(value: &mut [T]) -> bool {
371+
cast!(value, &mut [u8]).is_ok()
372+
}
373+
374+
let value = 42i32;
375+
assert!(can_cast(&mut [1_u8, 2, 3, 4]));
376+
assert!(!can_cast(&mut [1_i8, 2, 3, 4]));
377+
assert!(!can_cast(&mut [&value, &value]));
378+
}
379+
356380
macro_rules! test_lifetime_free_cast {
357381
() => {};
358382

0 commit comments

Comments
 (0)