about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2014-10-31 05:41:25 -0400
committerNiko Matsakis <niko@alum.mit.edu>2014-11-05 09:15:28 -0500
commit33ef78fa8bbe9b8d05ba0da607d4da5e31475a95 (patch)
tree774228e56b93cc095456f45929824f2c667b11cf /src/libcore
parent4af52eee59ff25a7f636798bdbc3f1bec985828f (diff)
downloadrust-33ef78fa8bbe9b8d05ba0da607d4da5e31475a95.tar.gz
rust-33ef78fa8bbe9b8d05ba0da607d4da5e31475a95.zip
Add impls of the comparison operators for fixed-length arrays of lengths 0...32 and repair various cases where slices and fixed-length arrays were being compared.
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/array.rs87
-rw-r--r--src/libcore/lib.rs4
2 files changed, 91 insertions, 0 deletions
diff --git a/src/libcore/array.rs b/src/libcore/array.rs
new file mode 100644
index 00000000000..999574b4d7d
--- /dev/null
+++ b/src/libcore/array.rs
@@ -0,0 +1,87 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+/*!
+ * Implementations of things like `Eq` for fixed-length arrays
+ * up to a certain length. Eventually we should able to generalize
+ * to all lengths.
+ */
+
+#![doc(primitive = "tuple")]
+#![stable]
+
+#[unstable = "this is just a documentation module and should not be part \
+              of the public api"]
+pub use unit;
+
+use cmp::*;
+use option::{Option};
+
+// macro for implementing n-ary tuple functions and operations
+macro_rules! array_impls {
+    ($($N:expr)+) => {
+        $(
+            #[unstable = "waiting for PartialEq to stabilize"]
+            impl<T:PartialEq> PartialEq for [T, ..$N] {
+                #[inline]
+                fn eq(&self, other: &[T, ..$N]) -> bool {
+                    self[] == other[]
+                }
+                #[inline]
+                fn ne(&self, other: &[T, ..$N]) -> bool {
+                    self[] != other[]
+                }
+            }
+
+            #[unstable = "waiting for Eq to stabilize"]
+            impl<T:Eq> Eq for [T, ..$N] { }
+
+            #[unstable = "waiting for PartialOrd to stabilize"]
+            impl<T:PartialOrd> PartialOrd for [T, ..$N] {
+                #[inline]
+                fn partial_cmp(&self, other: &[T, ..$N]) -> Option<Ordering> {
+                    PartialOrd::partial_cmp(&self[], &other[])
+                }
+                #[inline]
+                fn lt(&self, other: &[T, ..$N]) -> bool {
+                    PartialOrd::lt(&self[], &other[])
+                }
+                #[inline]
+                fn le(&self, other: &[T, ..$N]) -> bool {
+                    PartialOrd::le(&self[], &other[])
+                }
+                #[inline]
+                fn ge(&self, other: &[T, ..$N]) -> bool {
+                    PartialOrd::ge(&self[], &other[])
+                }
+                #[inline]
+                fn gt(&self, other: &[T, ..$N]) -> bool {
+                    PartialOrd::gt(&self[], &other[])
+                }
+            }
+
+            #[unstable = "waiting for Ord to stabilize"]
+            impl<T:Ord> Ord for [T, ..$N] {
+                #[inline]
+                fn cmp(&self, other: &[T, ..$N]) -> Ordering {
+                    Ord::cmp(&self[], &other[])
+                }
+            }
+        )+
+    }
+}
+
+array_impls! {
+     0  1  2  3  4  5  6  7  8  9
+    10 11 12 13 14 15 16 17 18 19
+    20 21 22 23 24 25 26 27 28 29
+    30 31 32
+}
+
diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs
index 7c5c54c6d8a..d9a0c398605 100644
--- a/src/libcore/lib.rs
+++ b/src/libcore/lib.rs
@@ -126,6 +126,10 @@ pub mod tuple;
 pub mod unit;
 pub mod fmt;
 
+// note: does not need to be public
+#[cfg(not(stage0))]
+mod array;
+
 #[doc(hidden)]
 mod core {
     pub use panicking;