1cdb3e2c8Sopenharmony_ciuse std::fmt::Debug; 2cdb3e2c8Sopenharmony_ci 3cdb3e2c8Sopenharmony_ciuse super::private; 4cdb3e2c8Sopenharmony_ci 5cdb3e2c8Sopenharmony_cipub trait Encoded { 6cdb3e2c8Sopenharmony_ci fn __get(&self) -> &[u8]; 7cdb3e2c8Sopenharmony_ci} 8cdb3e2c8Sopenharmony_ci 9cdb3e2c8Sopenharmony_ci#[derive(Clone, Debug)] 10cdb3e2c8Sopenharmony_cipub struct EncodedChar { 11cdb3e2c8Sopenharmony_ci buffer: [u8; 4], 12cdb3e2c8Sopenharmony_ci length: usize, 13cdb3e2c8Sopenharmony_ci} 14cdb3e2c8Sopenharmony_ci 15cdb3e2c8Sopenharmony_ciimpl Encoded for EncodedChar { 16cdb3e2c8Sopenharmony_ci fn __get(&self) -> &[u8] { 17cdb3e2c8Sopenharmony_ci &self.buffer[..self.length] 18cdb3e2c8Sopenharmony_ci } 19cdb3e2c8Sopenharmony_ci} 20cdb3e2c8Sopenharmony_ci 21cdb3e2c8Sopenharmony_ciimpl Encoded for &str { 22cdb3e2c8Sopenharmony_ci fn __get(&self) -> &[u8] { 23cdb3e2c8Sopenharmony_ci self.as_bytes() 24cdb3e2c8Sopenharmony_ci } 25cdb3e2c8Sopenharmony_ci} 26cdb3e2c8Sopenharmony_ci 27cdb3e2c8Sopenharmony_ci/// Allows a type to be used for searching by [`RawOsStr`] and [`RawOsString`]. 28cdb3e2c8Sopenharmony_ci/// 29cdb3e2c8Sopenharmony_ci/// This trait is very similar to [`str::pattern::Pattern`], but its methods 30cdb3e2c8Sopenharmony_ci/// are private and it is implemented for different types. 31cdb3e2c8Sopenharmony_ci/// 32cdb3e2c8Sopenharmony_ci/// [`RawOsStr`]: super::RawOsStr 33cdb3e2c8Sopenharmony_ci/// [`RawOsString`]: super::RawOsString 34cdb3e2c8Sopenharmony_ci/// [`str::pattern::Pattern`]: ::std::str::pattern::Pattern 35cdb3e2c8Sopenharmony_ci#[cfg_attr(os_str_bytes_docs_rs, doc(cfg(feature = "raw_os_str")))] 36cdb3e2c8Sopenharmony_cipub trait Pattern: private::Sealed { 37cdb3e2c8Sopenharmony_ci #[doc(hidden)] 38cdb3e2c8Sopenharmony_ci type __Encoded: Clone + Debug + Encoded; 39cdb3e2c8Sopenharmony_ci 40cdb3e2c8Sopenharmony_ci #[doc(hidden)] 41cdb3e2c8Sopenharmony_ci fn __encode(self) -> Self::__Encoded; 42cdb3e2c8Sopenharmony_ci} 43cdb3e2c8Sopenharmony_ci 44cdb3e2c8Sopenharmony_ciimpl Pattern for char { 45cdb3e2c8Sopenharmony_ci type __Encoded = EncodedChar; 46cdb3e2c8Sopenharmony_ci 47cdb3e2c8Sopenharmony_ci fn __encode(self) -> Self::__Encoded { 48cdb3e2c8Sopenharmony_ci let mut encoded = EncodedChar { 49cdb3e2c8Sopenharmony_ci buffer: [0; 4], 50cdb3e2c8Sopenharmony_ci length: 0, 51cdb3e2c8Sopenharmony_ci }; 52cdb3e2c8Sopenharmony_ci encoded.length = self.encode_utf8(&mut encoded.buffer).len(); 53cdb3e2c8Sopenharmony_ci encoded 54cdb3e2c8Sopenharmony_ci } 55cdb3e2c8Sopenharmony_ci} 56cdb3e2c8Sopenharmony_ci 57cdb3e2c8Sopenharmony_ciimpl Pattern for &str { 58cdb3e2c8Sopenharmony_ci type __Encoded = Self; 59cdb3e2c8Sopenharmony_ci 60cdb3e2c8Sopenharmony_ci fn __encode(self) -> Self::__Encoded { 61cdb3e2c8Sopenharmony_ci self 62cdb3e2c8Sopenharmony_ci } 63cdb3e2c8Sopenharmony_ci} 64cdb3e2c8Sopenharmony_ci 65cdb3e2c8Sopenharmony_ciimpl<'a> Pattern for &'a String { 66cdb3e2c8Sopenharmony_ci type __Encoded = <&'a str as Pattern>::__Encoded; 67cdb3e2c8Sopenharmony_ci 68cdb3e2c8Sopenharmony_ci fn __encode(self) -> Self::__Encoded { 69cdb3e2c8Sopenharmony_ci (**self).__encode() 70cdb3e2c8Sopenharmony_ci } 71cdb3e2c8Sopenharmony_ci} 72