133d722a9Sopenharmony_ciuse crate::intern::{self, InternedString}; 233d722a9Sopenharmony_ciuse std::path::Path; 333d722a9Sopenharmony_ci 433d722a9Sopenharmony_cipub trait InternedVec<T> 533d722a9Sopenharmony_ciwhere 633d722a9Sopenharmony_ci T: ?Sized, 733d722a9Sopenharmony_ci{ 833d722a9Sopenharmony_ci fn vec(&self) -> Vec<&'static T>; 933d722a9Sopenharmony_ci} 1033d722a9Sopenharmony_ci 1133d722a9Sopenharmony_ciimpl<T> InternedVec<T> for Vec<InternedString> 1233d722a9Sopenharmony_ciwhere 1333d722a9Sopenharmony_ci T: ?Sized + Element, 1433d722a9Sopenharmony_ci{ 1533d722a9Sopenharmony_ci fn vec(&self) -> Vec<&'static T> { 1633d722a9Sopenharmony_ci self.iter().copied().map(Element::unintern).collect() 1733d722a9Sopenharmony_ci } 1833d722a9Sopenharmony_ci} 1933d722a9Sopenharmony_ci 2033d722a9Sopenharmony_cipub fn intern<T>(elements: &[&T]) -> Vec<InternedString> 2133d722a9Sopenharmony_ciwhere 2233d722a9Sopenharmony_ci T: ?Sized + Element, 2333d722a9Sopenharmony_ci{ 2433d722a9Sopenharmony_ci elements.iter().copied().map(Element::intern).collect() 2533d722a9Sopenharmony_ci} 2633d722a9Sopenharmony_ci 2733d722a9Sopenharmony_cipub trait Element { 2833d722a9Sopenharmony_ci fn intern(&self) -> InternedString; 2933d722a9Sopenharmony_ci fn unintern(_: InternedString) -> &'static Self; 3033d722a9Sopenharmony_ci} 3133d722a9Sopenharmony_ci 3233d722a9Sopenharmony_ciimpl Element for str { 3333d722a9Sopenharmony_ci fn intern(&self) -> InternedString { 3433d722a9Sopenharmony_ci intern::intern(self) 3533d722a9Sopenharmony_ci } 3633d722a9Sopenharmony_ci 3733d722a9Sopenharmony_ci fn unintern(interned: InternedString) -> &'static Self { 3833d722a9Sopenharmony_ci interned.str() 3933d722a9Sopenharmony_ci } 4033d722a9Sopenharmony_ci} 4133d722a9Sopenharmony_ci 4233d722a9Sopenharmony_ciimpl Element for Path { 4333d722a9Sopenharmony_ci fn intern(&self) -> InternedString { 4433d722a9Sopenharmony_ci intern::intern(&self.to_string_lossy()) 4533d722a9Sopenharmony_ci } 4633d722a9Sopenharmony_ci 4733d722a9Sopenharmony_ci fn unintern(interned: InternedString) -> &'static Self { 4833d722a9Sopenharmony_ci Path::new(interned.str()) 4933d722a9Sopenharmony_ci } 5033d722a9Sopenharmony_ci} 51