提交 0101bbe7 编写于 作者: A Alex Crichton

rollup merge of #20420: alexcrichton/second-pass-boxed

......@@ -10,6 +10,8 @@
//! A unique pointer type.
#![stable]
use core::any::{Any, AnyRefExt};
use core::clone::Clone;
use core::cmp::{PartialEq, PartialOrd, Eq, Ord, Ordering};
......@@ -44,7 +46,7 @@
/// A type that represents a uniquely-owned value.
#[lang = "owned_box"]
#[unstable = "custom allocators will add an additional type parameter (with default)"]
#[stable]
pub struct Box<T>(Unique<T>);
#[stable]
......@@ -111,18 +113,37 @@ fn hash(&self, state: &mut S) {
}
}
#[cfg(not(stage0))]
impl Box<Any> {
pub fn downcast<T: 'static>(self) -> Result<Box<T>, Box<Any>> {
if self.is::<T>() {
unsafe {
// Get the raw representation of the trait object
let to: TraitObject =
mem::transmute::<Box<Any>, TraitObject>(self);
// Extract the data pointer
Ok(mem::transmute(to.data))
}
} else {
Err(self)
}
}
}
/// Extension methods for an owning `Any` trait object.
#[unstable = "post-DST and coherence changes, this will not be a trait but \
rather a direct `impl` on `Box<Any>`"]
#[cfg(stage0)]
pub trait BoxAny {
/// Returns the boxed value if it is of type `T`, or
/// `Err(Self)` if it isn't.
#[unstable = "naming conventions around accessing innards may change"]
#[stable]
fn downcast<T: 'static>(self) -> Result<Box<T>, Self>;
}
#[stable]
#[cfg(stage0)]
impl BoxAny for Box<Any> {
#[inline]
fn downcast<T: 'static>(self) -> Result<Box<T>, Box<Any>> {
......@@ -147,7 +168,7 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
}
}
impl fmt::Show for Box<Any+'static> {
impl fmt::Show for Box<Any> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.pad("Box<Any>")
}
......
......@@ -57,6 +57,11 @@ fn visit_item(&mut self, item: &'v ast::Item) {
ty::ty_trait(ref data) => {
self.check_def_id(item.span, data.principal_def_id());
}
ty::ty_uniq(..) => {
self.check_def_id(item.span,
self.tcx.lang_items.owned_box()
.unwrap());
}
_ => {
span_err!(self.tcx.sess, item.span, E0118,
"no base type found for inherent implementation; \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册