diff options
| author | bors <bors@rust-lang.org> | 2013-04-19 19:24:52 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-04-19 19:24:52 -0700 |
| commit | 8b3c09a1038c6623528fd7ebb1d365e475d63dfc (patch) | |
| tree | cccb89a294c2efb90a4a319fdd50b0fc0cf6c6e5 /src/libsyntax/parse | |
| parent | 6510fd92544467a03df93b5124644976aa79f964 (diff) | |
| parent | d2b644842a75af44d042f4026a585e4a9cf5979a (diff) | |
| download | rust-8b3c09a1038c6623528fd7ebb1d365e475d63dfc.tar.gz rust-8b3c09a1038c6623528fd7ebb1d365e475d63dfc.zip | |
auto merge of #5962 : pcwalton/rust/shootout, r=pcwalton
r? @brson
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/token.rs | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index cf05a4375a8..2483cacd1a6 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -18,9 +18,11 @@ use util::interner; use core::cast; use core::char; +use core::cmp::Equiv; use core::hashmap::HashSet; use core::str; use core::task; +use core::to_bytes; #[auto_encode] #[auto_decode] @@ -355,16 +357,29 @@ pub mod special_idents { pub static type_self: ident = ident { repr: 36u, ctxt: 0}; // `Self` } +pub struct StringRef<'self>(&'self str); + +impl<'self> Equiv<@~str> for StringRef<'self> { + #[inline(always)] + fn equiv(&self, other: &@~str) -> bool { str::eq_slice(**self, **other) } +} + +impl<'self> to_bytes::IterBytes for StringRef<'self> { + fn iter_bytes(&self, lsb0: bool, f: to_bytes::Cb) { + (**self).iter_bytes(lsb0, f); + } +} + pub struct ident_interner { priv interner: Interner<@~str>, } pub impl ident_interner { fn intern(&self, val: @~str) -> ast::ident { - ast::ident { repr: self.interner.intern(val), ctxt: 0} + ast::ident { repr: self.interner.intern(val), ctxt: 0 } } fn gensym(&self, val: @~str) -> ast::ident { - ast::ident { repr: self.interner.gensym(val), ctxt: 0} + ast::ident { repr: self.interner.gensym(val), ctxt: 0 } } fn get(&self, idx: ast::ident) -> @~str { self.interner.get(idx.repr) @@ -372,6 +387,13 @@ pub impl ident_interner { fn len(&self) -> uint { self.interner.len() } + fn find_equiv<Q:Hash + IterBytes + Equiv<@~str>>(&self, val: &Q) + -> Option<ast::ident> { + match self.interner.find_equiv(val) { + Some(v) => Some(ast::ident { repr: v, ctxt: 0 }), + None => None, + } + } } pub fn mk_ident_interner() -> @ident_interner { |
