|
| 1 | +use crate::coder::{Decoder, Encoder}; |
| 2 | +use crate::derive::{Decode, Encode}; |
| 3 | +use crate::str::{StrDecoder, StrEncoder}; |
| 4 | +use compact_str::CompactString; |
| 5 | + |
| 6 | +impl Encoder<CompactString> for StrEncoder { |
| 7 | + #[inline(always)] |
| 8 | + fn encode(&mut self, t: &CompactString) { |
| 9 | + self.encode(t.as_str()) |
| 10 | + } |
| 11 | +} |
| 12 | + |
| 13 | +impl Encode for CompactString { |
| 14 | + type Encoder = StrEncoder; |
| 15 | +} |
| 16 | + |
| 17 | +// TODO: Can we optimize out copying from the reference? Just construct a CompactString from pointer/capacity/length if it exceeds the inline capacity? |
| 18 | +impl<'a> Decoder<'a, CompactString> for StrDecoder<'a> { |
| 19 | + #[inline(always)] |
| 20 | + fn decode(&mut self) -> CompactString { |
| 21 | + let s: &str = self.decode(); |
| 22 | + s.into() |
| 23 | + } |
| 24 | +} |
| 25 | + |
| 26 | +impl<'a> Decode<'a> for CompactString { |
| 27 | + type Decoder = StrDecoder<'a>; |
| 28 | +} |
| 29 | + |
| 30 | +#[cfg(test)] |
| 31 | +mod tests { |
| 32 | + use crate::{decode, encode}; |
| 33 | + use alloc::vec::Vec; |
| 34 | + use compact_str::CompactString; |
| 35 | + |
| 36 | + #[test] |
| 37 | + fn compact_string() { |
| 38 | + let mut v = CompactString::default(); |
| 39 | + v.push('0'); |
| 40 | + v.push('1'); |
| 41 | + let b = encode(&v); |
| 42 | + assert_eq!(decode::<CompactString>(&b).unwrap(), v); |
| 43 | + } |
| 44 | + |
| 45 | + #[test] |
| 46 | + fn compact_string_long() { |
| 47 | + // CompactString inlines up to 23 bytes on 64-bit platforms; the English alphabet exceeds that at 26 bytes. |
| 48 | + let v = CompactString::new("abcdefghijklmnopqrstuvwxyz"); |
| 49 | + let b = encode(&v); |
| 50 | + assert_eq!(decode::<CompactString>(&b).unwrap(), v); |
| 51 | + } |
| 52 | + |
| 53 | + #[test] |
| 54 | + fn compact_string_vec() { |
| 55 | + let v = vec![ |
| 56 | + CompactString::new("01"), |
| 57 | + CompactString::new("abcdefghijklmnopqrstuvwxyz"), |
| 58 | + ]; |
| 59 | + let b = encode(&v); |
| 60 | + let v2 = decode::<Vec<CompactString>>(&b).unwrap(); |
| 61 | + assert_eq!(v, v2); |
| 62 | + } |
| 63 | +} |
0 commit comments