about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-04-19 19:24:52 -0700
committerbors <bors@rust-lang.org>2013-04-19 19:24:52 -0700
commit8b3c09a1038c6623528fd7ebb1d365e475d63dfc (patch)
treecccb89a294c2efb90a4a319fdd50b0fc0cf6c6e5 /src/libsyntax/parse
parent6510fd92544467a03df93b5124644976aa79f964 (diff)
parentd2b644842a75af44d042f4026a585e4a9cf5979a (diff)
downloadrust-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.rs26
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 {