about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2012-07-27 14:51:19 -0700
committerPatrick Walton <pcwalton@mimiga.net>2012-07-27 14:52:46 -0700
commit01e2471cb7bc7f84863bdb0d67cfa2af16d54f9e (patch)
treedd3e607ce180e39a3f1a6ee9bf123fda13db3dbd /src
parentb6aadf56c8a6e603c79a8924e6a92398471de8cf (diff)
core: Trait-ify various overloaded operators
Diffstat (limited to 'src')
-rw-r--r--src/libcore/dvec.rs7
-rw-r--r--src/libcore/str.rs8
-rw-r--r--src/libcore/vec.rs14
-rw-r--r--src/libstd/bitv.rs10
-rw-r--r--src/libstd/map.rs8
-rw-r--r--src/libstd/smallintmap.rs12
-rw-r--r--src/rustc/middle/trans/shape.rs1
7 files changed, 55 insertions, 5 deletions
diff --git a/src/libcore/dvec.rs b/src/libcore/dvec.rs
index 60cb1b51be6..1a1aeeadeb6 100644
--- a/src/libcore/dvec.rs
+++ b/src/libcore/dvec.rs
@@ -310,3 +310,10 @@ impl extensions<A:copy> for dvec<A> {
         do self.swap |v| { vec::reachi(v, f); v }
     }
 }
+
+impl extensions<A:copy> of ops::index<uint,A> for dvec<A> {
+    pure fn index(&&idx: uint) -> A {
+        self.get_elt(idx)
+    }
+}
+
diff --git a/src/libcore/str.rs b/src/libcore/str.rs
index 9b142adf165..c56af8442f6 100644
--- a/src/libcore/str.rs
+++ b/src/libcore/str.rs
@@ -1897,7 +1897,6 @@ trait unique_str {
     fn trim() -> self;
     fn trim_left() -> self;
     fn trim_right() -> self;
-    pure fn +(rhs: &str) -> self;
 }
 
 /// Extension methods for strings
@@ -1919,6 +1918,13 @@ impl extensions of unique_str for ~str {
     }
 }
 
+impl extensions of ops::add<&str,~str> for ~str {
+    #[inline(always)]
+    pure fn add(rhs: &str) -> ~str {
+        append(self, rhs)
+    }
+}
+
 trait str_slice {
     fn all(it: fn(char) -> bool) -> bool;
     fn any(it: fn(char) -> bool) -> bool;
diff --git a/src/libcore/vec.rs b/src/libcore/vec.rs
index c07dd9b8224..a97c8f8601a 100644
--- a/src/libcore/vec.rs
+++ b/src/libcore/vec.rs
@@ -1299,6 +1299,13 @@ impl extensions<T: copy> of vec_concat<T> for ~[T] {
     }
 }
 
