diff --git a/src/cargo/core/interning.rs b/src/cargo/core/interning.rs index 45dde58105c..352268dfc96 100644 --- a/src/cargo/core/interning.rs +++ b/src/cargo/core/interning.rs @@ -39,30 +39,37 @@ impl InternedString { cache.insert(s); InternedString { ptr: s.as_ptr(), len: s.len() } } + pub fn to_inner(&self) -> &'static str { + unsafe { + let slice = slice::from_raw_parts(self.ptr, self.len); + &str::from_utf8_unchecked(slice) + } + } } impl Deref for InternedString { type Target = str; fn deref(&self) -> &'static str { - unsafe { - let slice = slice::from_raw_parts(self.ptr, self.len); - &str::from_utf8_unchecked(slice) - } + self.to_inner() } } impl fmt::Debug for InternedString { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let str: &str = &*self; - write!(f, "InternedString {{ {} }}", str) + write!(f, "InternedString {{ {} }}", self.to_inner()) + } +} + +impl fmt::Display for InternedString { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.to_inner()) } } impl Ord for InternedString { fn cmp(&self, other: &InternedString) -> Ordering { - let str: &str = &*self; - str.cmp(&*other) + self.to_inner().cmp(&*other) } } diff --git a/src/cargo/core/package_id.rs b/src/cargo/core/package_id.rs index ffb4330c627..dc8fde6249c 100644 --- a/src/cargo/core/package_id.rs +++ b/src/cargo/core/package_id.rs @@ -11,6 +11,7 @@ use serde::ser; use util::{CargoResult, ToSemver}; use core::source::SourceId; +use core::interning::InternedString; /// Identifier for a specific version of a package in a specific source. #[derive(Clone)] @@ -20,7 +21,7 @@ pub struct PackageId { #[derive(PartialEq, PartialOrd, Eq, Ord)] struct PackageIdInner { - name: String, + name: InternedString, version: semver::Version, source_id: SourceId, } @@ -63,7 +64,7 @@ impl<'de> de::Deserialize<'de> for PackageId { Ok(PackageId { inner: Arc::new(PackageIdInner { - name: name.to_string(), + name: InternedString::new(name), version, source_id, }), @@ -102,21 +103,21 @@ impl PackageId { let v = version.to_semver()?; Ok(PackageId { inner: Arc::new(PackageIdInner { - name: name.to_string(), + name: InternedString::new(name), version: v, source_id: sid.clone(), }), }) } - pub fn name(&self) -> &str { &self.inner.name } + pub fn name(&self) -> &str { self.inner.name.to_inner() } pub fn version(&self) -> &semver::Version { &self.inner.version } pub fn source_id(&self) -> &SourceId { &self.inner.source_id } pub fn with_precise(&self, precise: Option) -> PackageId { PackageId { inner: Arc::new(PackageIdInner { - name: self.inner.name.to_string(), + name: self.inner.name, version: self.inner.version.clone(), source_id: self.inner.source_id.with_precise(precise), }), @@ -126,7 +127,7 @@ impl PackageId { pub fn with_source_id(&self, source: &SourceId) -> PackageId { PackageId { inner: Arc::new(PackageIdInner { - name: self.inner.name.to_string(), + name: self.inner.name, version: self.inner.version.clone(), source_id: source.clone(), }),