// Copyright 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 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. use std::fmt; use std::fmt::Show; use std::hash::Hash; use serialize::{Encodable, Decodable, Encoder, Decoder}; /// An owned smart pointer. pub struct P { ptr: Box } #[allow(non_snake_case)] /// Construct a P from a T value. pub fn P(value: T) -> P { P { ptr: box value } } impl P { pub fn and_then(self, f: |T| -> U) -> U { f(*self.ptr) } pub fn map(mut self, f: |T| -> T) -> P { use std::{mem, ptr}; unsafe { let p = &mut *self.ptr; // FIXME(#5016) this shouldn't need to zero to be safe. mem::move_val_init(p, f(ptr::read_and_zero(p))); } self } } impl Deref for P { fn deref<'a>(&'a self) -> &'a T { &*self.ptr } } impl Clone for P { fn clone(&self) -> P { P((**self).clone()) } } impl PartialEq for P { fn eq(&self, other: &P) -> bool { **self == **other } } impl Eq for P {} impl Show for P { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { (**self).fmt(f) } } impl> Hash for P { fn hash(&self, state: &mut S) { (**self).hash(state); } } impl, T: 'static + Decodable> Decodable for P { fn decode(d: &mut D) -> Result, E> { Decodable::decode(d).map(P) } } impl, T: Encodable> Encodable for P { fn encode(&self, s: &mut S) -> Result<(), E> { (**self).encode(s) } }