Skip to content

Commit c403c1f

Browse files
committed
Clean up SmallVector use a bit
1 parent c144752 commit c403c1f

File tree

3 files changed

+38
-108
lines changed

3 files changed

+38
-108
lines changed

Diff for: src/librustc/middle/astencode.rs

+4-10
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ use syntax::codemap;
3333
use syntax::fold::*;
3434
use syntax::fold;
3535
use syntax::parse::token;
36-
use syntax::util::small_vector::SmallVector;
3736
use syntax;
3837

3938
use std::at_vec;
@@ -348,20 +347,14 @@ fn simplify_ast(ii: &ast::inlined_item) -> ast::inlined_item {
348347

349348
match *ii {
350349
//hack: we're not dropping items
351-
ast::ii_item(i) => ast::ii_item(get_only_one(fld.fold_item(i))),
350+
ast::ii_item(i) => ast::ii_item(fld.fold_item(i)
351+
.expect_one("expected one item")),
352352
ast::ii_method(d, is_provided, m) =>
353353
ast::ii_method(d, is_provided, fld.fold_method(m)),
354354
ast::ii_foreign(i) => ast::ii_foreign(fld.fold_foreign_item(i))
355355
}
356356
}
357357

358-
fn get_only_one<T>(mut v: SmallVector<T>) -> T {
359-
if v.len() != 1 {
360-
fail!("Attempting to extract unique member but there isn't one");
361-
}
362-
v.pop()
363-
}
364-
365358
fn decode_ast(par_doc: ebml::Doc) -> ast::inlined_item {
366359
let chi_doc = par_doc.get(c::tag_tree as uint);
367360
let mut d = reader::Decoder(chi_doc);
@@ -387,7 +380,8 @@ fn renumber_ast(xcx: @ExtendedDecodeContext, ii: ast::inlined_item)
387380
xcx: xcx,
388381
};
389382
match ii {
390-
ast::ii_item(i) => ast::ii_item(get_only_one(fld.fold_item(i))),
383+
ast::ii_item(i) => ast::ii_item(fld.fold_item(i)
384+
.expect_one("expected one item")),
391385
ast::ii_method(d, is_provided, m) =>
392386
ast::ii_method(xcx.tr_def_id(d), is_provided, fld.fold_method(m)),
393387
ast::ii_foreign(i) => ast::ii_foreign(fld.fold_foreign_item(i)),

Diff for: src/libsyntax/ext/expand.rs

+7-19
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,9 @@ pub fn expand_block_elts(exts: SyntaxEnv, b: &Block, fld: &MacroExpander)
678678
let rename_fld = renames_to_fold(pending_renames);
679679
let new_view_items = b.view_items.map(|x| fld.fold_view_item(x));
680680
let new_stmts = b.stmts.iter()
681-
.flat_map(|x| fld.fold_stmt(mustbeone(rename_fld.fold_stmt(*x))).move_iter())
681+
.map(|x| rename_fld.fold_stmt(*x)
682+
.expect_one("rename_fold didn't return one value"))
683+
.flat_map(|x| fld.fold_stmt(x).move_iter())
682684
.collect();
683685
let new_expr = b.expr.map(|x| fld.fold_expr(rename_fld.fold_expr(x)));
684686
Block{
@@ -691,14 +693,6 @@ pub fn expand_block_elts(exts: SyntaxEnv, b: &Block, fld: &MacroExpander)
691693
}
692694
}
693695

