diff --git a/src/strings/experimental.rs b/src/strings/experimental.rs index f16e1fc..3036cb7 100644 --- a/src/strings/experimental.rs +++ b/src/strings/experimental.rs @@ -1,7 +1,9 @@ use std::{ borrow::{self, Cow}, + cmp::Ordering, convert::Infallible, fmt, + hash::{Hash, Hasher}, mem::{self, ManuallyDrop, MaybeUninit}, num::NonZeroU8, ops, @@ -317,6 +319,13 @@ impl Drop for InliningString { } } +impl Default for InliningString { + #[inline] + fn default() -> Self { + Self::empty() + } +} + impl ops::Deref for InliningString { type Target = str; @@ -361,6 +370,15 @@ impl borrow::BorrowMut for InliningString { } } +impl str::FromStr for InliningString { + type Err = Infallible; + + #[inline] + fn from_str(s: &str) -> Result { + Ok(Self::new(s)) + } +} + impl<'a, const N: usize> From<&'a str> for InliningString { #[inline] fn from(s: &'a str) -> Self { @@ -382,12 +400,40 @@ impl<'a, const N: usize> From> for InliningString { } } -impl str::FromStr for InliningString { - type Err = Infallible; +impl From> for String { + #[inline] + fn from(s: InliningString) -> Self { + s.into_string() + } +} +impl PartialEq> for InliningString { #[inline] - fn from_str(s: &str) -> Result { - Ok(Self::new(s)) + fn eq(&self, other: &InliningString) -> bool { + **self == **other + } +} + +impl Eq for InliningString {} + +impl PartialOrd> for InliningString { + #[inline] + fn partial_cmp(&self, other: &InliningString) -> Option { + (**self).partial_cmp(&**other) + } +} + +impl Ord for InliningString { + #[inline] + fn cmp(&self, other: &Self) -> Ordering { + (**self).cmp(&**other) + } +} + +impl Hash for InliningString { + #[inline] + fn hash(&self, state: &mut H) { + (**self).hash(state); } } @@ -403,6 +449,27 @@ impl fmt::Display for InliningString { } } +#[cfg(feature = "serde")] +impl serde::Serialize for InliningString { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer + { + serde::Serialize::serialize(&**self, serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de, const N: usize> serde::Deserialize<'de> for InliningString { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de> + { + serde::Deserialize::deserialize(deserializer) + .map(Self::new::<&'de str>) + } +} + #[cfg(test)] mod tests { use std::borrow::Cow;