dependencies = [
"log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc 0.0.0",
+ "rustc_data_structures 0.0.0",
"rustc_errors 0.0.0",
"rustc_target 0.0.0",
"syntax 0.0.0",
ELIDED_LIFETIMES_IN_PATHS};
use middle::cstore::CrateStore;
use rustc_data_structures::indexed_vec::IndexVec;
+use rustc_data_structures::small_vec::OneVector;
+use rustc_data_structures::thin_vec::ThinVec;
use session::Session;
use util::common::FN_OUTPUT_NAME;
use util::nodemap::{DefIdMap, NodeMap};
use syntax::symbol::{keywords, Symbol};
use syntax::tokenstream::{Delimited, TokenStream, TokenTree};
use syntax::parse::token::Token;
-use syntax::util::small_vector::SmallVector;
use syntax::visit::{self, Visitor};
use syntax_pos::{Span, MultiSpan};
&mut self,
decl: &FnDecl,
header: &FnHeader,
- ids: &mut SmallVector<hir::ItemId>,
+ ids: &mut OneVector<hir::ItemId>,
) {
if let Some(id) = header.asyncness.opt_return_id() {
ids.push(hir::ItemId { id });
}
- struct IdVisitor<'a> { ids: &'a mut SmallVector<hir::ItemId> }
+ struct IdVisitor<'a> { ids: &'a mut OneVector<hir::ItemId> }
impl<'a, 'b> Visitor<'a> for IdVisitor<'b> {
fn visit_ty(&mut self, ty: &'a Ty) {
match ty.node {
}
}
- fn lower_item_id(&mut self, i: &Item) -> SmallVector<hir::ItemId> {
+ fn lower_item_id(&mut self, i: &Item) -> OneVector<hir::ItemId> {
match i.node {
ItemKind::Use(ref use_tree) => {
- let mut vec = SmallVector::one(hir::ItemId { id: i.id });
+ let mut vec = OneVector::one(hir::ItemId { id: i.id });
self.lower_item_id_use_tree(use_tree, i.id, &mut vec);
vec
}
- ItemKind::MacroDef(..) => SmallVector::new(),
+ ItemKind::MacroDef(..) => OneVector::new(),
ItemKind::Fn(ref decl, ref header, ..) => {
- let mut ids = SmallVector::one(hir::ItemId { id: i.id });
+ let mut ids = OneVector::one(hir::ItemId { id: i.id });
self.lower_impl_trait_ids(decl, header, &mut ids);
ids
},
ItemKind::Impl(.., None, _, ref items) => {
- let mut ids = SmallVector::one(hir::ItemId { id: i.id });
+ let mut ids = OneVector::one(hir::ItemId { id: i.id });
for item in items {
if let ImplItemKind::Method(ref sig, _) = item.node {
self.lower_impl_trait_ids(&sig.decl, &sig.header, &mut ids);
}
ids
},
- _ => SmallVector::one(hir::ItemId { id: i.id }),
+ _ => OneVector::one(hir::ItemId { id: i.id }),
}
}
fn lower_item_id_use_tree(&mut self,
tree: &UseTree,
base_id: NodeId,
- vec: &mut SmallVector<hir::ItemId>)
+ vec: &mut OneVector<hir::ItemId>)
{
match tree.kind {
UseTreeKind::Nested(ref nested_vec) => for &(ref nested, id) in nested_vec {
}
}
- fn lower_stmt(&mut self, s: &Stmt) -> SmallVector<hir::Stmt> {
- SmallVector::one(match s.node {
+ fn lower_stmt(&mut self, s: &Stmt) -> OneVector<hir::Stmt> {
+ OneVector::one(match s.node {
StmtKind::Local(ref l) => Spanned {
node: hir::StmtKind::Decl(
P(Spanned {
use syntax::ptr::P;
use syntax::symbol::{Symbol, keywords};
use syntax::tokenstream::TokenStream;
-use syntax::util::ThinVec;
use syntax::util::parser::ExprPrecedence;
use ty::AdtKind;
use ty::query::Providers;
use rustc_data_structures::indexed_vec;
use rustc_data_structures::sync::{ParallelIterator, par_iter, Send, Sync, scope};
+use rustc_data_structures::thin_vec::ThinVec;
use serialize::{self, Encoder, Encodable, Decoder, Decodable};
use std::collections::BTreeMap;
[dependencies]
rustc = { path = "../librustc" }
+rustc_data_structures = { path = "../librustc_data_structures" }
rustc_errors = { path = "../librustc_errors" }
rustc_target = { path = "../librustc_target" }
syntax = { path = "../libsyntax" }
// except according to those terms.
use rustc::middle::allocator::AllocatorKind;
+use rustc_data_structures::small_vec::OneVector;
use rustc_errors;
use syntax::{
ast::{
fold::{self, Folder},
parse::ParseSess,
ptr::P,
- symbol::Symbol,
- util::small_vector::SmallVector,
+ symbol::Symbol
};
use syntax_pos::Span;
}
impl<'a> Folder for ExpandAllocatorDirectives<'a> {
- fn fold_item(&mut self, item: P<Item>) -> SmallVector<P<Item>> {
+ fn fold_item(&mut self, item: P<Item>) -> OneVector<P<Item>> {
debug!("in submodule {}", self.in_submod);
let name = if attr::contains_name(&item.attrs, "global_allocator") {
_ => {
self.handler
.span_err(item.span, "allocators must be statics");
- return SmallVector::one(item);
+ return OneVector::one(item);
}
}
if self.in_submod > 0 {
self.handler
.span_err(item.span, "`global_allocator` cannot be used in submodules");
- return SmallVector::one(item);
+ return OneVector::one(item);
}
if self.found {
self.handler
.span_err(item.span, "cannot define more than one #[global_allocator]");
- return SmallVector::one(item);
+ return OneVector::one(item);
}
self.found = true;
let module = f.cx.monotonic_expander().fold_item(module).pop().unwrap();
// Return the item and new submodule
- let mut ret = SmallVector::with_capacity(2);
+ let mut ret = OneVector::with_capacity(2);
ret.push(item);
ret.push(module);
#[macro_use] extern crate log;
extern crate rustc;
+extern crate rustc_data_structures;
extern crate rustc_errors;
extern crate rustc_target;
extern crate syntax;
#[macro_use] pub mod stable_hasher;
pub mod sync;
pub mod tiny_list;
+pub mod thin_vec;
pub mod transitive_relation;
pub mod tuple_slice;
pub use ena::unify;
pub struct SmallVec<A: Array>(AccumulateVec<A>);
+pub type OneVector<T> = SmallVec<[T; 1]>;
+
impl<A> Clone for SmallVec<A>
where A: Array,
A::Element: Clone {
use super::*;
+ #[test]
+ fn test_len() {
+ let v: OneVector<isize> = OneVector::new();
+ assert_eq!(0, v.len());
+
+ assert_eq!(1, OneVector::one(1).len());
+ assert_eq!(5, OneVector::many(vec![1, 2, 3, 4, 5]).len());
+ }
+
+ #[test]
+ fn test_push_get() {
+ let mut v = OneVector::new();
+ v.push(1);
+ assert_eq!(1, v.len());
+ assert_eq!(1, v[0]);
+ v.push(2);
+ assert_eq!(2, v.len());
+ assert_eq!(2, v[1]);
+ v.push(3);
+ assert_eq!(3, v.len());
+ assert_eq!(3, v[2]);
+ }
+
+ #[test]
+ fn test_from_iter() {
+ let v: OneVector<isize> = (vec![1, 2, 3]).into_iter().collect();
+ assert_eq!(3, v.len());
+ assert_eq!(1, v[0]);
+ assert_eq!(2, v[1]);
+ assert_eq!(3, v[2]);
+ }
+
+ #[test]
+ fn test_move_iter() {
+ let v = OneVector::new();
+ let v: Vec<isize> = v.into_iter().collect();
+ assert_eq!(v, Vec::new());
+
+ let v = OneVector::one(1);
+ assert_eq!(v.into_iter().collect::<Vec<_>>(), [1]);
+
+ let v = OneVector::many(vec![1, 2, 3]);
+ assert_eq!(v.into_iter().collect::<Vec<_>>(), [1, 2, 3]);
+ }
+
+ #[test]
+ #[should_panic]
+ fn test_expect_one_zero() {
+ let _: isize = OneVector::new().expect_one("");
+ }
+
+ #[test]
+ #[should_panic]
+ fn test_expect_one_many() {
+ OneVector::many(vec![1, 2]).expect_one("");
+ }
+
+ #[test]
+ fn test_expect_one_one() {
+ assert_eq!(1, OneVector::one(1).expect_one(""));
+ assert_eq!(1, OneVector::many(vec![1]).expect_one(""));
+ }
+
#[bench]
fn fill_small_vec_1_10_with_cap(b: &mut Bencher) {
b.iter(|| {
--- /dev/null
+// Copyright 2016 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.
+
+/// A vector type optimized for cases where this size is usually 0 (c.f. `SmallVector`).
+/// The `Option<Box<..>>` wrapping allows us to represent a zero sized vector with `None`,
+/// which uses only a single (null) pointer.
+#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
+pub struct ThinVec<T>(Option<Box<Vec<T>>>);
+
+impl<T> ThinVec<T> {
+ pub fn new() -> Self {
+ ThinVec(None)
+ }
+}
+
+impl<T> From<Vec<T>> for ThinVec<T> {
+ fn from(vec: Vec<T>) -> Self {
+ if vec.is_empty() {
+ ThinVec(None)
+ } else {
+ ThinVec(Some(Box::new(vec)))
+ }
+ }
+}
+
+impl<T> Into<Vec<T>> for ThinVec<T> {
+ fn into(self) -> Vec<T> {
+ match self {
+ ThinVec(None) => Vec::new(),
+ ThinVec(Some(vec)) => *vec,
+ }
+ }
+}
+
+impl<T> ::std::ops::Deref for ThinVec<T> {
+ type Target = [T];
+ fn deref(&self) -> &[T] {
+ match *self {
+ ThinVec(None) => &[],
+ ThinVec(Some(ref vec)) => vec,
+ }
+ }
+}
+
+impl<T> Extend<T> for ThinVec<T> {
+ fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
+ match *self {
+ ThinVec(Some(ref mut vec)) => vec.extend(iter),
+ ThinVec(None) => *self = iter.into_iter().collect::<Vec<_>>().into(),
+ }
+ }
+}
use rustc::session::config::{Input, OutputFilenames};
use rustc_borrowck as borrowck;
use rustc_borrowck::graphviz as borrowck_dot;
+use rustc_data_structures::small_vec::OneVector;
+use rustc_data_structures::thin_vec::ThinVec;
use rustc_metadata::cstore::CStore;
use rustc_mir::util::{write_mir_pretty, write_mir_graphviz};
use syntax::print::{pprust};
use syntax::print::pprust::PrintState;
use syntax::ptr::P;
-use syntax::util::ThinVec;
-use syntax::util::small_vector::SmallVector;
use syntax_pos::{self, FileName};
use graphviz as dot;
self.run(is_const, |s| fold::noop_fold_item_kind(i, s))
}
- fn fold_trait_item(&mut self, i: ast::TraitItem) -> SmallVector<ast::TraitItem> {
+ fn fold_trait_item(&mut self, i: ast::TraitItem) -> OneVector<ast::TraitItem> {
let is_const = match i.node {
ast::TraitItemKind::Const(..) => true,
ast::TraitItemKind::Method(ast::MethodSig { ref decl, ref header, .. }, _) =>
self.run(is_const, |s| fold::noop_fold_trait_item(i, s))
}
- fn fold_impl_item(&mut self, i: ast::ImplItem) -> SmallVector<ast::ImplItem> {
+ fn fold_impl_item(&mut self, i: ast::ImplItem) -> OneVector<ast::ImplItem> {
let is_const = match i.node {
ast::ImplItemKind::Const(..) => true,
ast::ImplItemKind::Method(ast::MethodSig { ref decl, ref header, .. }, _) =>
node: ast::ExprKind::Loop(P(empty_block), None),
id: self.sess.next_node_id(),
span: syntax_pos::DUMMY_SP,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
});
let loop_stmt = ast::Stmt {
pub use self::UnsafeSource::*;
pub use self::GenericArgs::*;
pub use symbol::{Ident, Symbol as Name};
-pub use util::ThinVec;
pub use util::parser::ExprPrecedence;
use syntax_pos::{Span, DUMMY_SP};
use rustc_data_structures::indexed_vec;
use rustc_data_structures::indexed_vec::Idx;
use symbol::{Symbol, keywords};
+use ThinVec;
use tokenstream::{ThinTokenStream, TokenStream};
use serialize::{self, Encoder, Decoder};
use parse::token::{self, Token};
use ptr::P;
use symbol::Symbol;
+use ThinVec;
use tokenstream::{TokenStream, TokenTree, Delimited};
-use util::ThinVec;
use GLOBALS;
use std::iter;
use codemap::Spanned;
use edition::Edition;
use parse::{token, ParseSess};
+use OneVector;
use ptr::P;
-use util::small_vector::SmallVector;
/// A folder that strips out items that do not belong in the current configuration.
pub struct StripUnconfigured<'a> {
Some(P(fold::noop_fold_expr(expr, self)))
}
- fn fold_stmt(&mut self, stmt: ast::Stmt) -> SmallVector<ast::Stmt> {
+ fn fold_stmt(&mut self, stmt: ast::Stmt) -> OneVector<ast::Stmt> {
match self.configure_stmt(stmt) {
Some(stmt) => fold::noop_fold_stmt(stmt, self),
- None => return SmallVector::new(),
+ None => return OneVector::new(),
}
}
- fn fold_item(&mut self, item: P<ast::Item>) -> SmallVector<P<ast::Item>> {
+ fn fold_item(&mut self, item: P<ast::Item>) -> OneVector<P<ast::Item>> {
fold::noop_fold_item(configure!(self, item), self)
}
- fn fold_impl_item(&mut self, item: ast::ImplItem) -> SmallVector<ast::ImplItem> {
+ fn fold_impl_item(&mut self, item: ast::ImplItem) -> OneVector<ast::ImplItem> {
fold::noop_fold_impl_item(configure!(self, item), self)
}
- fn fold_trait_item(&mut self, item: ast::TraitItem) -> SmallVector<ast::TraitItem> {
+ fn fold_trait_item(&mut self, item: ast::TraitItem) -> OneVector<ast::TraitItem> {
fold::noop_fold_trait_item(configure!(self, item), self)
}
use ext::build::AstBuilder;
use parse::token;
use ptr::P;
+use OneVector;
use symbol::{keywords, Symbol};
use tokenstream::{TokenTree};
-use util::small_vector::SmallVector;
use diagnostics::metadata::output_metadata;
let sym = Ident::with_empty_ctxt(Symbol::gensym(&format!(
"__register_diagnostic_{}", code
)));
- MacEager::items(SmallVector::many(vec![
+ MacEager::items(OneVector::many(vec![
ecx.item_mod(
span,
span,
),
);
- MacEager::items(SmallVector::many(vec![
+ MacEager::items(OneVector::many(vec![
P(ast::Item {
ident: *name,
attrs: Vec::new(),
use parse::{self, parser, DirectoryOwnership};
use parse::token;
use ptr::P;
+use OneVector;
use symbol::{keywords, Ident, Symbol};
-use util::small_vector::SmallVector;
+use ThinVec;
use std::collections::HashMap;
use std::iter;
// Use a macro because forwarding to a simple function has type system issues
macro_rules! make_stmts_default {
($me:expr) => {
- $me.make_expr().map(|e| SmallVector::one(ast::Stmt {
+ $me.make_expr().map(|e| OneVector::one(ast::Stmt {
id: ast::DUMMY_NODE_ID,
span: e.span,
node: ast::StmtKind::Expr(e),
None
}
/// Create zero or more items.
- fn make_items(self: Box<Self>) -> Option<SmallVector<P<ast::Item>>> {
+ fn make_items(self: Box<Self>) -> Option<OneVector<P<ast::Item>>> {
None
}
/// Create zero or more impl items.
- fn make_impl_items(self: Box<Self>) -> Option<SmallVector<ast::ImplItem>> {
+ fn make_impl_items(self: Box<Self>) -> Option<OneVector<ast::ImplItem>> {
None
}
/// Create zero or more trait items.
- fn make_trait_items(self: Box<Self>) -> Option<SmallVector<ast::TraitItem>> {
+ fn make_trait_items(self: Box<Self>) -> Option<OneVector<ast::TraitItem>> {
None
}
/// Create zero or more items in an `extern {}` block
- fn make_foreign_items(self: Box<Self>) -> Option<SmallVector<ast::ForeignItem>> { None }
+ fn make_foreign_items(self: Box<Self>) -> Option<OneVector<ast::ForeignItem>> { None }
/// Create a pattern.
fn make_pat(self: Box<Self>) -> Option<P<ast::Pat>> {
///
/// By default this attempts to create an expression statement,
/// returning None if that fails.
- fn make_stmts(self: Box<Self>) -> Option<SmallVector<ast::Stmt>> {
+ fn make_stmts(self: Box<Self>) -> Option<OneVector<ast::Stmt>> {
make_stmts_default!(self)
}
make_MacEager! {
expr: P<ast::Expr>,
pat: P<ast::Pat>,
- items: SmallVector<P<ast::Item>>,
- impl_items: SmallVector<ast::ImplItem>,
- trait_items: SmallVector<ast::TraitItem>,
- foreign_items: SmallVector<ast::ForeignItem>,
- stmts: SmallVector<ast::Stmt>,
+ items: OneVector<P<ast::Item>>,
+ impl_items: OneVector<ast::ImplItem>,
+ trait_items: OneVector<ast::TraitItem>,
+ foreign_items: OneVector<ast::ForeignItem>,
+ stmts: OneVector<ast::Stmt>,
ty: P<ast::Ty>,
}
self.expr
}
- fn make_items(self: Box<Self>) -> Option<SmallVector<P<ast::Item>>> {
+ fn make_items(self: Box<Self>) -> Option<OneVector<P<ast::Item>>> {
self.items
}
- fn make_impl_items(self: Box<Self>) -> Option<SmallVector<ast::ImplItem>> {
+ fn make_impl_items(self: Box<Self>) -> Option<OneVector<ast::ImplItem>> {
self.impl_items
}
- fn make_trait_items(self: Box<Self>) -> Option<SmallVector<ast::TraitItem>> {
+ fn make_trait_items(self: Box<Self>) -> Option<OneVector<ast::TraitItem>> {
self.trait_items
}
- fn make_foreign_items(self: Box<Self>) -> Option<SmallVector<ast::ForeignItem>> {
+ fn make_foreign_items(self: Box<Self>) -> Option<OneVector<ast::ForeignItem>> {
self.foreign_items
}
- fn make_stmts(self: Box<Self>) -> Option<SmallVector<ast::Stmt>> {
+ fn make_stmts(self: Box<Self>) -> Option<OneVector<ast::Stmt>> {
match self.stmts.as_ref().map_or(0, |s| s.len()) {
0 => make_stmts_default!(self),
_ => self.stmts,
id: ast::DUMMY_NODE_ID,
node: ast::ExprKind::Lit(P(codemap::respan(sp, ast::LitKind::Bool(false)))),
span: sp,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
})
}
Some(P(DummyResult::raw_pat(self.span)))
}
- fn make_items(self: Box<DummyResult>) -> Option<SmallVector<P<ast::Item>>> {
+ fn make_items(self: Box<DummyResult>) -> Option<OneVector<P<ast::Item>>> {
// this code needs a comment... why not always just return the Some() ?
if self.expr_only {
None
} else {
- Some(SmallVector::new())
+ Some(OneVector::new())
}
}
- fn make_impl_items(self: Box<DummyResult>) -> Option<SmallVector<ast::ImplItem>> {
+ fn make_impl_items(self: Box<DummyResult>) -> Option<OneVector<ast::ImplItem>> {
if self.expr_only {
None
} else {
- Some(SmallVector::new())
+ Some(OneVector::new())
}
}
- fn make_trait_items(self: Box<DummyResult>) -> Option<SmallVector<ast::TraitItem>> {
+ fn make_trait_items(self: Box<DummyResult>) -> Option<OneVector<ast::TraitItem>> {
if self.expr_only {
None
} else {
- Some(SmallVector::new())
+ Some(OneVector::new())
}
}
- fn make_foreign_items(self: Box<Self>) -> Option<SmallVector<ast::ForeignItem>> {
+ fn make_foreign_items(self: Box<Self>) -> Option<OneVector<ast::ForeignItem>> {
if self.expr_only {
None
} else {
- Some(SmallVector::new())
+ Some(OneVector::new())
}
}
- fn make_stmts(self: Box<DummyResult>) -> Option<SmallVector<ast::Stmt>> {
- Some(SmallVector::one(ast::Stmt {
+ fn make_stmts(self: Box<DummyResult>) -> Option<OneVector<ast::Stmt>> {
+ Some(OneVector::one(ast::Stmt {
id: ast::DUMMY_NODE_ID,
node: ast::StmtKind::Expr(DummyResult::raw_expr(self.span)),
span: self.span,
use ext::base::ExtCtxt;
use ptr::P;
use symbol::{Symbol, keywords};
+use ThinVec;
// Transitional re-exports so qquote can find the paths it is looking for
mod syntax {
init: Some(ex),
id: ast::DUMMY_NODE_ID,
span: sp,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
});
ast::Stmt {
id: ast::DUMMY_NODE_ID,
init: Some(ex),
id: ast::DUMMY_NODE_ID,
span: sp,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
});
ast::Stmt {
id: ast::DUMMY_NODE_ID,
init: None,
id: ast::DUMMY_NODE_ID,
span,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
});
ast::Stmt {
id: ast::DUMMY_NODE_ID,
id: ast::DUMMY_NODE_ID,
node,
span,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
})
}
expr: e,
span,
is_shorthand: false,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
}
}
fn expr_struct(&self, span: Span, path: ast::Path, fields: Vec<ast::Field>) -> P<ast::Expr> {
use parse::token::{self, Token};
use parse::parser::Parser;
use ptr::P;
+use OneVector;
use symbol::Symbol;
use symbol::keywords;
use syntax_pos::{Span, DUMMY_SP, FileName};
use syntax_pos::hygiene::ExpnFormat;
use tokenstream::{TokenStream, TokenTree};
-use util::small_vector::SmallVector;
use visit::{self, Visitor};
use std::collections::HashMap;
self.expand_fragment(AstFragment::$Kind(ast)).$make_ast()
})*)*
$($(fn $fold_ast_elt(&mut self, ast_elt: <$AstTy as IntoIterator>::Item) -> $AstTy {
- self.expand_fragment(AstFragment::$Kind(SmallVector::one(ast_elt))).$make_ast()
+ self.expand_fragment(AstFragment::$Kind(OneVector::one(ast_elt))).$make_ast()
})*)*
}
Expr(P<ast::Expr>) { "expression"; one fn fold_expr; fn visit_expr; fn make_expr; }
Pat(P<ast::Pat>) { "pattern"; one fn fold_pat; fn visit_pat; fn make_pat; }
Ty(P<ast::Ty>) { "type"; one fn fold_ty; fn visit_ty; fn make_ty; }
- Stmts(SmallVector<ast::Stmt>) { "statement"; many fn fold_stmt; fn visit_stmt; fn make_stmts; }
- Items(SmallVector<P<ast::Item>>) { "item"; many fn fold_item; fn visit_item; fn make_items; }
- TraitItems(SmallVector<ast::TraitItem>) {
+ Stmts(OneVector<ast::Stmt>) { "statement"; many fn fold_stmt; fn visit_stmt; fn make_stmts; }
+ Items(OneVector<P<ast::Item>>) { "item"; many fn fold_item; fn visit_item; fn make_items; }
+ TraitItems(OneVector<ast::TraitItem>) {
"trait item"; many fn fold_trait_item; fn visit_trait_item; fn make_trait_items;
}
- ImplItems(SmallVector<ast::ImplItem>) {
+ ImplItems(OneVector<ast::ImplItem>) {
"impl item"; many fn fold_impl_item; fn visit_impl_item; fn make_impl_items;
}
- ForeignItems(SmallVector<ast::ForeignItem>) {
+ ForeignItems(OneVector<ast::ForeignItem>) {
"foreign item"; many fn fold_foreign_item; fn visit_foreign_item; fn make_foreign_items;
}
}
let orig_mod_span = krate.module.inner;
- let krate_item = AstFragment::Items(SmallVector::one(P(ast::Item {
+ let krate_item = AstFragment::Items(OneVector::one(P(ast::Item {
attrs: krate.attrs,
span: krate.span,
node: ast::ItemKind::Mod(krate.module),
-> PResult<'a, AstFragment> {
Ok(match kind {
AstFragmentKind::Items => {
- let mut items = SmallVector::new();
+ let mut items = OneVector::new();
while let Some(item) = self.parse_item()? {
items.push(item);
}
AstFragment::Items(items)
}
AstFragmentKind::TraitItems => {
- let mut items = SmallVector::new();
+ let mut items = OneVector::new();
while self.token != token::Eof {
items.push(self.parse_trait_item(&mut false)?);
}
AstFragment::TraitItems(items)
}
AstFragmentKind::ImplItems => {
- let mut items = SmallVector::new();
+ let mut items = OneVector::new();
while self.token != token::Eof {
items.push(self.parse_impl_item(&mut false)?);
}
AstFragment::ImplItems(items)
}
AstFragmentKind::ForeignItems => {
- let mut items = SmallVector::new();
+ let mut items = OneVector::new();
while self.token != token::Eof {
if let Some(item) = self.parse_foreign_item()? {
items.push(item);
AstFragment::ForeignItems(items)
}
AstFragmentKind::Stmts => {
- let mut stmts = SmallVector::new();
+ let mut stmts = OneVector::new();
while self.token != token::Eof &&
// won't make progress on a `}`
self.token != token::CloseDelim(token::Brace) {
/// Folds the item allowing tests to be expanded because they are still nameable.
/// This should probably only be called with module items
- fn fold_nameable(&mut self, item: P<ast::Item>) -> SmallVector<P<ast::Item>> {
+ fn fold_nameable(&mut self, item: P<ast::Item>) -> OneVector<P<ast::Item>> {
fold::noop_fold_item(item, self)
}
/// Folds the item but doesn't allow tests to occur within it
- fn fold_unnameable(&mut self, item: P<ast::Item>) -> SmallVector<P<ast::Item>> {
+ fn fold_unnameable(&mut self, item: P<ast::Item>) -> OneVector<P<ast::Item>> {
let was_nameable = mem::replace(&mut self.tests_nameable, false);
let items = fold::noop_fold_item(item, self);
self.tests_nameable = was_nameable;
})
}
- fn fold_stmt(&mut self, stmt: ast::Stmt) -> SmallVector<ast::Stmt> {
+ fn fold_stmt(&mut self, stmt: ast::Stmt) -> OneVector<ast::Stmt> {
let mut stmt = match self.cfg.configure_stmt(stmt) {
Some(stmt) => stmt,
- None => return SmallVector::new(),
+ None => return OneVector::new(),
};
// we'll expand attributes on expressions separately
result
}
- fn fold_item(&mut self, item: P<ast::Item>) -> SmallVector<P<ast::Item>> {
+ fn fold_item(&mut self, item: P<ast::Item>) -> OneVector<P<ast::Item>> {
let item = configure!(self, item);
let (attr, traits, mut item) = self.classify_item(item);
ui
});
- SmallVector::many(
+ OneVector::many(
self.fold_unnameable(item).into_iter()
.chain(self.fold_unnameable(use_item)))
} else {
}
}
- fn fold_trait_item(&mut self, item: ast::TraitItem) -> SmallVector<ast::TraitItem> {
+ fn fold_trait_item(&mut self, item: ast::TraitItem) -> OneVector<ast::TraitItem> {
let item = configure!(self, item);
let (attr, traits, item) = self.classify_item(item);
}
}
- fn fold_impl_item(&mut self, item: ast::ImplItem) -> SmallVector<ast::ImplItem> {
+ fn fold_impl_item(&mut self, item: ast::ImplItem) -> OneVector<ast::ImplItem> {
let item = configure!(self, item);
let (attr, traits, item) = self.classify_item(item);
}
fn fold_foreign_item(&mut self,
- foreign_item: ast::ForeignItem) -> SmallVector<ast::ForeignItem> {
+ foreign_item: ast::ForeignItem) -> OneVector<ast::ForeignItem> {
let (attr, traits, foreign_item) = self.classify_item(foreign_item);
if attr.is_some() || !traits.is_empty() {
use tokenstream::TokenStream;
use fold::*;
use ptr::P;
+use OneVector;
use symbol::keywords;
+use ThinVec;
use util::move_map::MoveMap;
-use util::small_vector::SmallVector;
use std::collections::HashMap;
let span = DUMMY_SP;
let expr_placeholder = || P(ast::Expr {
id, span,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
node: ast::ExprKind::Mac(mac_placeholder()),
});
match kind {
AstFragmentKind::Expr => AstFragment::Expr(expr_placeholder()),
AstFragmentKind::OptExpr => AstFragment::OptExpr(Some(expr_placeholder())),
- AstFragmentKind::Items => AstFragment::Items(SmallVector::one(P(ast::Item {
+ AstFragmentKind::Items => AstFragment::Items(OneVector::one(P(ast::Item {
id, span, ident, vis, attrs,
node: ast::ItemKind::Mac(mac_placeholder()),
tokens: None,
}))),
- AstFragmentKind::TraitItems => AstFragment::TraitItems(SmallVector::one(ast::TraitItem {
+ AstFragmentKind::TraitItems => AstFragment::TraitItems(OneVector::one(ast::TraitItem {
id, span, ident, attrs, generics,
node: ast::TraitItemKind::Macro(mac_placeholder()),
tokens: None,
})),
- AstFragmentKind::ImplItems => AstFragment::ImplItems(SmallVector::one(ast::ImplItem {
+ AstFragmentKind::ImplItems => AstFragment::ImplItems(OneVector::one(ast::ImplItem {
id, span, ident, vis, attrs, generics,
node: ast::ImplItemKind::Macro(mac_placeholder()),
defaultness: ast::Defaultness::Final,
tokens: None,
})),
AstFragmentKind::ForeignItems =>
- AstFragment::ForeignItems(SmallVector::one(ast::ForeignItem {
+ AstFragment::ForeignItems(OneVector::one(ast::ForeignItem {
id, span, ident, vis, attrs,
node: ast::ForeignItemKind::Macro(mac_placeholder()),
})),
AstFragmentKind::Ty => AstFragment::Ty(P(ast::Ty {
id, span, node: ast::TyKind::Mac(mac_placeholder()),
})),
- AstFragmentKind::Stmts => AstFragment::Stmts(SmallVector::one({
- let mac = P((mac_placeholder(), ast::MacStmtStyle::Braces, ast::ThinVec::new()));
+ AstFragmentKind::Stmts => AstFragment::Stmts(OneVector::one({
+ let mac = P((mac_placeholder(), ast::MacStmtStyle::Braces, ThinVec::new()));
ast::Stmt { id, span, node: ast::StmtKind::Mac(mac) }
})),
}
}
impl<'a, 'b> Folder for PlaceholderExpander<'a, 'b> {
- fn fold_item(&mut self, item: P<ast::Item>) -> SmallVector<P<ast::Item>> {
+ fn fold_item(&mut self, item: P<ast::Item>) -> OneVector<P<ast::Item>> {
match item.node {
ast::ItemKind::Mac(_) => return self.remove(item.id).make_items(),
- ast::ItemKind::MacroDef(_) => return SmallVector::one(item),
+ ast::ItemKind::MacroDef(_) => return OneVector::one(item),
_ => {}
}
noop_fold_item(item, self)
}
- fn fold_trait_item(&mut self, item: ast::TraitItem) -> SmallVector<ast::TraitItem> {
+ fn fold_trait_item(&mut self, item: ast::TraitItem) -> OneVector<ast::TraitItem> {
match item.node {
ast::TraitItemKind::Macro(_) => self.remove(item.id).make_trait_items(),
_ => noop_fold_trait_item(item, self),
}
}
- fn fold_impl_item(&mut self, item: ast::ImplItem) -> SmallVector<ast::ImplItem> {
+ fn fold_impl_item(&mut self, item: ast::ImplItem) -> OneVector<ast::ImplItem> {
match item.node {
ast::ImplItemKind::Macro(_) => self.remove(item.id).make_impl_items(),
_ => noop_fold_impl_item(item, self),
}
}
- fn fold_foreign_item(&mut self, item: ast::ForeignItem) -> SmallVector<ast::ForeignItem> {
+ fn fold_foreign_item(&mut self, item: ast::ForeignItem) -> OneVector<ast::ForeignItem> {
match item.node {
ast::ForeignItemKind::Macro(_) => self.remove(item.id).make_foreign_items(),
_ => noop_fold_foreign_item(item, self),
}
}
- fn fold_stmt(&mut self, stmt: ast::Stmt) -> SmallVector<ast::Stmt> {
+ fn fold_stmt(&mut self, stmt: ast::Stmt) -> OneVector<ast::Stmt> {
let (style, mut stmts) = match stmt.node {
ast::StmtKind::Mac(mac) => (mac.1, self.remove(stmt.id).make_stmts()),
_ => return noop_fold_stmt(stmt, self),
use parse::token::{self, Token};
use ptr::P;
use symbol::Symbol;
+ use ThinVec;
use tokenstream::{self, TokenTree, TokenStream};
id: ast::DUMMY_NODE_ID,
node: ast::ExprKind::Lit(P(self.clone())),
span: DUMMY_SP,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
}).to_tokens(cx)
}
}
id: ast::DUMMY_NODE_ID,
node: ast::ExprKind::Lit(P(dummy_spanned(lit))),
span: DUMMY_SP,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
});
if *self >= 0 {
return lit.to_tokens(cx);
id: ast::DUMMY_NODE_ID,
node: ast::ExprKind::Unary(ast::UnOp::Neg, lit),
span: DUMMY_SP,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
}).to_tokens(cx)
}
}
use parse;
use print::pprust;
use ptr::P;
+use OneVector;
use symbol::Symbol;
use tokenstream;
-use util::small_vector::SmallVector;
use std::fs::File;
use std::io::prelude::*;
Some(panictry!(self.p.parse_expr()))
}
fn make_items(mut self: Box<ExpandResult<'a>>)
- -> Option<SmallVector<P<ast::Item>>> {
- let mut ret = SmallVector::new();
+ -> Option<OneVector<P<ast::Item>>> {
+ let mut ret = OneVector::new();
while self.p.token != token::Eof {
match panictry!(self.p.parse_item()) {
Some(item) => ret.push(item),
use parse::parser::{Parser, PathStyle};
use parse::token::{self, DocComment, Nonterminal, Token};
use print::pprust;
+use OneVector;
use symbol::keywords;
use tokenstream::TokenStream;
-use util::small_vector::SmallVector;
use std::mem;
use std::ops::{Deref, DerefMut};
/// A `ParseResult`. Note that matches are kept track of through the items generated.
fn inner_parse_loop<'a>(
sess: &ParseSess,
- cur_items: &mut SmallVector<MatcherPosHandle<'a>>,
+ cur_items: &mut OneVector<MatcherPosHandle<'a>>,
next_items: &mut Vec<MatcherPosHandle<'a>>,
- eof_items: &mut SmallVector<MatcherPosHandle<'a>>,
- bb_items: &mut SmallVector<MatcherPosHandle<'a>>,
+ eof_items: &mut OneVector<MatcherPosHandle<'a>>,
+ bb_items: &mut OneVector<MatcherPosHandle<'a>>,
token: &Token,
span: syntax_pos::Span,
) -> ParseResult<()> {
// This MatcherPos instance is allocated on the stack. All others -- and
// there are frequently *no* others! -- are allocated on the heap.
let mut initial = initial_matcher_pos(ms, parser.span.lo());
- let mut cur_items = SmallVector::one(MatcherPosHandle::Ref(&mut initial));
+ let mut cur_items = OneVector::one(MatcherPosHandle::Ref(&mut initial));
let mut next_items = Vec::new();
loop {
// Matcher positions black-box parsed by parser.rs (`parser`)
- let mut bb_items = SmallVector::new();
+ let mut bb_items = OneVector::new();
// Matcher positions that would be valid if the macro invocation was over now
- let mut eof_items = SmallVector::new();
+ let mut eof_items = OneVector::new();
assert!(next_items.is_empty());
// Process `cur_items` until either we have finished the input or we need to get some
use ext::tt::quoted;
use fold::noop_fold_tt;
use parse::token::{self, Token, NtTT};
+use OneVector;
use syntax_pos::{Span, DUMMY_SP};
use tokenstream::{TokenStream, TokenTree, Delimited};
-use util::small_vector::SmallVector;
use std::rc::Rc;
use rustc_data_structures::sync::Lrc;
interp: Option<HashMap<Ident, Rc<NamedMatch>>>,
src: Vec<quoted::TokenTree>)
-> TokenStream {
- let mut stack = SmallVector::one(Frame::new(src));
+ let mut stack = OneVector::one(Frame::new(src));
let interpolations = interp.unwrap_or_else(HashMap::new); /* just a convenience */
let mut repeats = Vec::new();
let mut result: Vec<TokenStream> = Vec::new();
use codemap::{Spanned, respan};
use parse::token::{self, Token};
use ptr::P;
+use OneVector;
use symbol::keywords;
+use ThinVec;
use tokenstream::*;
-use util::small_vector::SmallVector;
use util::move_map::MoveMap;
use rustc_data_structures::sync::Lrc;
noop_fold_use_tree(use_tree, self)
}
- fn fold_foreign_item(&mut self, ni: ForeignItem) -> SmallVector<ForeignItem> {
+ fn fold_foreign_item(&mut self, ni: ForeignItem) -> OneVector<ForeignItem> {
noop_fold_foreign_item(ni, self)
}
noop_fold_foreign_item_simple(ni, self)
}
- fn fold_item(&mut self, i: P<Item>) -> SmallVector<P<Item>> {
+ fn fold_item(&mut self, i: P<Item>) -> OneVector<P<Item>> {
noop_fold_item(i, self)
}
noop_fold_item_kind(i, self)
}
- fn fold_trait_item(&mut self, i: TraitItem) -> SmallVector<TraitItem> {
+ fn fold_trait_item(&mut self, i: TraitItem) -> OneVector<TraitItem> {
noop_fold_trait_item(i, self)
}
- fn fold_impl_item(&mut self, i: ImplItem) -> SmallVector<ImplItem> {
+ fn fold_impl_item(&mut self, i: ImplItem) -> OneVector<ImplItem> {
noop_fold_impl_item(i, self)
}
noop_fold_block(b, self)
}
- fn fold_stmt(&mut self, s: Stmt) -> SmallVector<Stmt> {
+ fn fold_stmt(&mut self, s: Stmt) -> OneVector<Stmt> {
noop_fold_stmt(s, self)
}
}
pub fn noop_fold_trait_item<T: Folder>(i: TraitItem, folder: &mut T)
- -> SmallVector<TraitItem> {
- SmallVector::one(TraitItem {
+ -> OneVector<TraitItem> {
+ OneVector::one(TraitItem {
id: folder.new_id(i.id),
ident: folder.fold_ident(i.ident),
attrs: fold_attrs(i.attrs, folder),
}
pub fn noop_fold_impl_item<T: Folder>(i: ImplItem, folder: &mut T)
- -> SmallVector<ImplItem> {
- SmallVector::one(ImplItem {
+ -> OneVector<ImplItem> {
+ OneVector::one(ImplItem {
id: folder.new_id(i.id),
vis: folder.fold_vis(i.vis),
ident: folder.fold_ident(i.ident),
}
// fold one item into possibly many items
-pub fn noop_fold_item<T: Folder>(i: P<Item>, folder: &mut T) -> SmallVector<P<Item>> {
- SmallVector::one(i.map(|i| folder.fold_item_simple(i)))
+pub fn noop_fold_item<T: Folder>(i: P<Item>, folder: &mut T) -> OneVector<P<Item>> {
+ OneVector::one(i.map(|i| folder.fold_item_simple(i)))
}
// fold one item into exactly one item
}
pub fn noop_fold_foreign_item<T: Folder>(ni: ForeignItem, folder: &mut T)
--> SmallVector<ForeignItem> {
- SmallVector::one(folder.fold_foreign_item_simple(ni))
+-> OneVector<ForeignItem> {
+ OneVector::one(folder.fold_foreign_item_simple(ni))
}
pub fn noop_fold_foreign_item_simple<T: Folder>(ni: ForeignItem, folder: &mut T) -> ForeignItem {
es.move_flat_map(|e| folder.fold_opt_expr(e))
}
-pub fn noop_fold_stmt<T: Folder>(Stmt {node, span, id}: Stmt, folder: &mut T) -> SmallVector<Stmt> {
+pub fn noop_fold_stmt<T: Folder>(Stmt {node, span, id}: Stmt, folder: &mut T) -> OneVector<Stmt> {
let id = folder.new_id(id);
let span = folder.new_span(span);
noop_fold_stmt_kind(node, folder).into_iter().map(|node| {
}).collect()
}
-pub fn noop_fold_stmt_kind<T: Folder>(node: StmtKind, folder: &mut T) -> SmallVector<StmtKind> {
+pub fn noop_fold_stmt_kind<T: Folder>(node: StmtKind, folder: &mut T) -> OneVector<StmtKind> {
match node {
- StmtKind::Local(local) => SmallVector::one(StmtKind::Local(folder.fold_local(local))),
+ StmtKind::Local(local) => OneVector::one(StmtKind::Local(folder.fold_local(local))),
StmtKind::Item(item) => folder.fold_item(item).into_iter().map(StmtKind::Item).collect(),
StmtKind::Expr(expr) => {
folder.fold_opt_expr(expr).into_iter().map(StmtKind::Expr).collect()
StmtKind::Semi(expr) => {
folder.fold_opt_expr(expr).into_iter().map(StmtKind::Semi).collect()
}
- StmtKind::Mac(mac) => SmallVector::one(StmtKind::Mac(mac.map(|(mac, semi, attrs)| {
+ StmtKind::Mac(mac) => OneVector::one(StmtKind::Mac(mac.map(|(mac, semi, attrs)| {
(folder.fold_mac(mac), semi, fold_attrs(attrs.into(), folder).into())
}))),
}
use rustc_data_structures::sync::Lock;
use rustc_data_structures::bitvec::BitVector;
+pub use rustc_data_structures::small_vec::OneVector;
+pub use rustc_data_structures::thin_vec::ThinVec;
use ast::AttrId;
// A variant of 'try!' that panics on an Err. This is used as a crutch on the
pub mod parser;
#[cfg(test)]
pub mod parser_testing;
- pub mod small_vector;
pub mod move_map;
- mod thin_vec;
- pub use self::thin_vec::ThinVec;
-
mod rc_slice;
pub use self::rc_slice::RcSlice;
}
use print::pprust;
use ptr::P;
use parse::PResult;
+use ThinVec;
use tokenstream::{self, Delimited, ThinTokenStream, TokenTree, TokenStream};
use symbol::{Symbol, keywords};
-use util::ThinVec;
use std::borrow::Cow;
use std::cmp;
use print::pprust;
use ast::{self, Ident};
use ptr::P;
+use OneVector;
use symbol::{self, Symbol, keywords};
-use util::small_vector::SmallVector;
+use ThinVec;
enum ShouldPanic {
No,
folded
}
- fn fold_item(&mut self, i: P<ast::Item>) -> SmallVector<P<ast::Item>> {
+ fn fold_item(&mut self, i: P<ast::Item>) -> OneVector<P<ast::Item>> {
let ident = i.ident;
if ident.name != keywords::Invalid.name() {
self.cx.path.push(ident);
if ident.name != keywords::Invalid.name() {
self.cx.path.pop();
}
- SmallVector::one(P(item))
+ OneVector::one(P(item))
}
fn fold_mac(&mut self, mac: ast::Mac) -> ast::Mac { mac }
}
impl fold::Folder for EntryPointCleaner {
- fn fold_item(&mut self, i: P<ast::Item>) -> SmallVector<P<ast::Item>> {
+ fn fold_item(&mut self, i: P<ast::Item>) -> OneVector<P<ast::Item>> {
self.depth += 1;
let folded = fold::noop_fold_item(i, self).expect_one("noop did something");
self.depth -= 1;
EntryPointType::OtherMain => folded,
};
- SmallVector::one(folded)
+ OneVector::one(folded)
}
fn fold_mac(&mut self, mac: ast::Mac) -> ast::Mac { mac }
mk_test_desc_and_fn_rec(cx, test)
}).collect()),
span: DUMMY_SP,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
})),
span: DUMMY_SP,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
})
}
// except according to those terms.
use std::ptr;
-
-use util::small_vector::SmallVector;
+use OneVector;
pub trait MoveMap<T>: Sized {
fn move_map<F>(self, mut f: F) -> Self where F: FnMut(T) -> T {
}
}
-impl<T> MoveMap<T> for SmallVector<T> {
+impl<T> MoveMap<T> for OneVector<T> {
fn move_flat_map<F, I>(mut self, mut f: F) -> Self
where F: FnMut(T) -> I,
I: IntoIterator<Item=T>
+++ /dev/null
-// Copyright 2013-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.
-
-use rustc_data_structures::small_vec::SmallVec;
-
-pub type SmallVector<T> = SmallVec<[T; 1]>;
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn test_len() {
- let v: SmallVector<isize> = SmallVector::new();
- assert_eq!(0, v.len());
-
- assert_eq!(1, SmallVector::one(1).len());
- assert_eq!(5, SmallVector::many(vec![1, 2, 3, 4, 5]).len());
- }
-
- #[test]
- fn test_push_get() {
- let mut v = SmallVector::new();
- v.push(1);
- assert_eq!(1, v.len());
- assert_eq!(1, v[0]);
- v.push(2);
- assert_eq!(2, v.len());
- assert_eq!(2, v[1]);
- v.push(3);
- assert_eq!(3, v.len());
- assert_eq!(3, v[2]);
- }
-
- #[test]
- fn test_from_iter() {
- let v: SmallVector<isize> = (vec![1, 2, 3]).into_iter().collect();
- assert_eq!(3, v.len());
- assert_eq!(1, v[0]);
- assert_eq!(2, v[1]);
- assert_eq!(3, v[2]);
- }
-
- #[test]
- fn test_move_iter() {
- let v = SmallVector::new();
- let v: Vec<isize> = v.into_iter().collect();
- assert_eq!(v, Vec::new());
-
- let v = SmallVector::one(1);
- assert_eq!(v.into_iter().collect::<Vec<_>>(), [1]);
-
- let v = SmallVector::many(vec![1, 2, 3]);
- assert_eq!(v.into_iter().collect::<Vec<_>>(), [1, 2, 3]);
- }
-
- #[test]
- #[should_panic]
- fn test_expect_one_zero() {
- let _: isize = SmallVector::new().expect_one("");
- }
-
- #[test]
- #[should_panic]
- fn test_expect_one_many() {
- SmallVector::many(vec![1, 2]).expect_one("");
- }
-
- #[test]
- fn test_expect_one_one() {
- assert_eq!(1, SmallVector::one(1).expect_one(""));
- assert_eq!(1, SmallVector::many(vec![1]).expect_one(""));
- }
-}
+++ /dev/null
-// Copyright 2016 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.
-
-/// A vector type optimized for cases where this size is usually 0 (c.f. `SmallVector`).
-/// The `Option<Box<..>>` wrapping allows us to represent a zero sized vector with `None`,
-/// which uses only a single (null) pointer.
-#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
-pub struct ThinVec<T>(Option<Box<Vec<T>>>);
-
-impl<T> ThinVec<T> {
- pub fn new() -> Self {
- ThinVec(None)
- }
-}
-
-impl<T> From<Vec<T>> for ThinVec<T> {
- fn from(vec: Vec<T>) -> Self {
- if vec.is_empty() {
- ThinVec(None)
- } else {
- ThinVec(Some(Box::new(vec)))
- }
- }
-}
-
-impl<T> Into<Vec<T>> for ThinVec<T> {
- fn into(self) -> Vec<T> {
- match self {
- ThinVec(None) => Vec::new(),
- ThinVec(Some(vec)) => *vec,
- }
- }
-}
-
-impl<T> ::std::ops::Deref for ThinVec<T> {
- type Target = [T];
- fn deref(&self) -> &[T] {
- match *self {
- ThinVec(None) => &[],
- ThinVec(Some(ref vec)) => vec,
- }
- }
-}
-
-impl<T> Extend<T> for ThinVec<T> {
- fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
- match *self {
- ThinVec(Some(ref mut vec)) => vec.extend(iter),
- ThinVec(None) => *self = iter.into_iter().collect::<Vec<_>>().into(),
- }
- }
-}
//
use self::State::*;
+use rustc_data_structures::thin_vec::ThinVec;
+
use syntax::ast;
use syntax::ext::base;
use syntax::ext::base::*;
ctxt: cx.backtrace(),
})),
span: sp,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
}))
}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
+use rustc_data_structures::thin_vec::ThinVec;
+
use syntax::ast;
use syntax::ext::base::*;
use syntax::ext::base;
id: ast::DUMMY_NODE_ID,
node: ast::ExprKind::Path(None, ast::Path::from_ident(self.ident)),
span: self.ident.span,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
}))
}
use deriving::generic::*;
use deriving::generic::ty::*;
+use rustc_data_structures::thin_vec::ThinVec;
+
use syntax::ast::{self, Ident};
use syntax::ast::{Expr, MetaItem};
use syntax::ext::base::{Annotatable, ExtCtxt};
init: Some(expr),
id: ast::DUMMY_NODE_ID,
span: sp,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
});
ast::Stmt {
id: ast::DUMMY_NODE_ID,
use std::iter;
use std::vec;
+use rustc_data_structures::thin_vec::ThinVec;
use rustc_target::spec::abi::Abi;
use syntax::ast::{self, BinOpKind, EnumDef, Expr, Generics, Ident, PatKind};
use syntax::ast::{VariantData, GenericParamKind, GenericArg};
ident: ident.unwrap(),
pat,
is_shorthand: false,
- attrs: ast::ThinVec::new(),
+ attrs: ThinVec::new(),
},
}
})
/// LLVM's `module asm "some assembly here"`. All of LLVM's caveats
/// therefore apply.
+use rustc_data_structures::small_vec::OneVector;
+
use syntax::ast;
use syntax::codemap::respan;
use syntax::ext::base;
use syntax_pos::Span;
use syntax::tokenstream;
-use syntax::util::small_vector::SmallVector;
-
pub const MACRO: &'static str = "global_asm";
pub fn expand_global_asm<'cx>(cx: &'cx mut ExtCtxt,
None => return DummyResult::any(sp),
};
- MacEager::items(SmallVector::one(P(ast::Item {
+ MacEager::items(OneVector::one(P(ast::Item {
ident: ast::Ident::with_empty_ctxt(Symbol::intern("")),
attrs: Vec::new(),
id: ast::DUMMY_NODE_ID,
extern crate syntax;
extern crate rustc;
+extern crate rustc_data_structures;
extern crate rustc_plugin;
extern crate syntax_pos;
-use syntax::ast;
+use rustc_data_structures::small_vec::OneVector;
use syntax::ext::base::{ExtCtxt, MacResult, MacEager};
-use syntax::util::small_vector::SmallVector;
use syntax::tokenstream;
use rustc_plugin::Registry;
fn expand(cx: &mut ExtCtxt, _: syntax_pos::Span, _: &[tokenstream::TokenTree])
-> Box<MacResult+'static> {
- MacEager::items(SmallVector::many(vec![
+ MacEager::items(OneVector::many(vec![
quote_item!(cx, struct Struct1;).unwrap(),
quote_item!(cx, struct Struct2;).unwrap()
]))
#![feature(rustc_private)]
+extern crate rustc_data_structures;
extern crate syntax;
+use rustc_data_structures::thin_vec::ThinVec;
use syntax::ast::*;
use syntax::codemap::{Spanned, DUMMY_SP, FileName};
use syntax::codemap::FilePathMapping;
use syntax::parse::{self, ParseSess};
use syntax::print::pprust;
use syntax::ptr::P;
-use syntax::util::ThinVec;
fn parse_expr(ps: &ParseSess, src: &str) -> P<Expr> {