1 // Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 //! A unique pointer type.
16 use core::clone::Clone;
17 use core::cmp::{PartialEq, PartialOrd, Eq, Ord, Ordering};
18 use core::default::Default;
20 use core::hash::{self, Hash};
21 use core::kinds::Sized;
23 use core::option::Option;
24 use core::ptr::Unique;
25 use core::raw::TraitObject;
26 use core::result::Result;
27 use core::result::Result::{Ok, Err};
28 use core::ops::{Deref, DerefMut};
30 /// A value that represents the global exchange heap. This is the default
31 /// place that the `box` keyword allocates into when no place is supplied.
33 /// The following two examples are equivalent:
36 /// use std::boxed::HEAP;
39 /// # impl Bar { fn new(_a: int) { } }
40 /// let foo = box(HEAP) Bar::new(2);
41 /// let foo = box Bar::new(2);
43 #[lang = "exchange_heap"]
44 #[experimental = "may be renamed; uncertain about custom allocator design"]
45 pub static HEAP: () = ();
47 /// A type that represents a uniquely-owned value.
50 pub struct Box<T>(Unique<T>);
53 impl<T: Default> Default for Box<T> {
55 fn default() -> Box<T> { box Default::default() }
59 impl<T> Default for Box<[T]> {
61 fn default() -> Box<[T]> { box [] }
65 impl<T: Clone> Clone for Box<T> {
66 /// Returns a copy of the owned box.
68 fn clone(&self) -> Box<T> { box {(**self).clone()} }
70 /// Performs copy-assignment from `source` by reusing the existing allocation.
72 fn clone_from(&mut self, source: &Box<T>) {
73 (**self).clone_from(&(**source));
78 impl<Sized? T: PartialEq> PartialEq for Box<T> {
80 fn eq(&self, other: &Box<T>) -> bool { PartialEq::eq(&**self, &**other) }
82 fn ne(&self, other: &Box<T>) -> bool { PartialEq::ne(&**self, &**other) }
85 impl<Sized? T: PartialOrd> PartialOrd for Box<T> {
87 fn partial_cmp(&self, other: &Box<T>) -> Option<Ordering> {
88 PartialOrd::partial_cmp(&**self, &**other)
91 fn lt(&self, other: &Box<T>) -> bool { PartialOrd::lt(&**self, &**other) }
93 fn le(&self, other: &Box<T>) -> bool { PartialOrd::le(&**self, &**other) }
95 fn ge(&self, other: &Box<T>) -> bool { PartialOrd::ge(&**self, &**other) }
97 fn gt(&self, other: &Box<T>) -> bool { PartialOrd::gt(&**self, &**other) }
100 impl<Sized? T: Ord> Ord for Box<T> {
102 fn cmp(&self, other: &Box<T>) -> Ordering {
103 Ord::cmp(&**self, &**other)
107 impl<Sized? T: Eq> Eq for Box<T> {}
109 impl<S: hash::Writer, Sized? T: Hash<S>> Hash<S> for Box<T> {
111 fn hash(&self, state: &mut S) {
112 (**self).hash(state);
116 /// Extension methods for an owning `Any` trait object.
117 #[unstable = "post-DST and coherence changes, this will not be a trait but \
118 rather a direct `impl` on `Box<Any>`"]
120 /// Returns the boxed value if it is of type `T`, or
121 /// `Err(Self)` if it isn't.
123 fn downcast<T: 'static>(self) -> Result<Box<T>, Self>;
126 impl BoxAny for Box<Any> {
128 #[unstable = "method may be renamed with respect to other downcasting \
130 fn downcast<T: 'static>(self) -> Result<Box<T>, Box<Any>> {
133 // Get the raw representation of the trait object
134 let to: TraitObject =
135 mem::transmute::<Box<Any>, TraitObject>(self);
137 // Extract the data pointer
138 Ok(mem::transmute(to.data))
146 impl<Sized? T: fmt::Show> fmt::Show for Box<T> {
147 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
152 impl fmt::Show for Box<Any> {
153 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
158 impl<Sized? T> Deref for Box<T> {
161 fn deref(&self) -> &T { &**self }
164 impl<Sized? T> DerefMut for Box<T> {
165 fn deref_mut(&mut self) -> &mut T { &mut **self }
171 fn test_owned_clone() {
173 let b: Box<int> = a.clone();
179 let a = box 8u as Box<Any>;
180 let b = box Test as Box<Any>;
182 match a.downcast::<uint>() {
183 Ok(a) => { assert!(a == box 8u); }
186 match b.downcast::<Test>() {
187 Ok(a) => { assert!(a == box Test); }
191 let a = box 8u as Box<Any>;
192 let b = box Test as Box<Any>;
194 assert!(a.downcast::<Box<Test>>().is_err());
195 assert!(b.downcast::<Box<uint>>().is_err());
200 let a = box 8u as Box<Any>;
201 let b = box Test as Box<Any>;
202 let a_str = a.to_str();
203 let b_str = b.to_str();
204 assert_eq!(a_str, "Box<Any>");
205 assert_eq!(b_str, "Box<Any>");
208 let b = &Test as &Any;
209 let s = format!("{}", a);
210 assert_eq!(s, "&Any");
211 let s = format!("{}", b);
212 assert_eq!(s, "&Any");
217 fn homura<T: Deref<Target=i32>>(_: T) { }