Use an out-of-tree unsafe-any trait instead of a home-grown version.

This has the advantage of being separately checked, tested
and documented.
This commit is contained in:
Jonathan Reem
2014-09-07 09:49:10 +02:00
parent 4d77477c83
commit 5f24bcecd4
3 changed files with 7 additions and 9 deletions

View File

@@ -10,8 +10,12 @@ git = "https://github.com/servo/rust-url"
[dependencies.mime]
git = "https://github.com/seanmonstar/mime.rs"
[dependencies.unsafe-any]
git = "https://github.com/reem/rust-unsafe-any"
[dev-dependencies.curl]
git = "https://github.com/carllerche/curl-rust"
[dev-dependencies.http]
git = "https://github.com/chris-morgan/rust-http"

View File

@@ -23,6 +23,7 @@ use std::collections::hashmap::{HashMap, Entries};
use mime::Mime;
use time::{Tm, strptime};
use uany::UncheckedAnyDowncast;
use rfc7230::read_header;
use {HttpResult};
@@ -46,15 +47,7 @@ pub trait Header: Any + 'static {
fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result;
}
/// A trait for downcasting owned TraitObjects to another type without checking
/// `AnyRefExt::is::<T>(t)` first.
trait UncheckedAnyRefExt<'a> {
/// This will downcast an object to another type without checking that it is
/// legal. Do not call this unless you are ABSOLUTE SURE of the types.
unsafe fn downcast_ref_unchecked<T: 'static>(self) -> &'a T;
}
impl<'a> UncheckedAnyRefExt<'a> for &'a Header + 'a {
impl<'a> UncheckedAnyDowncast<'a> for &'a Header + 'a {
#[inline]
unsafe fn downcast_ref_unchecked<T: 'static>(self) -> &'a T {
let to: TraitObject = transmute_copy(&self);

View File

@@ -8,6 +8,7 @@ extern crate time;
extern crate url;
#[phase(plugin,link)] extern crate log;
#[cfg(test)] extern crate test;
extern crate "unsafe-any" as uany;
pub use std::io::net::ip::{SocketAddr, IpAddr, Ipv4Addr, Ipv6Addr, Port};
pub use mimewrapper::mime;