694-
// rename_fold should never return anything other than one thing
695-
fn mustbeone<T>(mut val : SmallVector<T>) -> T {
696-
if val.len() != 1 {
697-
fail!("rename_fold didn't return one value");
698-
}
699-
val.pop()
700-
}
701-
702696
// get the (innermost) BlockInfo from an exts stack
703697
fn get_block_info(exts : SyntaxEnv) -> BlockInfo {
704698
match exts.find_in_topmost_frame(&intern(special_block_name)) {
@@ -734,11 +728,8 @@ pub fn renames_to_fold(renames: @mut ~[(ast::Ident,ast::Name)]) -> @ast_fold {
734728

735729
// perform a bunch of renames
736730
fn apply_pending_renames(folder : @ast_fold, stmt : ast::Stmt) -> @ast::Stmt {
737-
let mut stmts = folder.fold_stmt(&stmt);
738-
if stmts.len() != 1 {
739-
fail!("renaming of stmt did not produce one stmt");
740-
}
741-
stmts.pop()
731+
folder.fold_stmt(&stmt)
732+
.expect_one("renaming of stmt did not produce one stmt")
742733
}
743734

744735

@@ -1185,11 +1176,8 @@ fn mark_expr(expr : @ast::Expr, m : Mrk) -> @ast::Expr {
11851176

11861177
// apply a given mark to the given stmt. Used following the expansion of a macro.
11871178
fn mark_stmt(expr : &ast::Stmt, m : Mrk) -> @ast::Stmt {
1188-
let mut stmts = new_mark_folder(m).fold_stmt(expr);
1189-
if stmts.len() != 1 {
1190-
fail!("marking a stmt didn't return a stmt");
1191-
}
1192-
stmts.pop()
1179+
new_mark_folder(m).fold_stmt(expr)
1180+
.expect_one("marking a stmt didn't return a stmt")
11931181
}
11941182

11951183
// apply a given mark to the given item. Used following the expansion of a macro.

Diff for: src/libsyntax/util/small_vector.rs

+27-79
Original file line numberDiff line numberDiff line change
@@ -54,53 +54,29 @@ impl<T> SmallVector<T> {
5454
match *self {
5555
Zero => *self = One(v),
5656
One(*) => {
57-
let mut tmp = Many(~[]);
58-
util::swap(self, &mut tmp);
59-
match *self {
60-
Many(ref mut vs) => {
61-
match tmp {
62-
One(v1) => {
63-
vs.push(v1);
64-
vs.push(v);
65-
}
66-
_ => unreachable!()
67-
}
68-
}
57+
let one = util::replace(self, Zero);
58+
match one {
59+
One(v1) => util::replace(self, Many(~[v1, v])),
6960
_ => unreachable!()
70-
}
61+
};
7162
}
7263
Many(ref mut vs) => vs.push(v)
7364
}
7465
}
7566

76-
pub fn pop(&mut self) -> T {
77-
match *self {
78-
Zero => fail!("attempted to pop from an empty SmallVector"),
79-
One(*) => {
80-
let mut tmp = Zero;
81-
util::swap(self, &mut tmp);
82-
match tmp {
83-
One(v) => v,
84-
_ => unreachable!()
85-
}
86-
}
87-
// Should this reduce to a One if possible?
88-
Many(ref mut vs) => vs.pop()
89-
}
90-
}
91-
92-
pub fn get<'a>(&'a self, idx: uint) -> &'a T {
67+
fn get<'a>(&'a self, idx: uint) -> &'a T {
9368
match *self {
9469
One(ref v) if idx == 0 => v,
9570
Many(ref vs) => &vs[idx],
9671
_ => fail!("Out of bounds access")
9772
}
9873
}
9974

100-
pub fn iter<'a>(&'a self) -> SmallVectorIterator<'a, T> {
101-
SmallVectorIterator {
102-
vec: self,
103-
idx: 0
75+
pub fn expect_one(self, err: &'static str) -> T {
76+
match self {
77+
One(v) => v,
78+
Many([v]) => v,
79+
_ => fail!(err)
10480
}
10581
}
10682

@@ -113,27 +89,6 @@ impl<T> SmallVector<T> {
11389
}
11490
}
11591

116-
pub struct SmallVectorIterator<'vec, T> {
117-
priv vec: &'vec SmallVector<T>,
118-
priv idx: uint
119-
}
120-
121-
impl<'vec, T> Iterator<&'vec T> for SmallVectorIterator<'vec, T> {
122-
fn next(&mut self) -> Option<&'vec T> {
123-
if self.idx == self.vec.len() {
124-
return None;
125-
}
126-
127-
self.idx += 1;
128-
Some(self.vec.get(self.idx - 1))
129-
}
130-
131-
fn size_hint(&self) -> (uint, Option<uint>) {
132-
let rem = self.vec.len() - self.idx;
133-
(rem, Some(rem))
134-
}
135-
}
136-
13792
pub enum SmallVectorMoveIterator<T> {
13893
priv ZeroIterator,
13994
priv OneIterator(T),
@@ -192,18 +147,6 @@ mod test {
192147
assert_eq!(&3, v.get(2));
193148
}
194149

195-
#[test]
196-
fn test_pop() {
197-
let mut v = SmallVector::one(1);
198-
assert_eq!(1, v.pop());
199-
assert_eq!(0, v.len());
200-
201-
let mut v= SmallVector::many(~[1, 2]);
202-
assert_eq!(2, v.pop());
203-
assert_eq!(1, v.pop());
204-
assert_eq!(0, v.len());
205-
}
206-
207150
#[test]
208151
fn test_from_iterator() {
209152
let v: SmallVector<int> = (~[1, 2, 3]).move_iter().collect();
@@ -214,28 +157,33 @@ mod test {
214157
}
215158

216159
#[test]
217-
fn test_iter() {
160+
fn test_move_iter() {
218161
let v = SmallVector::zero();
219-
let v: ~[&int] = v.iter().collect();
162+
let v: ~[int] = v.move_iter().collect();
220163
assert_eq!(~[], v);
221164

222165
let v = SmallVector::one(1);
223-
assert_eq!(~[&1], v.iter().collect());
166+
assert_eq!(~[1], v.move_iter().collect());
224167

225168
let v = SmallVector::many(~[1, 2, 3]);
226-
assert_eq!(~[&1, &2, &3], v.iter().collect());
169+
assert_eq!(~[1, 2, 3], v.move_iter().collect());
227170
}
228171

229172
#[test]
230-
fn test_move_iter() {
231-
let v = SmallVector::zero();
232-
let v: ~[int] = v.move_iter().collect();
233-
assert_eq!(~[], v);
173+
#[should_fail]
174+
fn test_expect_one_zero() {
175+
let _: int = SmallVector::zero().expect_one("");
176+
}
234177

235-
let v = SmallVector::one(1);
236-
assert_eq!(~[1], v.move_iter().collect());
178+
#[test]
179+
#[should_fail]
180+
fn test_expect_one_many() {
181+
SmallVector::many(~[1, 2]).expect_one("");
182+
}
237183

238-
let v = SmallVector::many(~[1, 2, 3]);
239-
assert_eq!(~[1, 2, 3], v.move_iter().collect());
184+
#[test]
185+
fn test_expect_one_one() {
186+
assert_eq!(1, SmallVector::one(1).expect_one(""));
187+
assert_eq!(1, SmallVector::many(~[1]).expect_one(""));
240188
}
241189
}

0 commit comments

Comments
 (0)