From 6c547e42c859b1b0051293c48c691d8388bad332 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Sat, 15 Jun 2013 02:20:06 -0400 Subject: [PATCH 1/5] rm vec::uniq_len --- src/libextra/flatpipes.rs | 8 +++----- src/libextra/net_tcp.rs | 5 ++--- src/libextra/priority_queue.rs | 4 ++-- src/libextra/sha1.rs | 2 +- src/libextra/smallintmap.rs | 10 +++++----- src/libextra/test.rs | 2 +- src/libstd/comm.rs | 2 +- src/libstd/container.rs | 4 ++-- src/libstd/io.rs | 2 +- src/libstd/repr.rs | 5 +++-- src/libstd/rt/io/extensions.rs | 3 ++- src/libstd/vec.rs | 28 ++++++++++++++++------------ 12 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/libextra/flatpipes.rs b/src/libextra/flatpipes.rs index c0f619c1b858d..4ff67fc3f42c2 100644 --- a/src/libextra/flatpipes.rs +++ b/src/libextra/flatpipes.rs @@ -583,12 +583,12 @@ pub mod bytepipes { impl BytePort for PipeBytePort { fn try_recv(&self, count: uint) -> Option<~[u8]> { - if vec::uniq_len(&const *self.buf) >= count { + if self.buf.len() >= count { let mut bytes = ::core::util::replace(&mut *self.buf, ~[]); *self.buf = bytes.slice(count, bytes.len()).to_owned(); bytes.truncate(count); return Some(bytes); - } else if vec::uniq_len(&const *self.buf) > 0 { + } else if !self.buf.is_empty() { let mut bytes = ::core::util::replace(&mut *self.buf, ~[]); assert!(count > bytes.len()); match self.try_recv(count - bytes.len()) { @@ -598,7 +598,7 @@ pub mod bytepipes { } None => return None } - } else if vec::uniq_len(&const *self.buf) == 0 { + } else /* empty */ { match self.port.try_recv() { Some(buf) => { assert!(!buf.is_empty()); @@ -607,8 +607,6 @@ pub mod bytepipes { } None => return None } - } else { - ::core::util::unreachable() } } } diff --git a/src/libextra/net_tcp.rs b/src/libextra/net_tcp.rs index d95807f2b91c4..28b3700399a6e 100644 --- a/src/libextra/net_tcp.rs +++ b/src/libextra/net_tcp.rs @@ -879,8 +879,7 @@ impl io::Reader for TcpSocketBuf { // If possible, copy up to `len` bytes from the internal // `data.buf` into `buf` - let nbuffered = vec::uniq_len(&const self.data.buf) - - self.data.buf_off; + let nbuffered = self.data.buf.len() - self.data.buf_off; let needed = len - count; if nbuffered > 0 { unsafe { @@ -934,7 +933,7 @@ impl io::Reader for TcpSocketBuf { } fn read_byte(&self) -> int { loop { - if vec::uniq_len(&const self.data.buf) > self.data.buf_off { + if self.data.buf.len() > self.data.buf_off { let c = self.data.buf[self.data.buf_off]; self.data.buf_off += 1; return c as int diff --git a/src/libextra/priority_queue.rs b/src/libextra/priority_queue.rs index 601b7685f3ca8..efbf23f11b15c 100644 --- a/src/libextra/priority_queue.rs +++ b/src/libextra/priority_queue.rs @@ -35,10 +35,10 @@ impl BaseIter for PriorityQueue { impl Container for PriorityQueue { /// Returns the length of the queue - fn len(&const self) -> uint { vec::uniq_len(&const self.data) } + fn len(&self) -> uint { self.data.len() } /// Returns true if a queue contains no elements - fn is_empty(&const self) -> bool { self.len() == 0 } + fn is_empty(&self) -> bool { self.len() == 0 } } impl Mutable for PriorityQueue { diff --git a/src/libextra/sha1.rs b/src/libextra/sha1.rs index 908e497b9591b..0c35630345b4d 100644 --- a/src/libextra/sha1.rs +++ b/src/libextra/sha1.rs @@ -93,7 +93,7 @@ pub fn sha1() -> @Sha1 { } fn process_msg_block(st: &mut Sha1State) { assert_eq!(st.h.len(), digest_buf_len); - assert_eq!(vec::uniq_len(st.work_buf), work_buf_len); + assert_eq!(st.work_buf.len(), work_buf_len); let mut t: int; // Loop counter let w = st.work_buf; diff --git a/src/libextra/smallintmap.rs b/src/libextra/smallintmap.rs index 7f566bc16e732..dae9113b3a9da 100644 --- a/src/libextra/smallintmap.rs +++ b/src/libextra/smallintmap.rs @@ -32,9 +32,9 @@ pub struct SmallIntMap { impl Container for SmallIntMap { /// Return the number of elements in the map - fn len(&const self) -> uint { + fn len(&self) -> uint { let mut sz = 0; - for uint::range(0, vec::uniq_len(&const self.v)) |i| { + for uint::range(0, self.v.len()) |i| { match self.v[i] { Some(_) => sz += 1, None => {} @@ -44,7 +44,7 @@ impl Container for SmallIntMap { } /// Return true if the map contains no elements - fn is_empty(&const self) -> bool { self.len() == 0 } + fn is_empty(&self) -> bool { self.len() == 0 } } impl Mutable for SmallIntMap { @@ -199,12 +199,12 @@ pub struct SmallIntSet { impl Container for SmallIntSet { /// Return the number of elements in the map - fn len(&const self) -> uint { + fn len(&self) -> uint { self.map.len() } /// Return true if the map contains no elements - fn is_empty(&const self) -> bool { self.len() == 0 } + fn is_empty(&self) -> bool { self.len() == 0 } } impl Mutable for SmallIntSet { diff --git a/src/libextra/test.rs b/src/libextra/test.rs index 406dfb086eace..a465cef09e6be 100644 --- a/src/libextra/test.rs +++ b/src/libextra/test.rs @@ -365,7 +365,7 @@ pub fn run_tests_console(opts: &TestOpts, fn print_failures(st: &ConsoleTestState) { st.out.write_line("\nfailures:"); let mut failures = ~[]; - for uint::range(0, vec::uniq_len(&const st.failures)) |i| { + for uint::range(0, st.failures.len()) |i| { let name = copy st.failures[i].name; failures.push(name.to_str()); } diff --git a/src/libstd/comm.rs b/src/libstd/comm.rs index f0c353c8d62b6..bcdd6cd0bfa60 100644 --- a/src/libstd/comm.rs +++ b/src/libstd/comm.rs @@ -209,7 +209,7 @@ impl Peekable for PortSet { fn peek(&self) -> bool { // It'd be nice to use self.port.each, but that version isn't // pure. - for uint::range(0, vec::uniq_len(&const self.ports)) |i| { + for uint::range(0, self.ports.len()) |i| { let port: &pipesy::Port = &self.ports[i]; if port.peek() { return true; diff --git a/src/libstd/container.rs b/src/libstd/container.rs index 065582e2e0d2e..c1b656f1cd9e6 100644 --- a/src/libstd/container.rs +++ b/src/libstd/container.rs @@ -16,10 +16,10 @@ use option::Option; /// knowledge known is the number of elements contained within. pub trait Container { /// Return the number of elements in the container - fn len(&const self) -> uint; + fn len(&self) -> uint; /// Return true if the container contains no elements - fn is_empty(&const self) -> bool; + fn is_empty(&self) -> bool; } /// A trait to represent mutable containers diff --git a/src/libstd/io.rs b/src/libstd/io.rs index 6f065d74fa2e6..d3faa75e3b044 100644 --- a/src/libstd/io.rs +++ b/src/libstd/io.rs @@ -1667,7 +1667,7 @@ impl Writer for BytesWriter { fn seek(&self, offset: int, whence: SeekStyle) { let pos = *self.pos; - let len = vec::uniq_len(&const *self.bytes); + let len = self.bytes.len(); *self.pos = seek_in_buf(offset, pos, len, whence); } diff --git a/src/libstd/repr.rs b/src/libstd/repr.rs index 46f69d020d1ec..b7ff1acea1394 100644 --- a/src/libstd/repr.rs +++ b/src/libstd/repr.rs @@ -18,6 +18,7 @@ More runtime type reflection use cast::transmute; use char; +use container::Container; use intrinsic; use intrinsic::{TyDesc, TyVisitor, visit_tydesc}; use intrinsic::Opaque; @@ -502,7 +503,7 @@ impl TyVisitor for ReprVisitor { _offset: uint, inner: *TyDesc) -> bool { - match self.var_stk[vec::uniq_len(&const *self.var_stk) - 1] { + match self.var_stk[self.var_stk.len() - 1] { Matched => { if i != 0 { self.writer.write_str(", "); @@ -520,7 +521,7 @@ impl TyVisitor for ReprVisitor { _disr_val: int, n_fields: uint, _name: &str) -> bool { - match self.var_stk[vec::uniq_len(&const *self.var_stk) - 1] { + match self.var_stk[self.var_stk.len() - 1] { Matched => { if n_fields > 0 { self.writer.write_char(')'); diff --git a/src/libstd/rt/io/extensions.rs b/src/libstd/rt/io/extensions.rs index 727ab13a4f6f7..a5e68bcdac4cf 100644 --- a/src/libstd/rt/io/extensions.rs +++ b/src/libstd/rt/io/extensions.rs @@ -297,7 +297,8 @@ impl ReaderUtil for T { do (|| { while total_read < len { - let slice = vec::mut_slice(*buf, start_len + total_read, buf.len()); + let len = buf.len(); + let slice = vec::mut_slice(*buf, start_len + total_read, len); match self.read(slice) { Some(nread) => { total_read += nread; diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index 211ee12c29105..44f3fc4c32121 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -118,15 +118,6 @@ pub fn capacity(v: &const ~[T]) -> uint { } } -// A botch to tide us over until core and std are fully demuted. -#[allow(missing_doc)] -pub fn uniq_len(v: &const ~[T]) -> uint { - unsafe { - let v: &~[T] = transmute(v); - as_const_buf(*v, |_p, len| len) - } -} - /** * Creates and initializes an owned vector. * @@ -1767,19 +1758,32 @@ pub mod traits { } } -impl<'self,T> Container for &'self const [T] { +impl<'self, T> Container for &'self const [T] { /// Returns true if a vector contains no elements #[inline] - fn is_empty(&const self) -> bool { + fn is_empty(&self) -> bool { as_const_buf(*self, |_p, len| len == 0u) } /// Returns the length of a vector #[inline] - fn len(&const self) -> uint { + fn len(&self) -> uint { as_const_buf(*self, |_p, len| len) } +} +impl Container for ~[T] { + /// Returns true if a vector contains no elements + #[inline] + fn is_empty(&self) -> bool { + as_const_buf(*self, |_p, len| len == 0u) + } + + /// Returns the length of a vector + #[inline] + fn len(&self) -> uint { + as_const_buf(*self, |_p, len| len) + } } #[allow(missing_doc)] From e097d5eaba1459fa22b7679712e8e9d0fd27a242 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Sat, 15 Jun 2013 03:16:10 -0400 Subject: [PATCH 2/5] rm CopyableOrderedIter replaced with OrdIterator --- src/librustc/middle/trans/adt.rs | 4 ++-- src/libstd/old_iter.rs | 5 ----- src/libstd/prelude.rs | 4 ++-- src/libstd/vec.rs | 17 ----------------- src/libsyntax/opt_vec.rs | 7 ------- 5 files changed, 4 insertions(+), 33 deletions(-) diff --git a/src/librustc/middle/trans/adt.rs b/src/librustc/middle/trans/adt.rs index ad07f41f8c30e..9ae241c7030fc 100644 --- a/src/librustc/middle/trans/adt.rs +++ b/src/librustc/middle/trans/adt.rs @@ -165,7 +165,7 @@ fn represent_type_uncached(cx: &mut CrateContext, t: ty::t) -> Repr { if cases.all(|c| c.tys.len() == 0) { // All bodies empty -> intlike let discrs = cases.map(|c| c.discr); - return CEnum(discrs.min(), discrs.max()); + return CEnum(*discrs.iter().min().unwrap(), *discrs.iter().max().unwrap()); } if cases.len() == 1 { @@ -509,7 +509,7 @@ pub fn trans_const(ccx: &mut CrateContext, r: &Repr, discr: int, } General(ref cases) => { let case = &cases[discr as uint]; - let max_sz = cases.map(|s| s.size).max(); + let max_sz = cases.iter().transform(|x| x.size).max().unwrap(); let discr_ty = C_int(ccx, discr); let contents = build_const_struct(ccx, case, ~[discr_ty] + vals); diff --git a/src/libstd/old_iter.rs b/src/libstd/old_iter.rs index 9fea437681615..39f3a81ad218f 100644 --- a/src/libstd/old_iter.rs +++ b/src/libstd/old_iter.rs @@ -54,11 +54,6 @@ pub trait CopyableIter { fn find(&self, p: &fn(&A) -> bool) -> Option; } -pub trait CopyableOrderedIter { - fn min(&self) -> A; - fn max(&self) -> A; -} - // A trait for sequences that can be built by imperatively pushing elements // onto them. pub trait Buildable { diff --git a/src/libstd/prelude.rs b/src/libstd/prelude.rs index 61b8d36266e20..60165ed5daebe 100644 --- a/src/libstd/prelude.rs +++ b/src/libstd/prelude.rs @@ -47,9 +47,9 @@ pub use char::Char; pub use container::{Container, Mutable, Map, Set}; pub use hash::Hash; pub use old_iter::{BaseIter, ReverseIter, ExtendedIter, EqIter}; -pub use old_iter::{CopyableIter, CopyableOrderedIter}; +pub use old_iter::CopyableIter; pub use iter::{Times, FromIter}; -pub use iterator::{Iterator, IteratorUtil}; +pub use iterator::{Iterator, IteratorUtil, OrdIterator}; pub use num::{Num, NumCast}; pub use num::{Orderable, Signed, Unsigned, Round}; pub use num::{Algebraic, Trigonometric, Exponential, Hyperbolic}; diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index 44f3fc4c32121..7b4764164b54c 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -2619,23 +2619,6 @@ impl old_iter::CopyableIter for @[A] { } } -impl<'self,A:Copy + Ord> old_iter::CopyableOrderedIter for &'self [A] { - fn min(&self) -> A { old_iter::min(self) } - fn max(&self) -> A { old_iter::max(self) } -} - -// FIXME(#4148): This should be redundant -impl old_iter::CopyableOrderedIter for ~[A] { - fn min(&self) -> A { old_iter::min(self) } - fn max(&self) -> A { old_iter::max(self) } -} - -// FIXME(#4148): This should be redundant -impl old_iter::CopyableOrderedIter for @[A] { - fn min(&self) -> A { old_iter::min(self) } - fn max(&self) -> A { old_iter::max(self) } -} - impl Clone for ~[A] { #[inline] fn clone(&self) -> ~[A] { diff --git a/src/libsyntax/opt_vec.rs b/src/libsyntax/opt_vec.rs index 791f7444b6226..67e712f0596c9 100644 --- a/src/libsyntax/opt_vec.rs +++ b/src/libsyntax/opt_vec.rs @@ -196,10 +196,3 @@ impl old_iter::CopyableIter for OptVec { old_iter::find(self, f) } } - -impl old_iter::CopyableOrderedIter for OptVec { - #[inline(always)] - fn min(&self) -> A { old_iter::min(self) } - #[inline(always)] - fn max(&self) -> A { old_iter::max(self) } -} From 52a38b80976be2025b466c144030bb7e7165d32b Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Sat, 15 Jun 2013 18:20:43 -0400 Subject: [PATCH 3/5] fix test --- src/libstd/os.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/libstd/os.rs b/src/libstd/os.rs index 044b305a0dd9d..fffcb34dc09c9 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -1685,10 +1685,11 @@ mod tests { assert!((ostream as uint != 0u)); let s = ~"hello"; let mut buf = s.as_bytes_with_null().to_owned(); + let len = buf.len(); do vec::as_mut_buf(buf) |b, _len| { - assert!((libc::fwrite(b as *c_void, 1u as size_t, - (s.len() + 1u) as size_t, ostream) - == buf.len() as size_t)) + assert_eq!(libc::fwrite(b as *c_void, 1u as size_t, + (s.len() + 1u) as size_t, ostream), + len as size_t) } assert_eq!(libc::fclose(ostream), (0u as c_int)); let in_mode = in.get_mode(); From 845465ee246bee760b8ef0da725f8a711bfc23c9 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Sat, 15 Jun 2013 19:24:20 -0400 Subject: [PATCH 4/5] old_iter: rm the min/max free functions --- src/libstd/old_iter.rs | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/src/libstd/old_iter.rs b/src/libstd/old_iter.rs index 39f3a81ad218f..347b477442287 100644 --- a/src/libstd/old_iter.rs +++ b/src/libstd/old_iter.rs @@ -187,40 +187,6 @@ pub fn position>(this: &IA, f: &fn(&A) -> bool) return None; } -// note: 'rposition' would only make sense to provide with a bidirectional -// iter interface, such as would provide "reach" in addition to "each". As is, -// it would have to be implemented with foldr, which is too inefficient. - -#[inline(always)] -pub fn min>(this: &IA) -> A { - match do foldl::,IA>(this, None) |a, b| { - match a { - &Some(ref a_) if *a_ < *b => { - *(a) - } - _ => Some(*b) - } - } { - Some(val) => val, - None => fail!("min called on empty iterator") - } -} - -#[inline(always)] -pub fn max>(this: &IA) -> A { - match do foldl::,IA>(this, None) |a, b| { - match a { - &Some(ref a_) if *a_ > *b => { - *(a) - } - _ => Some(*b) - } - } { - Some(val) => val, - None => fail!("max called on empty iterator") - } -} - #[inline(always)] pub fn find>(this: &IA, f: &fn(&A) -> bool) -> Option { From 7f00ab3df10b8b648872edf25fb1700168b306de Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Sat, 15 Jun 2013 20:53:30 -0400 Subject: [PATCH 5/5] fix benchmark and the tutorials --- doc/tutorial-tasks.md | 2 +- doc/tutorial.md | 9 ++------- src/test/bench/shootout-fasta-redux.rs | 3 ++- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/doc/tutorial-tasks.md b/doc/tutorial-tasks.md index b00cd665271f6..2e3ce40c9f7dc 100644 --- a/doc/tutorial-tasks.md +++ b/doc/tutorial-tasks.md @@ -359,7 +359,7 @@ fn pnorm(nums: &~[float], p: uint) -> float { fn main() { let numbers = vec::from_fn(1000000, |_| rand::random::()); - println(fmt!("Inf-norm = %?", numbers.max())); + println(fmt!("Inf-norm = %?", *numbers.iter().max().unwrap())); let numbers_arc = ARC(numbers); diff --git a/doc/tutorial.md b/doc/tutorial.md index a458036116665..c0b939ddac50f 100644 --- a/doc/tutorial.md +++ b/doc/tutorial.md @@ -2039,17 +2039,12 @@ themselves contain type parameters. A trait for generalized sequence types might look like the following: ~~~~ -# use std::vec; trait Seq { - fn len(&self) -> uint; - fn iter(&self, b: &fn(v: &T)); + fn length(&self) -> uint; } impl Seq for ~[T] { - fn len(&self) -> uint { self.len() } - fn iter(&self, b: &fn(v: &T)) { - for vec::each(*self) |elt| { b(elt); } - } + fn length(&self) -> uint { self.len() } } ~~~~ diff --git a/src/test/bench/shootout-fasta-redux.rs b/src/test/bench/shootout-fasta-redux.rs index 8b587f02ad6d9..8c8b26afa08b1 100644 --- a/src/test/bench/shootout-fasta-redux.rs +++ b/src/test/bench/shootout-fasta-redux.rs @@ -95,7 +95,8 @@ impl RepeatFasta { let alu: &[u8] = self.alu.as_bytes(); copy_memory(buf, alu, alu_len); - copy_memory(vec::mut_slice(buf, alu_len, buf.len()), + let buf_len = buf.len(); + copy_memory(vec::mut_slice(buf, alu_len, buf_len), alu, LINE_LEN);