cxx_build/
vec.rs

1use crate::intern::{self, InternedString};
2use std::path::Path;
3
4pub(crate) trait InternedVec<T>
5where
6    T: ?Sized,
7{
8    fn vec(&self) -> Vec<&'static T>;
9}
10
11impl<T> InternedVec<T> for Vec<InternedString>
12where
13    T: ?Sized + Element,
14{
15    fn vec(&self) -> Vec<&'static T> {
16        self.iter().copied().map(Element::unintern).collect()
17    }
18}
19
20pub(crate) fn intern<T>(elements: &[&T]) -> Vec<InternedString>
21where
22    T: ?Sized + Element,
23{
24    elements.iter().copied().map(Element::intern).collect()
25}
26
27pub(crate) trait Element {
28    fn intern(&self) -> InternedString;
29    fn unintern(_: InternedString) -> &'static Self;
30}
31
32impl Element for str {
33    fn intern(&self) -> InternedString {
34        intern::intern(self)
35    }
36
37    fn unintern(interned: InternedString) -> &'static Self {
38        interned.str()
39    }
40}
41
42impl Element for Path {
43    fn intern(&self) -> InternedString {
44        intern::intern(&self.to_string_lossy())
45    }
46
47    fn unintern(interned: InternedString) -> &'static Self {
48        Path::new(interned.str())
49    }
50}