1*499dc02cSMiguel Ojeda // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT 2*499dc02cSMiguel Ojeda 3c3739801SMiguel Ojeda // Copyright 2024 The Fuchsia Authors 4c3739801SMiguel Ojeda // 5c3739801SMiguel Ojeda // Licensed under the 2-Clause BSD License <LICENSE-BSD or 6c3739801SMiguel Ojeda // https://opensource.org/license/bsd-2-clause>, Apache License, Version 2.0 7c3739801SMiguel Ojeda // <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT 8c3739801SMiguel Ojeda // license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option. 9c3739801SMiguel Ojeda // This file may not be copied, modified, or distributed except according to 10c3739801SMiguel Ojeda // those terms. 11c3739801SMiguel Ojeda 12c3739801SMiguel Ojeda //! Deprecated items. These are kept separate so that they don't clutter up 13c3739801SMiguel Ojeda //! other modules. 14c3739801SMiguel Ojeda 15c3739801SMiguel Ojeda use super::*; 16c3739801SMiguel Ojeda 17c3739801SMiguel Ojeda impl<B, T> Ref<B, T> 18c3739801SMiguel Ojeda where 19c3739801SMiguel Ojeda B: ByteSlice, 20c3739801SMiguel Ojeda T: KnownLayout + Immutable + ?Sized, 21c3739801SMiguel Ojeda { 22c3739801SMiguel Ojeda #[deprecated(since = "0.8.0", note = "renamed to `Ref::from_bytes`")] 23c3739801SMiguel Ojeda #[doc(hidden)] 24c3739801SMiguel Ojeda #[must_use = "has no side effects"] 25c3739801SMiguel Ojeda #[inline(always)] 26c3739801SMiguel Ojeda pub fn new(bytes: B) -> Option<Ref<B, T>> { 27c3739801SMiguel Ojeda Self::from_bytes(bytes).ok() 28c3739801SMiguel Ojeda } 29c3739801SMiguel Ojeda } 30c3739801SMiguel Ojeda 31c3739801SMiguel Ojeda impl<B, T> Ref<B, T> 32c3739801SMiguel Ojeda where 33c3739801SMiguel Ojeda B: SplitByteSlice, 34c3739801SMiguel Ojeda T: KnownLayout + Immutable + ?Sized, 35c3739801SMiguel Ojeda { 36c3739801SMiguel Ojeda #[deprecated(since = "0.8.0", note = "renamed to `Ref::from_prefix`")] 37c3739801SMiguel Ojeda #[doc(hidden)] 38c3739801SMiguel Ojeda #[must_use = "has no side effects"] 39c3739801SMiguel Ojeda #[inline(always)] 40c3739801SMiguel Ojeda pub fn new_from_prefix(bytes: B) -> Option<(Ref<B, T>, B)> { 41c3739801SMiguel Ojeda Self::from_prefix(bytes).ok() 42c3739801SMiguel Ojeda } 43c3739801SMiguel Ojeda } 44c3739801SMiguel Ojeda 45c3739801SMiguel Ojeda impl<B, T> Ref<B, T> 46c3739801SMiguel Ojeda where 47c3739801SMiguel Ojeda B: SplitByteSlice, 48c3739801SMiguel Ojeda T: KnownLayout + Immutable + ?Sized, 49c3739801SMiguel Ojeda { 50c3739801SMiguel Ojeda #[deprecated(since = "0.8.0", note = "renamed to `Ref::from_suffix`")] 51c3739801SMiguel Ojeda #[doc(hidden)] 52c3739801SMiguel Ojeda #[must_use = "has no side effects"] 53c3739801SMiguel Ojeda #[inline(always)] 54c3739801SMiguel Ojeda pub fn new_from_suffix(bytes: B) -> Option<(B, Ref<B, T>)> { 55c3739801SMiguel Ojeda Self::from_suffix(bytes).ok() 56c3739801SMiguel Ojeda } 57c3739801SMiguel Ojeda } 58c3739801SMiguel Ojeda 59c3739801SMiguel Ojeda impl<B, T> Ref<B, T> 60c3739801SMiguel Ojeda where 61c3739801SMiguel Ojeda B: ByteSlice, 62c3739801SMiguel Ojeda T: Unaligned + KnownLayout + Immutable + ?Sized, 63c3739801SMiguel Ojeda { 64c3739801SMiguel Ojeda #[deprecated( 65c3739801SMiguel Ojeda since = "0.8.0", 66c3739801SMiguel Ojeda note = "use `Ref::from_bytes`; for `T: Unaligned`, the returned `CastError` implements `Into<SizeError>`" 67c3739801SMiguel Ojeda )] 68c3739801SMiguel Ojeda #[doc(hidden)] 69c3739801SMiguel Ojeda #[must_use = "has no side effects"] 70c3739801SMiguel Ojeda #[inline(always)] 71c3739801SMiguel Ojeda pub fn new_unaligned(bytes: B) -> Option<Ref<B, T>> { 72c3739801SMiguel Ojeda Self::from_bytes(bytes).ok() 73c3739801SMiguel Ojeda } 74c3739801SMiguel Ojeda } 75c3739801SMiguel Ojeda 76c3739801SMiguel Ojeda impl<B, T> Ref<B, T> 77c3739801SMiguel Ojeda where 78c3739801SMiguel Ojeda B: SplitByteSlice, 79c3739801SMiguel Ojeda T: Unaligned + KnownLayout + Immutable + ?Sized, 80c3739801SMiguel Ojeda { 81c3739801SMiguel Ojeda #[deprecated( 82c3739801SMiguel Ojeda since = "0.8.0", 83c3739801SMiguel Ojeda note = "use `Ref::from_prefix`; for `T: Unaligned`, the returned `CastError` implements `Into<SizeError>`" 84c3739801SMiguel Ojeda )] 85c3739801SMiguel Ojeda #[doc(hidden)] 86c3739801SMiguel Ojeda #[must_use = "has no side effects"] 87c3739801SMiguel Ojeda #[inline(always)] 88c3739801SMiguel Ojeda pub fn new_unaligned_from_prefix(bytes: B) -> Option<(Ref<B, T>, B)> { 89c3739801SMiguel Ojeda Self::from_prefix(bytes).ok() 90c3739801SMiguel Ojeda } 91c3739801SMiguel Ojeda } 92c3739801SMiguel Ojeda 93c3739801SMiguel Ojeda impl<B, T> Ref<B, T> 94c3739801SMiguel Ojeda where 95c3739801SMiguel Ojeda B: SplitByteSlice, 96c3739801SMiguel Ojeda T: Unaligned + KnownLayout + Immutable + ?Sized, 97c3739801SMiguel Ojeda { 98c3739801SMiguel Ojeda #[deprecated( 99c3739801SMiguel Ojeda since = "0.8.0", 100c3739801SMiguel Ojeda note = "use `Ref::from_suffix`; for `T: Unaligned`, the returned `CastError` implements `Into<SizeError>`" 101c3739801SMiguel Ojeda )] 102c3739801SMiguel Ojeda #[doc(hidden)] 103c3739801SMiguel Ojeda #[must_use = "has no side effects"] 104c3739801SMiguel Ojeda #[inline(always)] 105c3739801SMiguel Ojeda pub fn new_unaligned_from_suffix(bytes: B) -> Option<(B, Ref<B, T>)> { 106c3739801SMiguel Ojeda Self::from_suffix(bytes).ok() 107c3739801SMiguel Ojeda } 108c3739801SMiguel Ojeda } 109c3739801SMiguel Ojeda 110c3739801SMiguel Ojeda impl<B, T> Ref<B, [T]> 111c3739801SMiguel Ojeda where 112c3739801SMiguel Ojeda B: ByteSlice, 113c3739801SMiguel Ojeda T: Immutable, 114c3739801SMiguel Ojeda { 115c3739801SMiguel Ojeda #[deprecated(since = "0.8.0", note = "`Ref::from_bytes` now supports slices")] 116c3739801SMiguel Ojeda #[doc(hidden)] 117c3739801SMiguel Ojeda #[inline(always)] 118c3739801SMiguel Ojeda pub fn new_slice(bytes: B) -> Option<Ref<B, [T]>> { 119c3739801SMiguel Ojeda Self::from_bytes(bytes).ok() 120c3739801SMiguel Ojeda } 121c3739801SMiguel Ojeda } 122c3739801SMiguel Ojeda 123c3739801SMiguel Ojeda impl<B, T> Ref<B, [T]> 124c3739801SMiguel Ojeda where 125c3739801SMiguel Ojeda B: ByteSlice, 126c3739801SMiguel Ojeda T: Unaligned + Immutable, 127c3739801SMiguel Ojeda { 128c3739801SMiguel Ojeda #[deprecated( 129c3739801SMiguel Ojeda since = "0.8.0", 130c3739801SMiguel Ojeda note = "`Ref::from_bytes` now supports slices; for `T: Unaligned`, the returned `CastError` implements `Into<SizeError>`" 131c3739801SMiguel Ojeda )] 132c3739801SMiguel Ojeda #[doc(hidden)] 133c3739801SMiguel Ojeda #[inline(always)] 134c3739801SMiguel Ojeda pub fn new_slice_unaligned(bytes: B) -> Option<Ref<B, [T]>> { 135c3739801SMiguel Ojeda Ref::from_bytes(bytes).ok() 136c3739801SMiguel Ojeda } 137c3739801SMiguel Ojeda } 138c3739801SMiguel Ojeda 139c3739801SMiguel Ojeda impl<'a, B, T> Ref<B, [T]> 140c3739801SMiguel Ojeda where 141c3739801SMiguel Ojeda B: 'a + IntoByteSlice<'a>, 142c3739801SMiguel Ojeda T: FromBytes + Immutable, 143c3739801SMiguel Ojeda { 144c3739801SMiguel Ojeda #[deprecated(since = "0.8.0", note = "`Ref::into_ref` now supports slices")] 145c3739801SMiguel Ojeda #[doc(hidden)] 146c3739801SMiguel Ojeda #[inline(always)] 147c3739801SMiguel Ojeda pub fn into_slice(self) -> &'a [T] { 148c3739801SMiguel Ojeda Ref::into_ref(self) 149c3739801SMiguel Ojeda } 150c3739801SMiguel Ojeda } 151c3739801SMiguel Ojeda 152c3739801SMiguel Ojeda impl<'a, B, T> Ref<B, [T]> 153c3739801SMiguel Ojeda where 154c3739801SMiguel Ojeda B: 'a + IntoByteSliceMut<'a>, 155c3739801SMiguel Ojeda T: FromBytes + IntoBytes + Immutable, 156c3739801SMiguel Ojeda { 157c3739801SMiguel Ojeda #[deprecated(since = "0.8.0", note = "`Ref::into_mut` now supports slices")] 158c3739801SMiguel Ojeda #[doc(hidden)] 159c3739801SMiguel Ojeda #[inline(always)] 160c3739801SMiguel Ojeda pub fn into_mut_slice(self) -> &'a mut [T] { 161c3739801SMiguel Ojeda Ref::into_mut(self) 162c3739801SMiguel Ojeda } 163c3739801SMiguel Ojeda } 164c3739801SMiguel Ojeda 165c3739801SMiguel Ojeda impl<B, T> Ref<B, [T]> 166c3739801SMiguel Ojeda where 167c3739801SMiguel Ojeda B: SplitByteSlice, 168c3739801SMiguel Ojeda T: Immutable, 169c3739801SMiguel Ojeda { 170c3739801SMiguel Ojeda #[deprecated(since = "0.8.0", note = "replaced by `Ref::from_prefix_with_elems`")] 171c3739801SMiguel Ojeda #[must_use = "has no side effects"] 172c3739801SMiguel Ojeda #[doc(hidden)] 173c3739801SMiguel Ojeda #[inline(always)] 174c3739801SMiguel Ojeda pub fn new_slice_from_prefix(bytes: B, count: usize) -> Option<(Ref<B, [T]>, B)> { 175c3739801SMiguel Ojeda Ref::from_prefix_with_elems(bytes, count).ok() 176c3739801SMiguel Ojeda } 177c3739801SMiguel Ojeda 178c3739801SMiguel Ojeda #[deprecated(since = "0.8.0", note = "replaced by `Ref::from_suffix_with_elems`")] 179c3739801SMiguel Ojeda #[must_use = "has no side effects"] 180c3739801SMiguel Ojeda #[doc(hidden)] 181c3739801SMiguel Ojeda #[inline(always)] 182c3739801SMiguel Ojeda pub fn new_slice_from_suffix(bytes: B, count: usize) -> Option<(B, Ref<B, [T]>)> { 183c3739801SMiguel Ojeda Ref::from_suffix_with_elems(bytes, count).ok() 184c3739801SMiguel Ojeda } 185c3739801SMiguel Ojeda } 186c3739801SMiguel Ojeda 187c3739801SMiguel Ojeda impl<B, T> Ref<B, [T]> 188c3739801SMiguel Ojeda where 189c3739801SMiguel Ojeda B: SplitByteSlice, 190c3739801SMiguel Ojeda T: Unaligned + Immutable, 191c3739801SMiguel Ojeda { 192c3739801SMiguel Ojeda #[deprecated( 193c3739801SMiguel Ojeda since = "0.8.0", 194c3739801SMiguel Ojeda note = "use `Ref::from_prefix_with_elems`; for `T: Unaligned`, the returned `CastError` implements `Into<SizeError>`" 195c3739801SMiguel Ojeda )] 196c3739801SMiguel Ojeda #[doc(hidden)] 197c3739801SMiguel Ojeda #[must_use = "has no side effects"] 198c3739801SMiguel Ojeda #[inline(always)] 199c3739801SMiguel Ojeda pub fn new_slice_unaligned_from_prefix(bytes: B, count: usize) -> Option<(Ref<B, [T]>, B)> { 200c3739801SMiguel Ojeda Ref::from_prefix_with_elems(bytes, count).ok() 201c3739801SMiguel Ojeda } 202c3739801SMiguel Ojeda 203c3739801SMiguel Ojeda #[deprecated( 204c3739801SMiguel Ojeda since = "0.8.0", 205c3739801SMiguel Ojeda note = "use `Ref::from_suffix_with_elems`; for `T: Unaligned`, the returned `CastError` implements `Into<SizeError>`" 206c3739801SMiguel Ojeda )] 207c3739801SMiguel Ojeda #[doc(hidden)] 208c3739801SMiguel Ojeda #[must_use = "has no side effects"] 209c3739801SMiguel Ojeda #[inline(always)] 210c3739801SMiguel Ojeda pub fn new_slice_unaligned_from_suffix(bytes: B, count: usize) -> Option<(B, Ref<B, [T]>)> { 211c3739801SMiguel Ojeda Ref::from_suffix_with_elems(bytes, count).ok() 212c3739801SMiguel Ojeda } 213c3739801SMiguel Ojeda } 214c3739801SMiguel Ojeda 215c3739801SMiguel Ojeda #[cfg(test)] 216c3739801SMiguel Ojeda mod tests { 217c3739801SMiguel Ojeda use super::*; 218c3739801SMiguel Ojeda 219c3739801SMiguel Ojeda #[test] 220c3739801SMiguel Ojeda #[allow(deprecated)] 221c3739801SMiguel Ojeda fn test_deprecated_ref_methods() { 222c3739801SMiguel Ojeda let bytes = &[0u8; 1][..]; 223c3739801SMiguel Ojeda let bytes_slice = &[0u8; 4][..]; 224c3739801SMiguel Ojeda 225c3739801SMiguel Ojeda let r: Option<Ref<&[u8], u8>> = Ref::new(bytes); 226c3739801SMiguel Ojeda assert!(r.is_some()); 227c3739801SMiguel Ojeda 228c3739801SMiguel Ojeda let r: Option<(Ref<&[u8], u8>, &[u8])> = Ref::new_from_prefix(bytes); 229c3739801SMiguel Ojeda assert!(r.is_some()); 230c3739801SMiguel Ojeda 231c3739801SMiguel Ojeda let r: Option<(&[u8], Ref<&[u8], u8>)> = Ref::new_from_suffix(bytes); 232c3739801SMiguel Ojeda assert!(r.is_some()); 233c3739801SMiguel Ojeda 234c3739801SMiguel Ojeda let r: Option<Ref<&[u8], u8>> = Ref::new_unaligned(bytes); 235c3739801SMiguel Ojeda assert!(r.is_some()); 236c3739801SMiguel Ojeda 237c3739801SMiguel Ojeda let r: Option<(Ref<&[u8], u8>, &[u8])> = Ref::new_unaligned_from_prefix(bytes); 238c3739801SMiguel Ojeda assert!(r.is_some()); 239c3739801SMiguel Ojeda 240c3739801SMiguel Ojeda let r: Option<(&[u8], Ref<&[u8], u8>)> = Ref::new_unaligned_from_suffix(bytes); 241c3739801SMiguel Ojeda assert!(r.is_some()); 242c3739801SMiguel Ojeda 243c3739801SMiguel Ojeda let r: Option<Ref<&[u8], [u8]>> = Ref::new_slice(bytes_slice); 244c3739801SMiguel Ojeda assert!(r.is_some()); 245c3739801SMiguel Ojeda 246c3739801SMiguel Ojeda let r: Option<Ref<&[u8], [u8]>> = Ref::new_slice_unaligned(bytes_slice); 247c3739801SMiguel Ojeda assert!(r.is_some()); 248c3739801SMiguel Ojeda 249c3739801SMiguel Ojeda let r: Option<(Ref<&[u8], [u8]>, &[u8])> = Ref::new_slice_from_prefix(bytes_slice, 1); 250c3739801SMiguel Ojeda assert!(r.is_some()); 251c3739801SMiguel Ojeda 252c3739801SMiguel Ojeda let r: Option<(&[u8], Ref<&[u8], [u8]>)> = Ref::new_slice_from_suffix(bytes_slice, 1); 253c3739801SMiguel Ojeda assert!(r.is_some()); 254c3739801SMiguel Ojeda 255c3739801SMiguel Ojeda let r: Option<(Ref<&[u8], [u8]>, &[u8])> = 256c3739801SMiguel Ojeda Ref::new_slice_unaligned_from_prefix(bytes_slice, 1); 257c3739801SMiguel Ojeda assert!(r.is_some()); 258c3739801SMiguel Ojeda 259c3739801SMiguel Ojeda let r: Option<(&[u8], Ref<&[u8], [u8]>)> = 260c3739801SMiguel Ojeda Ref::new_slice_unaligned_from_suffix(bytes_slice, 1); 261c3739801SMiguel Ojeda assert!(r.is_some()); 262c3739801SMiguel Ojeda } 263c3739801SMiguel Ojeda 264c3739801SMiguel Ojeda #[test] 265c3739801SMiguel Ojeda #[allow(deprecated)] 266c3739801SMiguel Ojeda fn test_deprecated_into_slice() { 267c3739801SMiguel Ojeda let bytes = &[0u8; 4][..]; 268c3739801SMiguel Ojeda let r: Ref<&[u8], [u8]> = Ref::from_bytes(bytes).unwrap(); 269c3739801SMiguel Ojeda let slice: &[u8] = r.into_slice(); 270c3739801SMiguel Ojeda assert_eq!(slice.len(), 4); 271c3739801SMiguel Ojeda } 272c3739801SMiguel Ojeda 273c3739801SMiguel Ojeda #[test] 274c3739801SMiguel Ojeda #[allow(deprecated)] 275c3739801SMiguel Ojeda fn test_deprecated_into_mut_slice() { 276c3739801SMiguel Ojeda let mut bytes = [0u8; 4]; 277c3739801SMiguel Ojeda let r: Ref<&mut [u8], [u8]> = Ref::from_bytes(&mut bytes[..]).unwrap(); 278c3739801SMiguel Ojeda let slice: &mut [u8] = r.into_mut_slice(); 279c3739801SMiguel Ojeda assert_eq!(slice.len(), 4); 280c3739801SMiguel Ojeda } 281c3739801SMiguel Ojeda } 282