arc_slice/
bstr.rs

1#[cfg(feature = "serde")]
2use alloc::string::String;
3use alloc::{boxed::Box, vec::Vec};
4use core::convert::Infallible;
5
6use bstr::{BStr, BString, ByteSlice};
7
8#[cfg(feature = "serde")]
9use crate::buffer::Deserializable;
10use crate::{
11    buffer::{
12        Buffer, BufferMut, Concatenable, Emptyable, Extendable, Slice, Subsliceable, Zeroable,
13    },
14    error::TryReserveError,
15};
16
17unsafe impl Slice for BStr {
18    type Item = u8;
19    type Vec = BString;
20
21    fn to_slice(&self) -> &[Self::Item] {
22        self
23    }
24    unsafe fn to_slice_mut(&mut self) -> &mut [Self::Item] {
25        self
26    }
27    fn into_boxed_slice(self: Box<Self>) -> Box<[Self::Item]> {
28        self.into()
29    }
30    fn into_vec(vec: Self::Vec) -> Vec<Self::Item> {
31        vec.into()
32    }
33
34    unsafe fn from_slice_unchecked(slice: &[Self::Item]) -> &Self {
35        slice.as_bstr()
36    }
37    unsafe fn from_slice_mut_unchecked(slice: &mut [Self::Item]) -> &mut Self {
38        slice.as_bstr_mut()
39    }
40    unsafe fn from_boxed_slice_unchecked(boxed: Box<[Self::Item]>) -> Box<Self> {
41        boxed.into()
42    }
43    unsafe fn from_vec_unchecked(vec: Vec<Self::Item>) -> Self::Vec {
44        vec.into()
45    }
46
47    type TryFromSliceError = Infallible;
48    fn try_from_slice(slice: &[Self::Item]) -> Result<&Self, Self::TryFromSliceError> {
49        Ok(slice.as_bstr())
50    }
51    fn try_from_slice_mut(slice: &mut [Self::Item]) -> Result<&mut Self, Self::TryFromSliceError> {
52        Ok(slice.as_bstr_mut())
53    }
54}
55
56unsafe impl Emptyable for BStr {}
57
58unsafe impl Zeroable for BStr {}
59
60unsafe impl Subsliceable for BStr {
61    unsafe fn check_subslice(&self, _start: usize, _end: usize) {}
62}
63
64unsafe impl Concatenable for BStr {}
65
66unsafe impl Extendable for BStr {}
67
68#[cfg(feature = "serde")]
69impl Deserializable for BStr {
70    fn deserialize<'de, D: serde::Deserializer<'de>, V: serde::de::Visitor<'de>>(
71        deserializer: D,
72        visitor: V,
73    ) -> Result<V::Value, D::Error> {
74        deserializer.deserialize_byte_buf(visitor)
75    }
76    fn expecting(f: &mut core::fmt::Formatter) -> core::fmt::Result {
77        write!(f, "a byte string")
78    }
79    fn deserialize_from_bytes<E: serde::de::Error>(bytes: &[u8]) -> Result<&Self, E> {
80        Ok(bytes.into())
81    }
82    fn deserialize_from_byte_buf<E: serde::de::Error>(bytes: Vec<u8>) -> Result<Self::Vec, E> {
83        Ok(bytes.into())
84    }
85    fn deserialize_from_str<E: serde::de::Error>(s: &str) -> Result<&Self, E> {
86        Ok(s.into())
87    }
88    fn deserialize_from_string<E: serde::de::Error>(s: String) -> Result<Self::Vec, E> {
89        Ok(s.into())
90    }
91    fn try_deserialize_from_seq() -> bool {
92        false
93    }
94}
95
96impl Buffer<BStr> for BString {
97    fn as_slice(&self) -> &BStr {
98        self.as_bstr()
99    }
100}
101
102unsafe impl BufferMut<BStr> for BString {
103    fn as_mut_slice(&mut self) -> &mut BStr {
104        self.as_bstr_mut()
105    }
106
107    fn capacity(&self) -> usize {
108        (**self).capacity()
109    }
110
111    unsafe fn set_len(&mut self, len: usize) -> bool {
112        unsafe { (**self).set_len(len) };
113        true
114    }
115
116    fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
117        BufferMut::try_reserve(&mut **self, additional)
118    }
119}