From 8ae8466cf97b478a609dee01e495e59d9158757b Mon Sep 17 00:00:00 2001 From: Richard Newman Date: Fri, 31 Mar 2017 09:32:59 -0700 Subject: [PATCH] Make InternSet::intern accept Into>. Add a test. r=nalexander --- core/src/intern_set.rs | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/core/src/intern_set.rs b/core/src/intern_set.rs index 490a337b..1e9e8fd7 100644 --- a/core/src/intern_set.rs +++ b/core/src/intern_set.rs @@ -34,12 +34,31 @@ impl InternSet where T: Eq + Hash { } /// Intern a value, providing a ref-counted handle to the interned value. - pub fn intern(&mut self, value: T) -> Rc { - let key = Rc::new(value); + /// + /// ``` + /// use std::rc::Rc; + /// use mentat_core::intern_set::InternSet; + /// + /// let mut s = InternSet::new(); + /// + /// let one = "foo".to_string(); + /// let two = Rc::new("foo".to_string()); + /// + /// let out_one = s.intern(one); + /// assert_eq!(out_one, two); + /// // assert!(!&out_one.ptr_eq(&two)); // Nightly-only. + /// + /// let out_two = s.intern(two); + /// assert_eq!(out_one, out_two); + /// assert_eq!(1, s.inner.len()); + /// // assert!(&out_one.ptr_eq(&out_two)); // Nightly-only. + /// ``` + pub fn intern>>(&mut self, value: R) -> Rc { + let key: Rc = value.into(); if self.inner.insert(key.clone()) { key } else { self.inner.get(&key).unwrap().clone() } } -} +} \ No newline at end of file