14
14
15
15
use ast:: Name ;
16
16
17
- use std:: borrow:: Borrow ;
18
17
use std:: collections:: HashMap ;
19
18
use std:: rc:: Rc ;
20
19
21
- #[ derive( PartialEq , Eq , Hash ) ]
22
- struct RcStr ( Rc < String > ) ;
23
-
24
- impl Borrow < str > for RcStr {
25
- fn borrow ( & self ) -> & str {
26
- & self . 0
27
- }
28
- }
29
-
30
20
#[ derive( Default ) ]
31
21
pub struct Interner {
32
- names : HashMap < RcStr , Name > ,
33
- strings : Vec < Rc < String > > ,
22
+ names : HashMap < Rc < str > , Name > ,
23
+ strings : Vec < Rc < str > > ,
34
24
}
35
25
36
26
/// When traits can extend traits, we should extend index<Name,T> to get []
@@ -47,22 +37,22 @@ impl Interner {
47
37
this
48
38
}
49
39
50
- pub fn intern < T : Borrow < str > + Into < String > > ( & mut self , string : T ) -> Name {
51
- if let Some ( & name) = self . names . get ( string. borrow ( ) ) {
40
+ pub fn intern ( & mut self , string : & str ) -> Name {
41
+ if let Some ( & name) = self . names . get ( string) {
52
42
return name;
53
43
}
54
44
55
45
let name = Name ( self . strings . len ( ) as u32 ) ;
56
- let string = Rc :: new ( string. into ( ) ) ;
46
+ let string = Rc :: __from_str ( string) ;
57
47
self . strings . push ( string. clone ( ) ) ;
58
- self . names . insert ( RcStr ( string) , name) ;
48
+ self . names . insert ( string, name) ;
59
49
name
60
50
}
61
51
62
52
pub fn gensym ( & mut self , string : & str ) -> Name {
63
53
let gensym = Name ( self . strings . len ( ) as u32 ) ;
64
54
// leave out of `names` to avoid colliding
65
- self . strings . push ( Rc :: new ( string. to_owned ( ) ) ) ;
55
+ self . strings . push ( Rc :: __from_str ( string) ) ;
66
56
gensym
67
57
}
68
58
@@ -75,7 +65,7 @@ impl Interner {
75
65
gensym
76
66
}
77
67
78
- pub fn get ( & self , name : Name ) -> Rc < String > {
68
+ pub fn get ( & self , name : Name ) -> Rc < str > {
79
69
self . strings [ name. 0 as usize ] . clone ( )
80
70
}
81
71
@@ -109,13 +99,13 @@ mod tests {
109
99
assert_eq ! ( i. gensym( "dog" ) , Name ( 4 ) ) ;
110
100
// gensym tests again with gensym_copy:
111
101
assert_eq ! ( i. gensym_copy( Name ( 2 ) ) , Name ( 5 ) ) ;
112
- assert_eq ! ( * i. get( Name ( 5 ) ) , "zebra" ) ;
102
+ assert_eq ! ( & * i. get( Name ( 5 ) ) , "zebra" ) ;
113
103
assert_eq ! ( i. gensym_copy( Name ( 2 ) ) , Name ( 6 ) ) ;
114
- assert_eq ! ( * i. get( Name ( 6 ) ) , "zebra" ) ;
115
- assert_eq ! ( * i. get( Name ( 0 ) ) , "dog" ) ;
116
- assert_eq ! ( * i. get( Name ( 1 ) ) , "cat" ) ;
117
- assert_eq ! ( * i. get( Name ( 2 ) ) , "zebra" ) ;
118
- assert_eq ! ( * i. get( Name ( 3 ) ) , "zebra" ) ;
119
- assert_eq ! ( * i. get( Name ( 4 ) ) , "dog" ) ;
104
+ assert_eq ! ( & * i. get( Name ( 6 ) ) , "zebra" ) ;
105
+ assert_eq ! ( & * i. get( Name ( 0 ) ) , "dog" ) ;
106
+ assert_eq ! ( & * i. get( Name ( 1 ) ) , "cat" ) ;
107
+ assert_eq ! ( & * i. get( Name ( 2 ) ) , "zebra" ) ;
108
+ assert_eq ! ( & * i. get( Name ( 3 ) ) , "zebra" ) ;
109
+ assert_eq ! ( & * i. get( Name ( 4 ) ) , "dog" ) ;
120
110
}
121
111
}
0 commit comments