use core::{
borrow::Borrow,
cmp::Ordering,
fmt,
hash::{Hash, Hasher},
ops::Deref,
};
mod repr;
use repr::Repr;
#[cfg(feature = "serde")]
mod serde;
#[cfg(test)]
mod tests;
#[derive(Clone)]
pub struct CompactStr {
repr: Repr,
}
impl CompactStr {
#[inline]
pub fn new<T: AsRef<str>>(text: T) -> Self {
CompactStr {
repr: Repr::new(text),
}
}
#[inline]
pub const fn new_inline(text: &str) -> Self {
CompactStr {
repr: Repr::new_const(text),
}
}
#[inline]
pub fn as_str(&self) -> &str {
self.repr.as_str()
}
#[inline]
pub fn is_heap_allocated(&self) -> bool {
self.repr.is_heap_allocated()
}
}
impl Default for CompactStr {
#[inline]
fn default() -> Self {
CompactStr::new("")
}
}
impl Deref for CompactStr {
type Target = str;
#[inline]
fn deref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for CompactStr {
#[inline]
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl Borrow<str> for CompactStr {
#[inline]
fn borrow(&self) -> &str {
self.as_str()
}
}
impl Eq for CompactStr {}
impl<T: AsRef<str>> PartialEq<T> for CompactStr {
fn eq(&self, other: &T) -> bool {
self.as_str() == other.as_ref()
}
}
impl PartialEq<CompactStr> for String {
fn eq(&self, other: &CompactStr) -> bool {
self.as_str() == other.as_str()
}
}
impl PartialEq<CompactStr> for &str {
fn eq(&self, other: &CompactStr) -> bool {
*self == other.as_str()
}
}
impl Ord for CompactStr {
fn cmp(&self, other: &Self) -> Ordering {
self.as_str().cmp(other.as_str())
}
}
impl PartialOrd for CompactStr {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Hash for CompactStr {
fn hash<H: Hasher>(&self, state: &mut H) {
self.as_str().hash(state)
}
}
impl<'a> From<&'a str> for CompactStr {
fn from(s: &'a str) -> Self {
CompactStr::new(s)
}
}
impl From<String> for CompactStr {
fn from(s: String) -> Self {
CompactStr::new(&s)
}
}
impl<'a> From<&'a String> for CompactStr {
fn from(s: &'a String) -> Self {
CompactStr::new(&s)
}
}
impl fmt::Debug for CompactStr {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Debug::fmt(self.as_str(), f)
}
}
impl fmt::Display for CompactStr {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Display::fmt(self.as_str(), f)
}
}
static_assertions::assert_eq_size!(CompactStr, String);