+impl extensions<T: copy> of ops::add<&[const T],~[T]> for ~[T] {
+    #[inline(always)]
+    pure fn add(rhs: &[const T]) -> ~[T] {
+        append(self, rhs)
+    }
+}
+
 impl extensions<T: copy> of vec_concat<T> for ~[mut T] {
     #[inline(always)]
     pure fn +(rhs: &[const T]) -> ~[mut T] {
@@ -1306,6 +1313,13 @@ impl extensions<T: copy> of vec_concat<T> for ~[mut T] {
     }
 }
 
+impl extensions<T: copy> of ops::add<&[const T],~[mut T]> for ~[mut T] {
+    #[inline(always)]
+    pure fn add(rhs: &[const T]) -> ~[mut T] {
+        append_mut(self, rhs)
+    }
+}
+
 trait const_vector {
     pure fn is_empty() -> bool;
     pure fn is_not_empty() -> bool;
diff --git a/src/libstd/bitv.rs b/src/libstd/bitv.rs
index adb7f56ef3b..145ceba4ae5 100644
--- a/src/libstd/bitv.rs
+++ b/src/libstd/bitv.rs
@@ -239,7 +239,7 @@ trait methods {
     fn union(rhs: bitv) -> bool;
     fn intersect(rhs: bitv) -> bool;
     fn assign(rhs: bitv) -> bool;
-    fn get(i: uint) -> bool;
+    pure fn get(i: uint) -> bool;
     fn [](i: uint) -> bool;
     fn eq(rhs: bitv) -> bool;
     fn clear();
@@ -261,7 +261,7 @@ impl of methods for bitv {
     fn union(rhs: bitv) -> bool { union(self, rhs) }
     fn intersect(rhs: bitv) -> bool { intersect(self, rhs) }
     fn assign(rhs: bitv) -> bool { assign(self, rhs) }
-    fn get(i: uint) -> bool { get(self, i) }
+    pure fn get(i: uint) -> bool { get(self, i) }
     fn [](i: uint) -> bool { self.get(i) }
     fn eq(rhs: bitv) -> bool { equal(self, rhs) }
     fn clear() { clear(self) }
@@ -285,6 +285,12 @@ impl of methods for bitv {
     }
 }
 
+impl extensions of ops::index<uint,bool> for bitv {
+    pure fn index(&&i: uint) -> bool {
+        self.get(i)
+    }
+}
+
 impl of to_str::to_str for bitv {
     fn to_str() -> ~str { to_str(self) }
 }
diff --git a/src/libstd/map.rs b/src/libstd/map.rs
index afb5f28ae08..2522c9d5876 100644
--- a/src/libstd/map.rs
+++ b/src/libstd/map.rs
@@ -314,6 +314,14 @@ mod chained {
         }
     }
 
+    impl hashmap<K, V: copy> of ops::index<K, V> for t<K, V> {
+        pure fn index(k: K) -> V {
+            unchecked {
+                self.get(k)
+            }
+        }
+    }
+
 
     fn chains<K,V>(nchains: uint) -> ~[mut chain<K,V>] {
         ret vec::to_mut(vec::from_elem(nchains, absent));
diff --git a/src/libstd/smallintmap.rs b/src/libstd/smallintmap.rs
index 02948f58fc4..0325ef3ac2e 100644
--- a/src/libstd/smallintmap.rs
+++ b/src/libstd/smallintmap.rs
@@ -35,7 +35,7 @@ fn insert<T: copy>(self: smallintmap<T>, key: uint, val: T) {
  * Get the value for the specified key. If the key does not exist
  * in the map then returns none
  */
-fn find<T: copy>(self: smallintmap<T>, key: uint) -> option<T> {
+pure fn find<T: copy>(self: smallintmap<T>, key: uint) -> option<T> {
     if key < self.v.len() { ret self.v.get_elt(key); }
     ret none::<T>;
 }
@@ -47,7 +47,7 @@ fn find<T: copy>(self: smallintmap<T>, key: uint) -> option<T> {
  *
  * If the key does not exist in the map
  */
-fn get<T: copy>(self: smallintmap<T>, key: uint) -> T {
+pure fn get<T: copy>(self: smallintmap<T>, key: uint) -> T {
     alt find(self, key) {
       none { #error("smallintmap::get(): key not present"); fail; }
       some(v) { ret v; }
@@ -114,6 +114,14 @@ impl <V: copy> of map::map<uint, V> for smallintmap<V> {
     }
 }
 
+impl extensions<V: copy> of ops::index<uint, V> for smallintmap<V> {
+    pure fn index(&&key: uint) -> V {
+        unchecked {
+            get(self, key)
+        }
+    }
+}
+
 /// Cast the given smallintmap to a map::map
 fn as_map<V: copy>(s: smallintmap<V>) -> map::map<uint, V> {
     s as map::map::<uint, V>
diff --git a/src/rustc/middle/trans/shape.rs b/src/rustc/middle/trans/shape.rs
index 71a15b7f05e..279709a01b9 100644
--- a/src/rustc/middle/trans/shape.rs
+++ b/src/rustc/middle/trans/shape.rs
@@ -16,6 +16,7 @@ import syntax::util::interner;
 import util::ppaux::ty_to_str;
 import syntax::codemap::span;
 import dvec::{dvec, extensions};
+import vec::extensions;
 
 import std::map::hashmap;
 import option::is_some;