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